Merge branch 'mesa_7_5_branch' into dlist-statechange-shortcircuit
[mesa.git] / src / mesa / main / accum.c
index 315bd33b61da9c01fef9525eda34862f00353d91..2345695f3c6fb43bd94be3e50d527c89ba13a345 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  5.1
+ * Version:  6.5
  *
- * Copyright (C) 1999-2003  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"),
@@ -55,40 +55,51 @@ 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->NewState)
-      _mesa_update_state( ctx );
-
-   if (ctx->RenderMode != GL_RENDER) {
-      /* no-op */
+   if (ctx->DrawBuffer->Visual.haveAccumBuffer == 0) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glAccum(no accum buffer)");
       return;
    }
 
-   /* 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;
+   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;
    }
-   else {
-      /* whole window */
-      xpos = 0;
-      ypos = 0;
-      width = ctx->DrawBuffer->Width;
-      height = ctx->DrawBuffer->Height;
+
+   if (ctx->NewState)
+      _mesa_update_state(ctx);
+
+   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
+                  "glAccum(incomplete framebuffer)");
+      return;
    }
 
-   ctx->Driver.Accum( ctx, op, value, xpos, ypos, width, height );
+   if (ctx->RenderMode == GL_RENDER) {
+      ctx->Driver.Accum(ctx, op, value);
+   }
 }
 
+
+
 void 
 _mesa_init_accum( GLcontext *ctx )
 {