simplify, clean-up texel addressing macros
[mesa.git] / src / mesa / main / get.c
index d9d6a568f164044469dc0fc3482968113f2e8b76..bfeb1d6d2a232e9cc02cc2446bd2df84056a1da2 100644 (file)
@@ -7,6 +7,7 @@
 #include "context.h"
 #include "enable.h"
 #include "extensions.h"
+#include "fbobject.h"
 #include "get.h"
 #include "macros.h"
 #include "mtypes.h"
@@ -90,16 +91,16 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
 
    switch (pname) {
       case GL_ACCUM_RED_BITS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.accumRedBits);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.accumRedBits);
          break;
       case GL_ACCUM_GREEN_BITS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.accumGreenBits);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.accumGreenBits);
          break;
       case GL_ACCUM_BLUE_BITS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.accumBlueBits);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.accumBlueBits);
          break;
       case GL_ACCUM_ALPHA_BITS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.accumAlphaBits);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.accumAlphaBits);
          break;
       case GL_ACCUM_CLEAR_VALUE:
          params[0] = FLOAT_TO_BOOLEAN(ctx->Accum.ClearColor[0]);
@@ -111,7 +112,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = FLOAT_TO_BOOLEAN(ctx->Pixel.AlphaBias);
          break;
       case GL_ALPHA_BITS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.alphaBits);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.alphaBits);
          break;
       case GL_ALPHA_SCALE:
          params[0] = FLOAT_TO_BOOLEAN(ctx->Pixel.AlphaScale);
@@ -132,7 +133,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = ctx->Eval.AutoNormal;
          break;
       case GL_AUX_BUFFERS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.numAuxBuffers);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.numAuxBuffers);
          break;
       case GL_BLEND:
          params[0] = ctx->Color.BlendEnabled;
@@ -171,7 +172,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = FLOAT_TO_BOOLEAN(ctx->Pixel.BlueBias);
          break;
       case GL_BLUE_BITS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.blueBits);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.blueBits);
          break;
       case GL_BLUE_SCALE:
          params[0] = FLOAT_TO_BOOLEAN(ctx->Pixel.BlueScale);
@@ -290,7 +291,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = FLOAT_TO_BOOLEAN(ctx->Pixel.DepthBias);
          break;
       case GL_DEPTH_BITS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.depthBits);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.depthBits);
          break;
       case GL_DEPTH_CLEAR_VALUE:
          params[0] = FLOAT_TO_BOOLEAN(ctx->Depth.Clear);
@@ -315,7 +316,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = ctx->Color.DitherFlag;
          break;
       case GL_DOUBLEBUFFER:
-         params[0] = ctx->Visual.doubleBufferMode;
+         params[0] = ctx->DrawBuffer->Visual.doubleBufferMode;
          break;
       case GL_DRAW_BUFFER:
          params[0] = ENUM_TO_BOOLEAN(ctx->Color.DrawBuffer[0]);
@@ -366,19 +367,19 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = FLOAT_TO_BOOLEAN(ctx->Pixel.GreenBias);
          break;
       case GL_GREEN_BITS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.greenBits);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.greenBits);
          break;
       case GL_GREEN_SCALE:
          params[0] = FLOAT_TO_BOOLEAN(ctx->Pixel.GreenScale);
          break;
       case GL_INDEX_BITS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.indexBits);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.indexBits);
          break;
       case GL_INDEX_CLEAR_VALUE:
          params[0] = INT_TO_BOOLEAN(ctx->Color.ClearIndex);
          break;
       case GL_INDEX_MODE:
-         params[0] = !ctx->Visual.rgbMode;
+         params[0] = !ctx->DrawBuffer->Visual.rgbMode;
          break;
       case GL_INDEX_OFFSET:
          params[0] = INT_TO_BOOLEAN(ctx->Pixel.IndexOffset);
@@ -793,7 +794,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = FLOAT_TO_BOOLEAN(ctx->Pixel.RedBias);
          break;
       case GL_RED_BITS:
-         params[0] = INT_TO_BOOLEAN( ctx->Visual.redBits );
+         params[0] = INT_TO_BOOLEAN( ctx->DrawBuffer->Visual.redBits );
          break;
       case GL_RED_SCALE:
          params[0] = FLOAT_TO_BOOLEAN(ctx->Pixel.RedScale);
@@ -805,7 +806,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = ctx->Transform.RescaleNormals;
          break;
       case GL_RGBA_MODE:
