mesa: Clean up header file inclusion in polygon.h.
[mesa.git] / src / mesa / swrast / s_accum.c
index 64b6d6b84edfce67cf3768069f04766d77ed342f..88d107a17dad3e8bb1ff70a41a9e4b62721b9810 100644 (file)
  */
 
 
-#include "glheader.h"
-#include "context.h"
-#include "macros.h"
-#include "imports.h"
-#include "fbobject.h"
+#include "main/glheader.h"
+#include "main/context.h"
+#include "main/macros.h"
+#include "main/imports.h"
 
 #include "s_accum.h"
 #include "s_context.h"
@@ -38,7 +37,7 @@
 /* XXX this would have to change for accum buffers with more or less
  * than 16 bits per color channel.
  */
-#define ACCUM_SCALE16 32767.0
+#define ACCUM_SCALE16 32767.0F
 
 
 /*
@@ -79,7 +78,7 @@
  * representing the range[-1, 1].
  */
 static void
-rescale_accum( GLcontext *ctx )
+rescale_accum( struct gl_context *ctx )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
    struct gl_renderbuffer *rb
@@ -126,17 +125,15 @@ rescale_accum( GLcontext *ctx )
  * Clear the accumulation Buffer.
  */
 void
-_swrast_clear_accum_buffer( GLcontext *ctx, struct gl_renderbuffer *rb )
+_swrast_clear_accum_buffer( struct gl_context *ctx, struct gl_renderbuffer *rb )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
    GLuint x, y, width, height;
 
-   if (ctx->Visual.accumRedBits == 0) {
-      /* No accumulation buffer! Not an error. */
+   /* No accumulation buffer! Not an error. */
+   if (!rb || !rb->Data)
       return;
-   }
 
-   assert(rb);
    assert(rb->_BaseFormat == GL_RGBA);
    /* add other types in future? */
    assert(rb->DataType == GL_SHORT || rb->DataType == GL_UNSIGNED_SHORT);
@@ -182,7 +179,7 @@ _swrast_clear_accum_buffer( GLcontext *ctx, struct gl_renderbuffer *rb )
 
 
 static void
