1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  6.5
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Functions for allocating/managing software-based renderbuffers.
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Also, routines for reading/writing software-based renderbuffer data as
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ubytes, ushorts, uints, etc.
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/fbobject.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/formats.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/renderbuffer.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_context.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_renderbuffer.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a software fallback for the gl_renderbuffer->AllocStorage
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * function.
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Device drivers will typically override this function for the buffers
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * which it manages (typically color buffers, Z and stencil).
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Other buffers (like software accumulation and aux buffers) which the driver
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * doesn't manage can be handled with this function.
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This one multi-purpose function can allocate stencil, depth, accum, color
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * or color-index buffers!
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLenum internalFormat,
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          GLuint width, GLuint height)
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint bpp;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (internalFormat) {
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB:
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_R3_G3_B2:
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB4:
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB5:
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB8:
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB10:
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB12:
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB16:
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->Format = MESA_FORMAT_RGB888;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA:
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA2:
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA4:
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB5_A1:
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA8:
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 1
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGB10_A2:
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA12:
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (_mesa_little_endian())
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rb->Format = MESA_FORMAT_RGBA8888_REV;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rb->Format = MESA_FORMAT_RGBA8888;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA16:
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_RGBA16_SNORM:
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* for accum buffer */
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->Format = MESA_FORMAT_SIGNED_RGBA_16;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_STENCIL_INDEX:
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_STENCIL_INDEX1_EXT:
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_STENCIL_INDEX4_EXT:
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_STENCIL_INDEX8_EXT:
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_STENCIL_INDEX16_EXT:
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->Format = MESA_FORMAT_S8;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_COMPONENT:
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_COMPONENT16:
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->Format = MESA_FORMAT_Z16;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_COMPONENT24:
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->Format = MESA_FORMAT_X8_Z24;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_COMPONENT32:
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->Format = MESA_FORMAT_Z32;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH_STENCIL_EXT:
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DEPTH24_STENCIL8_EXT:
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->Format = MESA_FORMAT_Z24_S8;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* unsupported format */
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bpp = _mesa_get_format_bytes(rb->Format);
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* free old buffer storage */
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (srb->Buffer) {
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(srb->Buffer);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srb->Buffer = NULL;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   srb->RowStride = width * bpp;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width > 0 && height > 0) {
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* allocate new buffer storage */
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srb->Buffer = malloc(srb->RowStride * height);
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (srb->Buffer == NULL) {
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rb->Width = 0;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rb->Height = 0;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_OUT_OF_MEMORY,
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     "software renderbuffer allocation (%d x %d x %d)",
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     width, height, bpp);
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb->Width = width;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb->Height = height;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb->_BaseFormat = _mesa_base_fbo_format(ctx, internalFormat);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rb->Name == 0 &&
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       internalFormat == GL_RGBA16_SNORM &&
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       rb->_BaseFormat == 0) {
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* NOTE: This is a special case just for accumulation buffers.
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * This is a very limited use case- there's no snorm texturing or
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * rendering going on.
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->_BaseFormat = GL_RGBA;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* the internalFormat should have been error checked long ago */
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(rb->_BaseFormat);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via gl_renderbuffer::Delete()
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsoft_renderbuffer_delete(struct gl_context *ctx, struct gl_renderbuffer *rb)
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(srb->Buffer);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   srb->Buffer = NULL;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_delete_renderbuffer(ctx, rb);
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_map_soft_renderbuffer(struct gl_context *ctx,
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              struct gl_renderbuffer *rb,
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLuint x, GLuint y, GLuint w, GLuint h,
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLbitfield mode,
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLubyte **out_map,
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              GLint *out_stride)
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte *map = srb->Buffer;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int cpp = _mesa_get_format_bytes(rb->Format);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int stride = rb->Width * cpp;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!map) {
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *out_map = NULL;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *out_stride = 0;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map += y * stride;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   map += x * cpp;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *out_map = map;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *out_stride = stride;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_unmap_soft_renderbuffer(struct gl_context *ctx,
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                struct gl_renderbuffer *rb)
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate a software-based renderbuffer.  This is called via the
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ctx->Driver.NewRenderbuffer() function when the user creates a new
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * renderbuffer.
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This would not be used for hardware-based renderbuffers.
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_renderbuffer *
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_new_soft_renderbuffer(struct gl_context *ctx, GLuint name)
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct swrast_renderbuffer *srb = CALLOC_STRUCT(swrast_renderbuffer);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (srb) {
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_init_renderbuffer(&srb->Base, name);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srb->Base.AllocStorage = soft_renderbuffer_storage;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srb->Base.Delete = soft_renderbuffer_delete;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &srb->Base;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add software-based color renderbuffers to the given framebuffer.
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a helper routine for device drivers when creating a
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * window system framebuffer (not a user-created render/framebuffer).
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Once this function is called, you can basically forget about this
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * renderbuffer; core Mesa will handle all the buffer management and
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rendering!
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgadd_color_renderbuffers(struct gl_context *ctx, struct gl_framebuffer *fb,
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLuint rgbBits, GLuint alphaBits,
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLboolean frontLeft, GLboolean backLeft,
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        GLboolean frontRight, GLboolean backRight)
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gl_buffer_index b;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rgbBits > 16 || alphaBits > 16) {
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx,
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    "Unsupported bit depth in add_color_renderbuffers");
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(MAX_COLOR_ATTACHMENTS >= 4);
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (b = BUFFER_FRONT_LEFT; b <= BUFFER_BACK_RIGHT; b++) {
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_renderbuffer *rb;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (b == BUFFER_FRONT_LEFT && !frontLeft)
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (b == BUFFER_BACK_LEFT && !backLeft)
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (b == BUFFER_FRONT_RIGHT && !frontRight)
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (b == BUFFER_BACK_RIGHT && !backRight)
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(fb->Attachment[b].Renderbuffer == NULL);
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb = ctx->Driver.NewRenderbuffer(ctx, 0);
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!rb) {
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating color buffer");
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->InternalFormat = GL_RGBA;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->AllocStorage = soft_renderbuffer_storage;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_add_renderbuffer(fb, b, rb);
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a software-based depth renderbuffer to the given framebuffer.
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a helper routine for device drivers when creating a
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * window system framebuffer (not a user-created render/framebuffer).
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Once this function is called, you can basically forget about this
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * renderbuffer; core Mesa will handle all the buffer management and
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rendering!
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgadd_depth_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLuint depthBits)
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_renderbuffer *rb;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (depthBits > 32) {
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx,
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    "Unsupported depthBits in add_depth_renderbuffer");
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(fb->Attachment[BUFFER_DEPTH].Renderbuffer == NULL);
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb = _swrast_new_soft_renderbuffer(ctx, 0);
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!rb) {
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating depth buffer");
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (depthBits <= 16) {
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->InternalFormat = GL_DEPTH_COMPONENT16;
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (depthBits <= 24) {
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->InternalFormat = GL_DEPTH_COMPONENT24;
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->InternalFormat = GL_DEPTH_COMPONENT32;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb->AllocStorage = soft_renderbuffer_storage;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb);
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a software-based stencil renderbuffer to the given framebuffer.
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a helper routine for device drivers when creating a
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * window system framebuffer (not a user-created render/framebuffer).
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Once this function is called, you can basically forget about this
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * renderbuffer; core Mesa will handle all the buffer management and
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rendering!
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgadd_stencil_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLuint stencilBits)
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_renderbuffer *rb;
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (stencilBits > 16) {
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx,
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "Unsupported stencilBits in add_stencil_renderbuffer");
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(fb->Attachment[BUFFER_STENCIL].Renderbuffer == NULL);
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb = _swrast_new_soft_renderbuffer(ctx, 0);
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!rb) {
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating stencil buffer");
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(stencilBits <= 8);
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb->InternalFormat = GL_STENCIL_INDEX8;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb->AllocStorage = soft_renderbuffer_storage;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb);
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgadd_depth_stencil_renderbuffer(struct gl_context *ctx,
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               struct gl_framebuffer *fb)
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_renderbuffer *rb;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(fb->Attachment[BUFFER_DEPTH].Renderbuffer == NULL);
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(fb->Attachment[BUFFER_STENCIL].Renderbuffer == NULL);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb = _swrast_new_soft_renderbuffer(ctx, 0);
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!rb) {
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating depth+stencil buffer");
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb->InternalFormat = GL_DEPTH_STENCIL;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb->AllocStorage = soft_renderbuffer_storage;
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb);
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb);
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a software-based accumulation renderbuffer to the given framebuffer.
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a helper routine for device drivers when creating a
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * window system framebuffer (not a user-created render/framebuffer).
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Once this function is called, you can basically forget about this
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * renderbuffer; core Mesa will handle all the buffer management and
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rendering!
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgadd_accum_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLuint redBits, GLuint greenBits,
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLuint blueBits, GLuint alphaBits)
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_renderbuffer *rb;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (redBits > 16 || greenBits > 16 || blueBits > 16 || alphaBits > 16) {
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx,
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    "Unsupported accumBits in add_accum_renderbuffer");
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(fb->Attachment[BUFFER_ACCUM].Renderbuffer == NULL);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb = _swrast_new_soft_renderbuffer(ctx, 0);
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!rb) {
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating accum buffer");
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb->InternalFormat = GL_RGBA16_SNORM;
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rb->AllocStorage = soft_renderbuffer_storage;
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_add_renderbuffer(fb, BUFFER_ACCUM, rb);
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a software-based aux renderbuffer to the given framebuffer.
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a helper routine for device drivers when creating a
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * window system framebuffer (not a user-created render/framebuffer).
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Once this function is called, you can basically forget about this
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * renderbuffer; core Mesa will handle all the buffer management and
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rendering!
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NOTE: color-index aux buffers not supported.
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgadd_aux_renderbuffers(struct gl_context *ctx, struct gl_framebuffer *fb,
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      GLuint colorBits, GLuint numBuffers)
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (colorBits > 16) {
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(ctx,
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    "Unsupported colorBits in add_aux_renderbuffers");
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(numBuffers <= MAX_AUX_BUFFERS);
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < numBuffers; i++) {
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_renderbuffer *rb = _swrast_new_soft_renderbuffer(ctx, 0);
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(fb->Attachment[BUFFER_AUX0 + i].Renderbuffer == NULL);
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!rb) {
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating aux buffer");
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return GL_FALSE;
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert (colorBits <= 8);
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->InternalFormat = GL_RGBA;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rb->AllocStorage = soft_renderbuffer_storage;
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_add_renderbuffer(fb, BUFFER_AUX0 + i, rb);
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create/attach software-based renderbuffers to the given framebuffer.
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a helper routine for device drivers.  Drivers can just as well
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * call the individual _mesa_add_*_renderbuffer() routines directly.
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_add_soft_renderbuffers(struct gl_framebuffer *fb,
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLboolean color,
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLboolean depth,
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLboolean stencil,
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLboolean accum,
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLboolean alpha,
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GLboolean aux)
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean frontLeft = GL_TRUE;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean backLeft = fb->Visual.doubleBufferMode;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean frontRight = fb->Visual.stereoMode;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean backRight = fb->Visual.stereoMode && fb->Visual.doubleBufferMode;
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (color) {
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(fb->Visual.redBits == fb->Visual.greenBits);
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(fb->Visual.redBits == fb->Visual.blueBits);
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      add_color_renderbuffers(NULL, fb,
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              fb->Visual.redBits,
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              fb->Visual.alphaBits,
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              frontLeft, backLeft,
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              frontRight, backRight);
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* This is pretty much for debugging purposes only since there's a perf
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * hit for using combined depth/stencil in swrast.
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (depth && fb->Visual.depthBits == 24 &&
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       stencil && fb->Visual.stencilBits == 8) {
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* use combined depth/stencil buffer */
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      add_depth_stencil_renderbuffer(NULL, fb);
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) add_depth_stencil_renderbuffer;
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (depth) {
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(fb->Visual.depthBits > 0);
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         add_depth_renderbuffer(NULL, fb, fb->Visual.depthBits);
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (stencil) {
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(fb->Visual.stencilBits > 0);
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         add_stencil_renderbuffer(NULL, fb, fb->Visual.stencilBits);
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (accum) {
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(fb->Visual.accumRedBits > 0);
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(fb->Visual.accumGreenBits > 0);
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(fb->Visual.accumBlueBits > 0);
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      add_accum_renderbuffer(NULL, fb,
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             fb->Visual.accumRedBits,
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             fb->Visual.accumGreenBits,
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             fb->Visual.accumBlueBits,
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             fb->Visual.accumAlphaBits);
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (aux) {
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(fb->Visual.numAuxBuffers > 0);
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      add_aux_renderbuffers(NULL, fb, fb->Visual.redBits,
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            fb->Visual.numAuxBuffers);
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (multisample) {
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* maybe someday */
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmap_attachment(struct gl_context *ctx,
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct gl_framebuffer *fb,
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 gl_buffer_index buffer)
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *texObj = fb->Attachment[buffer].Texture;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_renderbuffer *rb = fb->Attachment[buffer].Renderbuffer;
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (texObj) {
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* map texture image (render to texture) */
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint level = fb->Attachment[buffer].TextureLevel;
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint face = fb->Attachment[buffer].CubeMapFace;
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint slice = fb->Attachment[buffer].Zoffset;
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_texture_image *texImage = texObj->Image[face][level];
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (texImage) {
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.MapTextureImage(ctx, texImage, slice,
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     0, 0, texImage->Width, texImage->Height,
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     &srb->Map, &srb->RowStride);
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (rb) {
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Map ordinary renderbuffer */
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.MapRenderbuffer(ctx, rb,
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  0, 0, rb->Width, rb->Height,
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  &srb->Map, &srb->RowStride);
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(srb->Map);
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunmap_attachment(struct gl_context *ctx,
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct gl_framebuffer *fb,
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   gl_buffer_index buffer)
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *texObj = fb->Attachment[buffer].Texture;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_renderbuffer *rb = fb->Attachment[buffer].Renderbuffer;
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (texObj) {
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* unmap texture image (render to texture) */
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint level = fb->Attachment[buffer].TextureLevel;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint face = fb->Attachment[buffer].CubeMapFace;
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint slice = fb->Attachment[buffer].Zoffset;
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_texture_image *texImage = texObj->Image[face][level];
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (texImage) {
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->Driver.UnmapTextureImage(ctx, texImage, slice);
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (rb) {
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* unmap ordinary renderbuffer */
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Driver.UnmapRenderbuffer(ctx, rb);
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   srb->Map = NULL;
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine what type to use (ubyte vs. float) for span colors for the
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * given renderbuffer.
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See also _swrast_write_rgba_span().
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfind_renderbuffer_colortype(struct gl_renderbuffer *rb)
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint rbMaxBits = _mesa_get_format_max_bits(rb->Format);
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum rbDatatype = _mesa_get_format_datatype(rb->Format);
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rbDatatype == GL_UNSIGNED_NORMALIZED && rbMaxBits <= 8) {
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* the buffer's values fit in GLubyte values */
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srb->ColorType = GL_UNSIGNED_BYTE;
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* use floats otherwise */
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srb->ColorType = GL_FLOAT;
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map the renderbuffers we'll use for tri/line/point rendering.
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_map_renderbuffers(struct gl_context *ctx)
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_framebuffer *fb = ctx->DrawBuffer;
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_renderbuffer *depthRb, *stencilRb;
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint buf;
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   depthRb = fb->Attachment[BUFFER_DEPTH].Renderbuffer;
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (depthRb) {
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* map depth buffer */
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      map_attachment(ctx, fb, BUFFER_DEPTH);
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stencilRb = fb->Attachment[BUFFER_STENCIL].Renderbuffer;
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (stencilRb && stencilRb != depthRb) {
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* map stencil buffer */
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      map_attachment(ctx, fb, BUFFER_STENCIL);
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (buf = 0; buf < fb->_NumColorDrawBuffers; buf++) {
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      map_attachment(ctx, fb, fb->_ColorDrawBufferIndexes[buf]);
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      find_renderbuffer_colortype(fb->_ColorDrawBuffers[buf]);
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unmap renderbuffers after rendering.
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_unmap_renderbuffers(struct gl_context *ctx)
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_framebuffer *fb = ctx->DrawBuffer;
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_renderbuffer *depthRb, *stencilRb;
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint buf;
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   depthRb = fb->Attachment[BUFFER_DEPTH].Renderbuffer;
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (depthRb) {
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* map depth buffer */
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unmap_attachment(ctx, fb, BUFFER_DEPTH);
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stencilRb = fb->Attachment[BUFFER_STENCIL].Renderbuffer;
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (stencilRb && stencilRb != depthRb) {
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* map stencil buffer */
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unmap_attachment(ctx, fb, BUFFER_STENCIL);
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (buf = 0; buf < fb->_NumColorDrawBuffers; buf++) {
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unmap_attachment(ctx, fb, fb->_ColorDrawBufferIndexes[buf]);
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
696