-         params[0] = ctx->Visual.rgbMode;
+         params[0] = ctx->DrawBuffer->Visual.rgbMode;
          break;
       case GL_SCISSOR_BOX:
          params[0] = INT_TO_BOOLEAN(ctx->Scissor.X);
@@ -826,7 +827,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = ctx->Texture.SharedPalette;
          break;
       case GL_STENCIL_BITS:
-         params[0] = INT_TO_BOOLEAN(ctx->Visual.stencilBits);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.stencilBits);
          break;
       case GL_STENCIL_CLEAR_VALUE:
          params[0] = INT_TO_BOOLEAN(ctx->Stencil.Clear);
@@ -856,7 +857,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = INT_TO_BOOLEAN(ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace]);
          break;
       case GL_STEREO:
-         params[0] = ctx->Visual.stereoMode;
+         params[0] = ctx->DrawBuffer->Visual.stereoMode;
          break;
       case GL_SUBPIXEL_BITS:
          params[0] = INT_TO_BOOLEAN(ctx->Const.SubPixelBits);
@@ -1081,8 +1082,9 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          {
          GLint formats[100];
          GLuint i, n = _mesa_get_compressed_formats(ctx, formats);
+         ASSERT(n <= 100);
          for (i = 0; i < n; i++)
-            params[i] = ENUM_TO_BOOLEAN(formats[i]);
+            params[i] = ENUM_TO_INT(formats[i]);
          }
          break;
       case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT:
@@ -1184,6 +1186,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
       case GL_OCCLUSION_TEST_RESULT_HP:
          CHECK_EXTENSION_B(HP_occlusion_test, pname);
          {
+         FLUSH_VERTICES(ctx, _NEW_DEPTH);
          if (ctx->Depth.OcclusionTest)
             params[0] = ctx->OcclusionResult;
          else
@@ -1412,11 +1415,11 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          break;
       case GL_SAMPLE_BUFFERS_ARB:
          CHECK_EXTENSION_B(ARB_multisample, pname);
-         params[0] = INT_TO_BOOLEAN(0);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.sampleBuffers);
          break;
       case GL_SAMPLES_ARB:
          CHECK_EXTENSION_B(ARB_multisample, pname);
-         params[0] = INT_TO_BOOLEAN(0);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Visual.samples);
          break;
       case GL_RASTER_POSITION_UNCLIPPED_IBM:
          CHECK_EXTENSION_B(IBM_rasterpos_clip, pname);
@@ -1634,7 +1637,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          break;
       case GL_FRAGMENT_PROGRAM_BINDING_NV:
          CHECK_EXTENSION_B(NV_fragment_program, pname);
-         params[0] = INT_TO_BOOLEAN(ctx->VertexProgram.Current ? ctx->VertexProgram.Current->Base.Id : 0);
+         params[0] = INT_TO_BOOLEAN(ctx->FragmentProgram.Current ? ctx->FragmentProgram.Current->Base.Id : 0);
          break;
       case GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV:
          CHECK_EXTENSION_B(NV_fragment_program, pname);
@@ -1873,6 +1876,46 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
       case GL_STENCIL_BACK_PASS_DEPTH_PASS:
          params[0] = ENUM_TO_BOOLEAN(ctx->Stencil.ZPassFunc[1]);
          break;
