gl: updated glxext.h to version 27
[mesa.git] / src / mesa / main / accum.c
index 74ea4dc629269d31ce618b113810a5003bd76f49..2012d00fd5f14a9d6ce2b7f79b5f0fb7c84bb4d7 100644 (file)
@@ -1,9 +1,8 @@
-
 /*
  * Mesa 3-D graphics library
- * Version:  4.1
+ * Version:  6.5
  *
- * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2005  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
 #include "macros.h"
 #include "state.h"
 #include "mtypes.h"
+#include "main/dispatch.h"
+
+
+#if FEATURE_accum
 
 
 void GLAPIENTRY
@@ -51,41 +54,66 @@ _mesa_ClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
    COPY_4FV( ctx->Accum.ClearColor, tmp );
 }
 
-/* Should really be a driver-supplied function?
- */
-void GLAPIENTRY
+
+static void GLAPIENTRY
 _mesa_Accum( GLenum op, GLfloat value )
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLuint xpos, ypos, width, height;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
-   if (ctx->Visual.accumRedBits == 0 || ctx->DrawBuffer != ctx->ReadBuffer) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glAccum");
+   switch (op) {
+   case GL_ADD:
+   case GL_MULT:
+   case GL_ACCUM:
+   case GL_LOAD:
+   case GL_RETURN:
+      /* OK */
+      break;
+   default:
+      _mesa_error(ctx, GL_INVALID_ENUM, "glAccum(op)");
+      return;
+   }
+
+   if (ctx->DrawBuffer->Visual.haveAccumBuffer == 0) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glAccum(no accum buffer)");
+      return;
+   }
+
+   if (ctx->DrawBuffer != ctx->ReadBuffer) {
+      /* See GLX_SGI_make_current_read or WGL_ARB_make_current_read,
+       * or GL_EXT_framebuffer_blit.
+       */
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glAccum(different read/draw buffers)");
       return;
    }
 
    if (ctx->NewState)
-      _mesa_update_state( ctx );
-
-   /* Determine region to operate upon. */
-   if (ctx->Scissor.Enabled) {
-      xpos = ctx->Scissor.X;
-      ypos = ctx->Scissor.Y;
-      width = ctx->Scissor.Width;
-      height = ctx->Scissor.Height;
+      _mesa_update_state(ctx);
+
+   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
+                  "glAccum(incomplete framebuffer)");
+      return;
    }
-   else {
-      /* whole window */
-      xpos = 0;
-      ypos = 0;
-      width = ctx->DrawBuffer->Width;
-      height = ctx->DrawBuffer->Height;
+
+   if (ctx->RenderMode == GL_RENDER) {
+      ctx->Driver.Accum(ctx, op, value);
    }
+}
 
-   ctx->Driver.Accum( ctx, op, value, xpos, ypos, width, height );
+
+void
+_mesa_init_accum_dispatch(struct _glapi_table *disp)
+{
+   SET_Accum(disp, _mesa_Accum);
+   SET_ClearAccum(disp, _mesa_ClearAccum);
 }
 
+
+#endif /* FEATURE_accum */
+
+
 void 
 _mesa_init_accum( GLcontext *ctx )
 {