-accum_add(GLcontext *ctx, GLfloat value,
+accum_add(struct gl_context *ctx, GLfloat value,
           GLint xpos, GLint ypos, GLint width, GLint height )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
@@ -225,7 +222,7 @@ accum_add(GLcontext *ctx, GLfloat value,
 
 
 static void
-accum_mult(GLcontext *ctx, GLfloat mult,
+accum_mult(struct gl_context *ctx, GLfloat mult,
            GLint xpos, GLint ypos, GLint width, GLint height )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
@@ -268,7 +265,7 @@ accum_mult(GLcontext *ctx, GLfloat mult,
 
 
 static void
-accum_accum(GLcontext *ctx, GLfloat value,
+accum_accum(struct gl_context *ctx, GLfloat value,
             GLint xpos, GLint ypos, GLint width, GLint height )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
@@ -307,7 +304,7 @@ accum_accum(GLcontext *ctx, GLfloat value,
 
          /* read colors from color buffer */
          _swrast_read_rgba_span(ctx, ctx->ReadBuffer->_ColorReadBuffer, width,
-                                xpos, ypos + i, rgba);
+                                xpos, ypos + i, CHAN_TYPE, rgba);
 
          /* do accumulation */
          if (swrast->_IntegerAccumMode) {
@@ -344,7 +341,7 @@ accum_accum(GLcontext *ctx, GLfloat value,
 
 
 static void
-accum_load(GLcontext *ctx, GLfloat value,
+accum_load(struct gl_context *ctx, GLfloat value,
            GLint xpos, GLint ypos, GLint width, GLint height )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
@@ -391,7 +388,7 @@ accum_load(GLcontext *ctx, GLfloat value,
 
          /* read colors from color buffer */
          _swrast_read_rgba_span(ctx, ctx->ReadBuffer->_ColorReadBuffer, width,
-                                xpos, ypos + i, rgba);
+                                xpos, ypos + i, CHAN_TYPE, rgba);
 
          /* do load */
          if (swrast->_IntegerAccumMode) {
@@ -426,7 +423,7 @@ accum_load(GLcontext *ctx, GLfloat value,
 
 
 static void
-accum_return(GLcontext *ctx, GLfloat value,
+accum_return(struct gl_context *ctx, GLfloat value,
              GLint xpos, GLint ypos, GLint width, GLint height )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
@@ -434,10 +431,6 @@ accum_return(GLcontext *ctx, GLfloat value,
    struct gl_renderbuffer *accumRb = fb->Attachment[BUFFER_ACCUM].Renderbuffer;
    const GLboolean directAccess
       = (accumRb->GetPointer(ctx, accumRb, 0, 0) != NULL);
-   const GLboolean masking = (!ctx->Color.ColorMask[RCOMP] ||
-                              !ctx->Color.ColorMask[GCOMP] ||
-                              !ctx->Color.ColorMask[BCOMP] ||
-                              !ctx->Color.ColorMask[ACOMP]);
 
    static GLchan multTable[32768];
    static GLfloat prevMult = 0.0;
@@ -472,7 +465,9 @@ accum_return(GLcontext *ctx, GLfloat value,
          SWspan span;
 
          /* init color span */
-         INIT_SPAN(span, GL_BITMAP, width, 0, SPAN_RGBA);
+         INIT_SPAN(span, GL_BITMAP);
+         span.end = width;
+         span.arrayMask = SPAN_RGBA;
          span.x = xpos;
          span.y = ypos + i;
 
@@ -521,10 +516,14 @@ accum_return(GLcontext *ctx, GLfloat value,
          }
 
          /* store colors */
-         for (buffer = 0; buffer < fb->_NumColorDrawBuffers[0]; buffer++) {
-            struct gl_renderbuffer *rb = fb->_ColorDrawBuffers[0][buffer];
+         for (buffer = 0; buffer < fb->_NumColorDrawBuffers; buffer++) {
+            struct gl_renderbuffer *rb = fb->_ColorDrawBuffers[buffer];
+            const GLboolean masking = (!ctx->Color.ColorMask[buffer][RCOMP] ||
+                                       !ctx->Color.ColorMask[buffer][GCOMP] ||
+                                       !ctx->Color.ColorMask[buffer][BCOMP] ||
+                                       !ctx->Color.ColorMask[buffer][ACOMP]);
             if (masking) {
-               _swrast_mask_rgba_span(ctx, rb, &span);
+               _swrast_mask_rgba_span(ctx, rb, &span, buffer);
             }
             rb->PutRow(ctx, rb, width, xpos, ypos + i, span.array->rgba, NULL);
          }
@@ -541,14 +540,12 @@ accum_return(GLcontext *ctx, GLfloat value,
  * Software fallback for glAccum.
  */
 void
-_swrast_Accum( GLcontext *ctx, GLenum op, GLfloat value,
-              GLint xpos, GLint ypos,
-              GLint width, GLint height )
-
+_swrast_Accum(struct gl_context *ctx, GLenum op, GLfloat value)
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
+   GLint xpos, ypos, width, height;
 
-   if (SWRAST_CONTEXT(ctx)->NewState)
+   if (swrast->NewState)
       _swrast_validate_derived( ctx );
 
    if (!ctx->DrawBuffer->Attachment[BUFFER_ACCUM].Renderbuffer) {
@@ -556,7 +553,15 @@ _swrast_Accum( GLcontext *ctx, GLenum op, GLfloat value,
       return;
    }
 
-   RENDER_START(swrast, ctx);
+   swrast_render_start(ctx);
+
+   /* Compute region after calling swrast_render_start() so that we know the
+    * drawbuffer's size/bounds are up to date.
+    */
+   xpos = ctx->DrawBuffer->_Xmin;
+   ypos = ctx->DrawBuffer->_Ymin;
+   width =  ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin;
+   height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin;
 
    switch (op) {
       case GL_ADD:
@@ -585,5 +590,5 @@ _swrast_Accum( GLcontext *ctx, GLenum op, GLfloat value,
          break;
    }
 
-   RENDER_FINISH(swrast, ctx);
+   swrast_render_finish(ctx);
 }