+      case GL_FRAMEBUFFER_BINDING_EXT:
+         CHECK_EXTENSION_B(EXT_framebuffer_object, pname);
+         params[0] = INT_TO_BOOLEAN(ctx->DrawBuffer->Name);
+         break;
+      case GL_RENDERBUFFER_BINDING_EXT:
+         CHECK_EXTENSION_B(EXT_framebuffer_object, pname);
+         params[0] = INT_TO_BOOLEAN(ctx->CurrentRenderbuffer ? ctx->CurrentRenderbuffer->Name : 0);
+         break;
+      case GL_MAX_COLOR_ATTACHMENTS_EXT:
+         CHECK_EXTENSION_B(EXT_framebuffer_object, pname);
+         params[0] = INT_TO_BOOLEAN(ctx->Const.MaxColorAttachments);
+         break;
+      case GL_MAX_RENDERBUFFER_SIZE_EXT:
+         CHECK_EXTENSION_B(EXT_framebuffer_object, pname);
+         params[0] = INT_TO_BOOLEAN(ctx->Const.MaxRenderbufferSize);
+         break;
+      case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB:
+         CHECK_EXTENSION_B(ARB_fragment_shader, pname);
+         params[0] = INT_TO_BOOLEAN(MAX_FRAGMENT_UNIFORM_COMPONENTS);
+         break;
+      case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB:
+         CHECK_EXTENSION_B(ARB_fragment_shader, pname);
+         params[0] = ENUM_TO_BOOLEAN(ctx->Hint.FragmentShaderDerivative);
+         break;
+      case GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB:
+         CHECK_EXTENSION_B(ARB_vertex_shader, pname);
+         params[0] = INT_TO_BOOLEAN(MAX_VERTEX_UNIFORM_COMPONENTS);
+         break;
+      case GL_MAX_VARYING_FLOATS_ARB:
+         CHECK_EXTENSION_B(ARB_vertex_shader, pname);
+         params[0] = INT_TO_BOOLEAN(MAX_VARYING_FLOATS);
+         break;
+      case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB:
+         CHECK_EXTENSION_B(ARB_vertex_shader, pname);
+         params[0] = INT_TO_BOOLEAN(MAX_VERTEX_TEXTURE_IMAGE_UNITS);
+         break;
+      case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB:
+         CHECK_EXTENSION_B(ARB_vertex_shader, pname);
+         params[0] = INT_TO_BOOLEAN(MAX_COMBINED_TEXTURE_IMAGE_UNITS);
+         break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetBooleanv(pname=0x%x)", pname);
    }
@@ -1893,16 +1936,16 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
 
    switch (pname) {
       case GL_ACCUM_RED_BITS:
-         params[0] = (GLfloat)(ctx->Visual.accumRedBits);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.accumRedBits);
          break;
       case GL_ACCUM_GREEN_BITS:
-         params[0] = (GLfloat)(ctx->Visual.accumGreenBits);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.accumGreenBits);
          break;
       case GL_ACCUM_BLUE_BITS:
-         params[0] = (GLfloat)(ctx->Visual.accumBlueBits);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.accumBlueBits);
          break;
       case GL_ACCUM_ALPHA_BITS:
-         params[0] = (GLfloat)(ctx->Visual.accumAlphaBits);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.accumAlphaBits);
          break;
       case GL_ACCUM_CLEAR_VALUE:
          params[0] = ctx->Accum.ClearColor[0];
@@ -1914,7 +1957,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = ctx->Pixel.AlphaBias;
          break;
       case GL_ALPHA_BITS:
-         params[0] = (GLfloat)(ctx->Visual.alphaBits);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.alphaBits);
          break;
       case GL_ALPHA_SCALE:
          params[0] = ctx->Pixel.AlphaScale;
@@ -1935,7 +1978,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = BOOLEAN_TO_FLOAT(ctx->Eval.AutoNormal);
          break;
       case GL_AUX_BUFFERS:
-         params[0] = (GLfloat)(ctx->Visual.numAuxBuffers);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.numAuxBuffers);
          break;
       case GL_BLEND:
          params[0] = BOOLEAN_TO_FLOAT(ctx->Color.BlendEnabled);
@@ -1974,7 +2017,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = ctx->Pixel.BlueBias;
          break;
       case GL_BLUE_BITS:
-         params[0] = (GLfloat)(ctx->Visual.blueBits);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.blueBits);
          break;
       case GL_BLUE_SCALE:
          params[0] = ctx->Pixel.BlueScale;
@@ -2093,7 +2136,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = ctx->Pixel.DepthBias;
          break;
       case GL_DEPTH_BITS:
-         params[0] = (GLfloat)(ctx->Visual.depthBits);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.depthBits);
          break;
       case GL_DEPTH_CLEAR_VALUE:
          params[0] = ctx->Depth.Clear;
@@ -2118,7 +2161,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = BOOLEAN_TO_FLOAT(ctx->Color.DitherFlag);
          break;
       case GL_DOUBLEBUFFER:
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Visual.doubleBufferMode);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->DrawBuffer->Visual.doubleBufferMode);
          break;
       case GL_DRAW_BUFFER:
          params[0] = ENUM_TO_FLOAT(ctx->Color.DrawBuffer[0]);
@@ -2169,19 +2212,19 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = ctx->Pixel.GreenBias;
          break;
       case GL_GREEN_BITS:
-         params[0] = (GLfloat)(ctx->Visual.greenBits);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.greenBits);
          break;
       case GL_GREEN_SCALE:
          params[0] = ctx->Pixel.GreenScale;
          break;
       case GL_INDEX_BITS:
-         params[0] = (GLfloat)(ctx->Visual.indexBits);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.indexBits);
          break;
       case GL_INDEX_CLEAR_VALUE:
          params[0] = (GLfloat)(ctx->Color.ClearIndex);
          break;
       case GL_INDEX_MODE:
-         params[0] = BOOLEAN_TO_FLOAT(!ctx->Visual.rgbMode);
+         params[0] = BOOLEAN_TO_FLOAT(!ctx->DrawBuffer->Visual.rgbMode);
          break;
       case GL_INDEX_OFFSET:
          params[0] = (GLfloat)(ctx->Pixel.IndexOffset);
@@ -2596,7 +2639,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = ctx->Pixel.RedBias;
          break;
       case GL_RED_BITS:
-         params[0] = (GLfloat)( ctx->Visual.redBits );
+         params[0] = (GLfloat)( ctx->DrawBuffer->Visual.redBits );
          break;
       case GL_RED_SCALE:
          params[0] = ctx->Pixel.RedScale;
@@ -2608,7 +2651,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = BOOLEAN_TO_FLOAT(ctx->Transform.RescaleNormals);
          break;
       case GL_RGBA_MODE:
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Visual.rgbMode);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->DrawBuffer->Visual.rgbMode);
          break;
       case GL_SCISSOR_BOX:
          params[0] = (GLfloat)(ctx->Scissor.X);
@@ -2629,7 +2672,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = BOOLEAN_TO_FLOAT(ctx->Texture.SharedPalette);
          break;
       case GL_STENCIL_BITS:
-         params[0] = (GLfloat)(ctx->Visual.stencilBits);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.stencilBits);
          break;
       case GL_STENCIL_CLEAR_VALUE:
          params[0] = (GLfloat)(ctx->Stencil.Clear);
@@ -2659,7 +2702,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = (GLfloat)(ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace]);
          break;
       case GL_STEREO:
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Visual.stereoMode);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->DrawBuffer->Visual.stereoMode);
          break;
       case GL_SUBPIXEL_BITS:
          params[0] = (GLfloat)(ctx->Const.SubPixelBits);
@@ -2884,8 +2927,9 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          {
          GLint formats[100];
          GLuint i, n = _mesa_get_compressed_formats(ctx, formats);
+         ASSERT(n <= 100);
          for (i = 0; i < n; i++)
-            params[i] = ENUM_TO_BOOLEAN(formats[i]);
+            params[i] = ENUM_TO_INT(formats[i]);
          }
          break;
       case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT:
@@ -2987,6 +3031,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
       case GL_OCCLUSION_TEST_RESULT_HP:
          CHECK_EXTENSION_F(HP_occlusion_test, pname);
          {
+         FLUSH_VERTICES(ctx, _NEW_DEPTH);
          if (ctx->Depth.OcclusionTest)
             params[0] = ctx->OcclusionResult;
          else
@@ -3215,11 +3260,11 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          break;
       case GL_SAMPLE_BUFFERS_ARB:
          CHECK_EXTENSION_F(ARB_multisample, pname);
-         params[0] = (GLfloat)(0);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.sampleBuffers);
          break;
       case GL_SAMPLES_ARB:
          CHECK_EXTENSION_F(ARB_multisample, pname);
-         params[0] = (GLfloat)(0);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Visual.samples);
          break;
       case GL_RASTER_POSITION_UNCLIPPED_IBM:
          CHECK_EXTENSION_F(IBM_rasterpos_clip, pname);
@@ -3437,7 +3482,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          break;
       case GL_FRAGMENT_PROGRAM_BINDING_NV:
          CHECK_EXTENSION_F(NV_fragment_program, pname);
-         params[0] = (GLfloat)(ctx->VertexProgram.Current ? ctx->VertexProgram.Current->Base.Id : 0);
+         params[0] = (GLfloat)(ctx->FragmentProgram.Current ? ctx->FragmentProgram.Current->Base.Id : 0);
          break;
       case GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV:
          CHECK_EXTENSION_F(NV_fragment_program, pname);
@@ -3676,6 +3721,46 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
       case GL_STENCIL_BACK_PASS_DEPTH_PASS:
          params[0] = ENUM_TO_FLOAT(ctx->Stencil.ZPassFunc[1]);
          break;
+      case GL_FRAMEBUFFER_BINDING_EXT:
+         CHECK_EXTENSION_F(EXT_framebuffer_object, pname);
+         params[0] = (GLfloat)(ctx->DrawBuffer->Name);
+         break;
+      case GL_RENDERBUFFER_BINDING_EXT:
+         CHECK_EXTENSION_F(EXT_framebuffer_object, pname);
+         params[0] = (GLfloat)(ctx->CurrentRenderbuffer ? ctx->CurrentRenderbuffer->Name : 0);
+         break;
+      case GL_MAX_COLOR_ATTACHMENTS_EXT:
+         CHECK_EXTENSION_F(EXT_framebuffer_object, pname);
+         params[0] = (GLfloat)(ctx->Const.MaxColorAttachments);
+         break;
+      case GL_MAX_RENDERBUFFER_SIZE_EXT:
+         CHECK_EXTENSION_F(EXT_framebuffer_object, pname);
+         params[0] = (GLfloat)(ctx->Const.MaxRenderbufferSize);
+         break;
+      case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB:
+         CHECK_EXTENSION_F(ARB_fragment_shader, pname);
+         params[0] = (GLfloat)(MAX_FRAGMENT_UNIFORM_COMPONENTS);
+         break;
+      case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB:
+         CHECK_EXTENSION_F(ARB_fragment_shader, pname);
+         params[0] = ENUM_TO_FLOAT(ctx->Hint.FragmentShaderDerivative);
+         break;
+      case GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB:
+         CHECK_EXTENSION_F(ARB_vertex_shader, pname);
+         params[0] = (GLfloat)(MAX_VERTEX_UNIFORM_COMPONENTS);
+         break;
+      case GL_MAX_VARYING_FLOATS_ARB:
+         CHECK_EXTENSION_F(ARB_vertex_shader, pname);
+         params[0] = (GLfloat)(MAX_VARYING_FLOATS);
+         break;
+      case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB:
+         CHECK_EXTENSION_F(ARB_vertex_shader, pname);
+         params[0] = (GLfloat)(MAX_VERTEX_TEXTURE_IMAGE_UNITS);
+         break;
+      case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB:
+         CHECK_EXTENSION_F(ARB_vertex_shader, pname);
+         params[0] = (GLfloat)(MAX_COMBINED_TEXTURE_IMAGE_UNITS);
+         break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetFloatv(pname=0x%x)", pname);
    }
@@ -3696,16 +3781,16 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
 
    switch (pname) {
       case GL_ACCUM_RED_BITS:
-         params[0] = ctx->Visual.accumRedBits;
+         params[0] = ctx->DrawBuffer->Visual.accumRedBits;
          break;
       case GL_ACCUM_GREEN_BITS:
-         params[0] = ctx->Visual.accumGreenBits;
+         params[0] = ctx->DrawBuffer->Visual.accumGreenBits;
          break;
       case GL_ACCUM_BLUE_BITS:
-         params[0] = ctx->Visual.accumBlueBits;
+         params[0] = ctx->DrawBuffer->Visual.accumBlueBits;
          break;
       case GL_ACCUM_ALPHA_BITS:
-         params[0] = ctx->Visual.accumAlphaBits;
+         params[0] = ctx->DrawBuffer->Visual.accumAlphaBits;
          break;
       case GL_ACCUM_CLEAR_VALUE:
          params[0] = FLOAT_TO_INT(ctx->Accum.ClearColor[0]);
@@ -3717,7 +3802,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = IROUND(ctx->Pixel.AlphaBias);
          break;
       case GL_ALPHA_BITS:
-         params[0] = ctx->Visual.alphaBits;
+         params[0] = ctx->DrawBuffer->Visual.alphaBits;
          break;
       case GL_ALPHA_SCALE:
          params[0] = IROUND(ctx->Pixel.AlphaScale);
@@ -3738,7 +3823,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = BOOLEAN_TO_INT(ctx->Eval.AutoNormal);
          break;
       case GL_AUX_BUFFERS:
-         params[0] = ctx->Visual.numAuxBuffers;
+         params[0] = ctx->DrawBuffer->Visual.numAuxBuffers;
          break;
       case GL_BLEND:
          params[0] = BOOLEAN_TO_INT(ctx->Color.BlendEnabled);
@@ -3777,7 +3862,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = IROUND(ctx->Pixel.BlueBias);
          break;
       case GL_BLUE_BITS:
-         params[0] = ctx->Visual.blueBits;
+         params[0] = ctx->DrawBuffer->Visual.blueBits;
          break;
       case GL_BLUE_SCALE:
          params[0] = IROUND(ctx->Pixel.BlueScale);
@@ -3896,7 +3981,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = IROUND(ctx->Pixel.DepthBias);
          break;
       case GL_DEPTH_BITS:
-         params[0] = ctx->Visual.depthBits;
+         params[0] = ctx->DrawBuffer->Visual.depthBits;
          break;
       case GL_DEPTH_CLEAR_VALUE:
          params[0] = IROUND(ctx->Depth.Clear);
@@ -3921,7 +4006,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = BOOLEAN_TO_INT(ctx->Color.DitherFlag);
          break;
       case GL_DOUBLEBUFFER:
-         params[0] = BOOLEAN_TO_INT(ctx->Visual.doubleBufferMode);
+         params[0] = BOOLEAN_TO_INT(ctx->DrawBuffer->Visual.doubleBufferMode);
          break;
       case GL_DRAW_BUFFER:
          params[0] = ENUM_TO_INT(ctx->Color.DrawBuffer[0]);
@@ -3972,19 +4057,19 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = IROUND(ctx->Pixel.GreenBias);
          break;
       case GL_GREEN_BITS:
-         params[0] = ctx->Visual.greenBits;
+         params[0] = ctx->DrawBuffer->Visual.greenBits;
          break;
       case GL_GREEN_SCALE:
          params[0] = IROUND(ctx->Pixel.GreenScale);
          break;
       case GL_INDEX_BITS:
-         params[0] = ctx->Visual.indexBits;
+         params[0] = ctx->DrawBuffer->Visual.indexBits;
          break;
       case GL_INDEX_CLEAR_VALUE:
          params[0] = ctx->Color.ClearIndex;
          break;
       case GL_INDEX_MODE:
-         params[0] = BOOLEAN_TO_INT(!ctx->Visual.rgbMode);
+         params[0] = BOOLEAN_TO_INT(!ctx->DrawBuffer->Visual.rgbMode);
          break;
       case GL_INDEX_OFFSET:
          params[0] = ctx->Pixel.IndexOffset;
@@ -4399,7 +4484,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = IROUND(ctx->Pixel.RedBias);
          break;
       case GL_RED_BITS:
-         params[0] =  ctx->Visual.redBits ;
+         params[0] =  ctx->DrawBuffer->Visual.redBits ;
          break;
       case GL_RED_SCALE:
          params[0] = IROUND(ctx->Pixel.RedScale);
@@ -4411,7 +4496,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = BOOLEAN_TO_INT(ctx->Transform.RescaleNormals);
          break;
       case GL_RGBA_MODE:
-         params[0] = BOOLEAN_TO_INT(ctx->Visual.rgbMode);
+         params[0] = BOOLEAN_TO_INT(ctx->DrawBuffer->Visual.rgbMode);
          break;
       case GL_SCISSOR_BOX:
          params[0] = ctx->Scissor.X;
@@ -4432,7 +4517,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = BOOLEAN_TO_INT(ctx->Texture.SharedPalette);
          break;
       case GL_STENCIL_BITS:
-         params[0] = ctx->Visual.stencilBits;
+         params[0] = ctx->DrawBuffer->Visual.stencilBits;
          break;
       case GL_STENCIL_CLEAR_VALUE:
          params[0] = ctx->Stencil.Clear;
@@ -4462,7 +4547,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace];
          break;
       case GL_STEREO:
-         params[0] = BOOLEAN_TO_INT(ctx->Visual.stereoMode);
+         params[0] = BOOLEAN_TO_INT(ctx->DrawBuffer->Visual.stereoMode);
          break;
       case GL_SUBPIXEL_BITS:
          params[0] = ctx->Const.SubPixelBits;
@@ -4687,8 +4772,9 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          {
          GLint formats[100];
          GLuint i, n = _mesa_get_compressed_formats(ctx, formats);
+         ASSERT(n <= 100);
          for (i = 0; i < n; i++)
-            params[i] = ENUM_TO_BOOLEAN(formats[i]);
+            params[i] = ENUM_TO_INT(formats[i]);
          }
          break;
       case GL_ARRAY_ELEMENT_LOCK_FIRST_EXT:
@@ -4790,6 +4876,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
       case GL_OCCLUSION_TEST_RESULT_HP:
          CHECK_EXTENSION_I(HP_occlusion_test, pname);
          {
+         FLUSH_VERTICES(ctx, _NEW_DEPTH);
          if (ctx->Depth.OcclusionTest)
             params[0] = ctx->OcclusionResult;
          else
@@ -5018,11 +5105,11 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          break;
       case GL_SAMPLE_BUFFERS_ARB:
          CHECK_EXTENSION_I(ARB_multisample, pname);
-         params[0] = 0;
+         params[0] = ctx->DrawBuffer->Visual.sampleBuffers;
          break;
       case GL_SAMPLES_ARB:
          CHECK_EXTENSION_I(ARB_multisample, pname);
-         params[0] = 0;
+         params[0] = ctx->DrawBuffer->Visual.samples;
          break;
       case GL_RASTER_POSITION_UNCLIPPED_IBM:
          CHECK_EXTENSION_I(IBM_rasterpos_clip, pname);
@@ -5240,7 +5327,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          break;
       case GL_FRAGMENT_PROGRAM_BINDING_NV:
          CHECK_EXTENSION_I(NV_fragment_program, pname);
-         params[0] = ctx->VertexProgram.Current ? ctx->VertexProgram.Current->Base.Id : 0;
+         params[0] = ctx->FragmentProgram.Current ? ctx->FragmentProgram.Current->Base.Id : 0;
          break;
       case GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV:
          CHECK_EXTENSION_I(NV_fragment_program, pname);
@@ -5479,6 +5566,46 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
       case GL_STENCIL_BACK_PASS_DEPTH_PASS:
          params[0] = ENUM_TO_INT(ctx->Stencil.ZPassFunc[1]);
          break;
+      case GL_FRAMEBUFFER_BINDING_EXT:
+         CHECK_EXTENSION_I(EXT_framebuffer_object, pname);
+         params[0] = ctx->DrawBuffer->Name;
+         break;
+      case GL_RENDERBUFFER_BINDING_EXT:
+         CHECK_EXTENSION_I(EXT_framebuffer_object, pname);
+         params[0] = ctx->CurrentRenderbuffer ? ctx->CurrentRenderbuffer->Name : 0;
+         break;
+      case GL_MAX_COLOR_ATTACHMENTS_EXT:
+         CHECK_EXTENSION_I(EXT_framebuffer_object, pname);
+         params[0] = ctx->Const.MaxColorAttachments;
+         break;
+      case GL_MAX_RENDERBUFFER_SIZE_EXT:
+         CHECK_EXTENSION_I(EXT_framebuffer_object, pname);
+         params[0] = ctx->Const.MaxRenderbufferSize;
+         break;
+      case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB:
+         CHECK_EXTENSION_I(ARB_fragment_shader, pname);
+         params[0] = MAX_FRAGMENT_UNIFORM_COMPONENTS;
+         break;
+      case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB:
+         CHECK_EXTENSION_I(ARB_fragment_shader, pname);
+         params[0] = ENUM_TO_INT(ctx->Hint.FragmentShaderDerivative);
+         break;
+      case GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB:
+         CHECK_EXTENSION_I(ARB_vertex_shader, pname);
+         params[0] = MAX_VERTEX_UNIFORM_COMPONENTS;
+         break;
+      case GL_MAX_VARYING_FLOATS_ARB:
+         CHECK_EXTENSION_I(ARB_vertex_shader, pname);
+         params[0] = MAX_VARYING_FLOATS;
+         break;
+      case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB:
+         CHECK_EXTENSION_I(ARB_vertex_shader, pname);
+         params[0] = MAX_VERTEX_TEXTURE_IMAGE_UNITS;
+         break;
+      case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB:
+         CHECK_EXTENSION_I(ARB_vertex_shader, pname);
+         params[0] = MAX_COMBINED_TEXTURE_IMAGE_UNITS;
+         break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetIntegerv(pname=0x%x)", pname);
    }
@@ -5503,7 +5630,7 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
 
    _mesa_GetFloatv(pname, values);
    
-   for (i = 0; values[i] != magic && i < 16; i++)
+   for (i = 0; i < 16 && values[i] != magic; i++)
       params[i] = (GLdouble) values[i];
 }