renderbuffer.c revision 0cae814f362bd7e648535c8ceae12ad286d20d73
1906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe/*
2cb2c86fdf03241fee32fd2e2caff43af1022403cJens Axboe * Mesa 3-D graphics library
3906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe * Version:  6.5
4ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe *
5ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe *
7ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * Permission is hereby granted, free of charge, to any person obtaining a
8ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * copy of this software and associated documentation files (the "Software"),
9ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * to deal in the Software without restriction, including without limitation
10ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * and/or sell copies of the Software, and to permit persons to whom the
12ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * Software is furnished to do so, subject to the following conditions:
13ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe *
14ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * The above copyright notice and this permission notice shall be included
15ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * in all copies or substantial portions of the Software.
16a5e0ee11ec34cfc70a78aee4f7a2eeb01d9cf41fOleg *
17a5e0ee11ec34cfc70a78aee4f7a2eeb01d9cf41fOleg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18a5e0ee11ec34cfc70a78aee4f7a2eeb01d9cf41fOleg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19a5e0ee11ec34cfc70a78aee4f7a2eeb01d9cf41fOleg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20cb2c86fdf03241fee32fd2e2caff43af1022403cJens Axboe * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
212e5cdb118aeb26cb469a50f746b632676306f698Jens Axboe * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22380065aa652b87093d6bbd240e70db30bd6f193dJens Axboe * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
234f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe */
2479d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe
2550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
26f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu/**
27ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * Functions for allocating/managing renderbuffers.
28bf2e821a55d8aa3de1cda7288a0e22883110fdc6Cigy Cyriac * Also, routines for reading/writing software-based renderbuffer data as
29e25b6d5a0a16b978385bfb93a4c156b03363d136Jens Axboe * ubytes, ushorts, uints, etc.
30bf2e821a55d8aa3de1cda7288a0e22883110fdc6Cigy Cyriac *
313d43382c7864753728b181ac356222d67bdd4a3fJens Axboe * The 'alpha8' renderbuffer is interesting.  It's used to add a software-based
32214e1ecae844a32bf8f66d19132f4948d922dceeJens Axboe * alpha channel to RGB renderbuffers.  This is done by wrapping the RGB
33ee738499877bb1ee913e839cb4a8d4edad2d52adJens Axboe * renderbuffer with the alpha renderbuffer.  We can do this because of the
34ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * OO-nature of renderbuffers.
35214e1ecae844a32bf8f66d19132f4948d922dceeJens Axboe *
36fca7035863bd570270376a0c06776e5549ff813eJens Axboe * Down the road we'll use this for run-time support of 8, 16 and 32-bit
37cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe * color channels.  For example, Mesa may use 32-bit/float color channels
388c029376bbe6d8a6bcb01c3ef7d545720aca3868Jens Axboe * internally (swrast) and use wrapper renderbuffers to convert 32-bit
39111e032d60f2341cfe09accbfcf25ec81b9251e0Jens Axboe * values down to 16 or 8-bit values for whatever kind of framebuffer we have.
40e1f365035a952233463d85d659bd960ba78f012eJens Axboe */
41be4ecfdf6c8daa75c4df8ac875c9a87da80d81a0Jens Axboe
42214e1ecae844a32bf8f66d19132f4948d922dceeJens Axboe
43e1f365035a952233463d85d659bd960ba78f012eJens Axboe#include "glheader.h"
44214e1ecae844a32bf8f66d19132f4948d922dceeJens Axboe#include "imports.h"
45f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe#include "context.h"
465be4c944e83b32c0c6842130df3dc1d46cd6eb1fJens Axboe#include "mtypes.h"
47e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe#include "fbobject.h"
48214e1ecae844a32bf8f66d19132f4948d922dceeJens Axboe#include "renderbuffer.h"
49214e1ecae844a32bf8f66d19132f4948d922dceeJens Axboe
50ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe#include "rbadaptors.h"
51ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe
5207b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe
53a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe/* 32-bit color index format.  Not a public format. */
544d658652bac63fd72af8302e27deba5beb381906Jens Axboe#define COLOR_INDEX32 0x424243
5550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
56a37f69b72a74cbde6151458b890aab8d093f0c9fJens Axboe
57e46d809110bd4ad2980ca64931b683673444454bJens Axboe/*
58ee738499877bb1ee913e839cb4a8d4edad2d52adJens Axboe * Routines for get/put values in common buffer formats follow.
59214e1ecae844a32bf8f66d19132f4948d922dceeJens Axboe * Someday add support for arbitrary row stride to make them more
604241ea8fb0606f9bd5b7ed1278d3b7825883acf6Jens Axboe * flexible.
6106464907159baf7a1eeac654a023743e33f28d86Jens Axboe */
62214e1ecae844a32bf8f66d19132f4948d922dceeJens Axboe
635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe/**********************************************************************
64e1f365035a952233463d85d659bd960ba78f012eJens Axboe * Functions for buffers of 1 X GLubyte values.
65214e1ecae844a32bf8f66d19132f4948d922dceeJens Axboe * Typically stencil.
66b46928282e0a890f49250e79b81af773a2b7108fJens Axboe */
67ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
685e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboestatic void *
695e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboeget_pointer_ubyte(GLcontext *ctx, struct gl_renderbuffer *rb,
70ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe                  GLint x, GLint y)
714c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe{
72085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe   if (!rb->Data)
734c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe      return NULL;
747a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
757a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe   /* Can't assert _ActualFormat since these funcs may be used for serveral
76b46928282e0a890f49250e79b81af773a2b7108fJens Axboe    * different formats (GL_ALPHA8, GL_STENCIL_INDEX8, etc).
77b46928282e0a890f49250e79b81af773a2b7108fJens Axboe    */
78b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   return (GLubyte *) rb->Data + y * rb->Width + x;
79b46928282e0a890f49250e79b81af773a2b7108fJens Axboe}
805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe
81b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
8208d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboestatic void
83b46928282e0a890f49250e79b81af773a2b7108fJens Axboeget_row_ubyte(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
847a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe              GLint x, GLint y, void *values)
85b46928282e0a890f49250e79b81af773a2b7108fJens Axboe{
86b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   const GLubyte *src = (const GLubyte *) rb->Data + y * rb->Width + x;
8708d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
88b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   _mesa_memcpy(values, src, count * sizeof(GLubyte));
897a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe}
90b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
91b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
9208d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboestatic void
93b46928282e0a890f49250e79b81af773a2b7108fJens Axboeget_values_ubyte(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
947a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe                 const GLint x[], const GLint y[], void *values)
95b46928282e0a890f49250e79b81af773a2b7108fJens Axboe{
96b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   GLubyte *dst = (GLubyte *) values;
9708d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe   GLuint i;
98b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
997a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe   for (i = 0; i < count; i++) {
100b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      const GLubyte *src = (GLubyte *) rb->Data + y[i] * rb->Width + x[i];
101b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      dst[i] = *src;
10208d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe   }
103b46928282e0a890f49250e79b81af773a2b7108fJens Axboe}
1047a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe
105b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
106b46928282e0a890f49250e79b81af773a2b7108fJens Axboestatic void
107f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboeput_row_ubyte(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
108cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li              GLint x, GLint y, const void *values, const GLubyte *mask)
109f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe{
110cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li   const GLubyte *src = (const GLubyte *) values;
111cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li   GLubyte *dst = (GLubyte *) rb->Data + y * rb->Width + x;
11208d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
113b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   if (mask) {
1147a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe      GLuint i;
115b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      for (i = 0; i < count; i++) {
116b46928282e0a890f49250e79b81af773a2b7108fJens Axboe         if (mask[i]) {
11708d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe            dst[i] = src[i];
118fd28ca4948aa67b76585c6c23d7f70a2cdc7a0d5Jens Axboe         }
1197a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe      }
120fd28ca4948aa67b76585c6c23d7f70a2cdc7a0d5Jens Axboe   }
121fd28ca4948aa67b76585c6c23d7f70a2cdc7a0d5Jens Axboe   else {
12208d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe      _mesa_memcpy(dst, values, count * sizeof(GLubyte));
123320beefe2d0c5f05f24b4e0c1d13fcb2f1286a78Jens Axboe   }
1247a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe}
125fd28ca4948aa67b76585c6c23d7f70a2cdc7a0d5Jens Axboe
126fd28ca4948aa67b76585c6c23d7f70a2cdc7a0d5Jens Axboe
12706464907159baf7a1eeac654a023743e33f28d86Jens Axboestatic void
128de890a1e48d40238dac69f302708dde8719de240Steven Langput_mono_row_ubyte(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
12906464907159baf7a1eeac654a023743e33f28d86Jens Axboe                   GLint x, GLint y, const void *value, const GLubyte *mask)
130de890a1e48d40238dac69f302708dde8719de240Steven Lang{
131de890a1e48d40238dac69f302708dde8719de240Steven Lang   const GLubyte val = *((const GLubyte *) value);
13208d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe   GLubyte *dst = (GLubyte *) rb->Data + y * rb->Width + x;
133cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
1347a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe   if (mask) {
135724e4435c1374e97309b122429ad9291744966c0Jens Axboe      GLuint i;
136724e4435c1374e97309b122429ad9291744966c0Jens Axboe      for (i = 0; i < count; i++) {
13708d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe         if (mask[i]) {
138724e4435c1374e97309b122429ad9291744966c0Jens Axboe            dst[i] = val;
1397a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe         }
140cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe      }
141cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe   }
14208d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe   else {
143e592a06b36999bbb30675a4a58d4ff16ed65e555Aaron Carroll      GLuint i;
1447a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe      for (i = 0; i < count; i++) {
145e592a06b36999bbb30675a4a58d4ff16ed65e555Aaron Carroll         dst[i] = val;
146e592a06b36999bbb30675a4a58d4ff16ed65e555Aaron Carroll      }
147e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe   }
148e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe}
149e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe
150e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe
151e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboestatic void
15208d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboeput_values_ubyte(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
153ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe                 const GLint x[], const GLint y[],
1547a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe                 const void *values, const GLubyte *mask)
155ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe{
156ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   const GLubyte *src = (const GLubyte *) values;
157111e032d60f2341cfe09accbfcf25ec81b9251e0Jens Axboe   GLuint i;
158111e032d60f2341cfe09accbfcf25ec81b9251e0Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
159111e032d60f2341cfe09accbfcf25ec81b9251e0Jens Axboe   for (i = 0; i < count; i++) {
160111e032d60f2341cfe09accbfcf25ec81b9251e0Jens Axboe      if (!mask || mask[i]) {
161111e032d60f2341cfe09accbfcf25ec81b9251e0Jens Axboe         GLubyte *dst = (GLubyte *) rb->Data + y[i] * rb->Width + x[i];
16208d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe         *dst = src[i];
16301f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      }
1647a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe   }
16501f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe}
16601f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe
16708d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe
1682b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboestatic void
1697a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboeput_mono_values_ubyte(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
1702b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe                      const GLint x[], const GLint y[],
1712b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe                      const void *value, const GLubyte *mask)
17208d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe{
1739ac8a797da61a59c9fa1b59f8574246555403d19Jens Axboe   const GLubyte val = *((const GLubyte *) value);
1747a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe   GLuint i;
1759ac8a797da61a59c9fa1b59f8574246555403d19Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
1769ac8a797da61a59c9fa1b59f8574246555403d19Jens Axboe   for (i = 0; i < count; i++) {
17708d2a19c76b310f68ad2ecab17dff2a2a4c1adf8Jens Axboe      if (!mask || mask[i]) {
178a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe         GLubyte *dst = (GLubyte *) rb->Data + y[i] * rb->Width + x[i];
1797a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe         *dst = val;
180a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe      }
181a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe   }
182fca7035863bd570270376a0c06776e5549ff813eJens Axboe}
183fca7035863bd570270376a0c06776e5549ff813eJens Axboe
1847a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe
185fca7035863bd570270376a0c06776e5549ff813eJens Axboe/**********************************************************************
186fca7035863bd570270376a0c06776e5549ff813eJens Axboe * Functions for buffers of 1 X GLushort values.
187f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboe * Typically depth/Z.
188f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboe */
1897a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe
190f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboestatic void *
191f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboeget_pointer_ushort(GLcontext *ctx, struct gl_renderbuffer *rb,
19250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe                   GLint x, GLint y)
19387aa8f1901e26bc377f3035a485d35c417d0255aJens Axboe{
19450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe   if (!rb->Data)
19550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe      return NULL;
196e46d809110bd4ad2980ca64931b683673444454bJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT);
197402668f3e05259bfc135fc097136428feda01006Jens Axboe   ASSERT(rb->Width > 0);
198e46d809110bd4ad2980ca64931b683673444454bJens Axboe   return (GLushort *) rb->Data + y * rb->Width + x;
199e46d809110bd4ad2980ca64931b683673444454bJens Axboe}
20050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
201132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
202132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboestatic void
203132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeget_row_ushort(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
204132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe               GLint x, GLint y, void *values)
205132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe{
2067d11f87148b8ec0f5627c701c934c752bf774029Jens Axboe   const void *src = rb->GetPointer(ctx, rb, x, y);
2077d11f87148b8ec0f5627c701c934c752bf774029Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT);
2087d11f87148b8ec0f5627c701c934c752bf774029Jens Axboe   _mesa_memcpy(values, src, count * sizeof(GLushort));
2097d11f87148b8ec0f5627c701c934c752bf774029Jens Axboe}
2107d11f87148b8ec0f5627c701c934c752bf774029Jens Axboe
211f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu
212f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liustatic void
213f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liuget_values_ushort(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
214f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu                  const GLint x[], const GLint y[], void *values)
215f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu{
21606464907159baf7a1eeac654a023743e33f28d86Jens Axboe   GLushort *dst = (GLushort *) values;
21706464907159baf7a1eeac654a023743e33f28d86Jens Axboe   GLuint i;
21806464907159baf7a1eeac654a023743e33f28d86Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT);
21906464907159baf7a1eeac654a023743e33f28d86Jens Axboe   for (i = 0; i < count; i++) {
22006464907159baf7a1eeac654a023743e33f28d86Jens Axboe      const GLushort *src = (GLushort *) rb->Data + y[i] * rb->Width + x[i];
221b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      dst[i] = *src;
222b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   }
223b46928282e0a890f49250e79b81af773a2b7108fJens Axboe}
224b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
2252bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe
2269d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboestatic void
2279d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboeput_row_ushort(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
2289d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe               GLint x, GLint y, const void *values, const GLubyte *mask)
2299d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe{
2309d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   const GLushort *src = (const GLushort *) values;
2319d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   GLushort *dst = (GLushort *) rb->Data + y * rb->Width + x;
2329d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT);
2332bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe   if (mask) {
2342bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe      GLuint i;
2352bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe      for (i = 0; i < count; i++) {
2362bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe         if (mask[i]) {
2372bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe            dst[i] = src[i];
2382bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe         }
2392bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe      }
2402bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe   }
2412bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe   else {
2429d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      _mesa_memcpy(dst, src, count * sizeof(GLushort));
2439e684a4976b7934f5ce011ea281dfef3352e5738Dan Ehrenberg   }
2449d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe}
2452bb3f0a7e00d3d62943b0bcc8119ab81c157c349Jens Axboe
2469d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe
2479d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboestatic void
2489d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboeput_mono_row_ushort(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
2499d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe                    GLint x, GLint y, const void *value, const GLubyte *mask)
2509d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe{
2519d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   const GLushort val = *((const GLushort *) value);
2529d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   GLushort *dst = (GLushort *) rb->Data + y * rb->Width + x;
2539d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT);
2549d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   if (mask) {
2559d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      GLuint i;
2569d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      for (i = 0; i < count; i++) {
2579d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe         if (mask[i]) {
2589d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe            dst[i] = val;
2599d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe         }
2609d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      }
2619d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   }
2629d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   else {
2639d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      GLuint i;
2649d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      for (i = 0; i < count; i++) {
2659d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe         dst[i] = val;
2669d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      }
2679d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   }
2689d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe}
2699d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe
2709d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe
2719d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboestatic void
2729d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboeput_values_ushort(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
2739d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe                  const GLint x[], const GLint y[], const void *values,
2749d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe                  const GLubyte *mask)
2759d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe{
2769d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   const GLushort *src = (const GLushort *) values;
277f0c77f03815a6597ef4ee18bf20894f180c91fbeJens Axboe   GLuint i;
2789d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT);
2799d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   for (i = 0; i < count; i++) {
2809d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      if (!mask || mask[i]) {
2819d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe         GLushort *dst = (GLushort *) rb->Data + y[i] * rb->Width + x[i];
2829d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe         *dst = src[i];
2839d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      }
2849d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   }
2859d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe}
2869d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe
2879d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe
2889d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboestatic void
2899d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboeput_mono_values_ushort(GLcontext *ctx, struct gl_renderbuffer *rb,
2909d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe                       GLuint count, const GLint x[], const GLint y[],
2919d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe                       const void *value, const GLubyte *mask)
2929d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe{
2939d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   const GLushort val = *((const GLushort *) value);
2949d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT);
2959d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   if (mask) {
2969d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      GLuint i;
2979d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      for (i = 0; i < count; i++) {
2989d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe         if (mask[i]) {
2999e684a4976b7934f5ce011ea281dfef3352e5738Dan Ehrenberg            GLushort *dst = (GLushort *) rb->Data + y[i] * rb->Width + x[i];
3009e684a4976b7934f5ce011ea281dfef3352e5738Dan Ehrenberg            *dst = val;
3019e684a4976b7934f5ce011ea281dfef3352e5738Dan Ehrenberg         }
3029d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      }
3039d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   }
3049d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   else {
305906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe      GLuint i;
306906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe      for (i = 0; i < count; i++) {
307906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe         GLushort *dst = (GLushort *) rb->Data + y[i] * rb->Width + x[i];
308de890a1e48d40238dac69f302708dde8719de240Steven Lang         *dst = val;
309de890a1e48d40238dac69f302708dde8719de240Steven Lang      }
310ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   }
311ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
312ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
313ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
314ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe/**********************************************************************
3159d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe * Functions for buffers of 1 X GLuint values.
3169d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe * Typically depth/Z or color index.
3179d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe */
3189d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe
319e61f1ec89de8eb5bb0f8b1e6a79594f0bff2a259Bruce Cranstatic void *
320e61f1ec89de8eb5bb0f8b1e6a79594f0bff2a259Bruce Cranget_pointer_uint(GLcontext *ctx, struct gl_renderbuffer *rb,
321e61f1ec89de8eb5bb0f8b1e6a79594f0bff2a259Bruce Cran                 GLint x, GLint y)
322ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
323e61f1ec89de8eb5bb0f8b1e6a79594f0bff2a259Bruce Cran   if (!rb->Data)
324ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      return NULL;
325ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_INT ||
326ddaeaa5ab1e3f1cb6f35a9f4a18ee932151a0ab8Jens Axboe          rb->DataType == GL_UNSIGNED_INT_24_8_EXT);
327ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   return (GLuint *) rb->Data + y * rb->Width + x;
328de890a1e48d40238dac69f302708dde8719de240Steven Lang}
329de890a1e48d40238dac69f302708dde8719de240Steven Lang
330de890a1e48d40238dac69f302708dde8719de240Steven Lang
331de890a1e48d40238dac69f302708dde8719de240Steven Langstatic void
332e0b0d89201bd301f47fbbfcf86545b7e77b16ef3Jens Axboeget_row_uint(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
333e0b0d89201bd301f47fbbfcf86545b7e77b16ef3Jens Axboe             GLint x, GLint y, void *values)
334cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe{
335de890a1e48d40238dac69f302708dde8719de240Steven Lang   const void *src = rb->GetPointer(ctx, rb, x, y);
336cade3ef44669c5c962d7ed18ca0e361116ee44adJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_INT ||
33715dc1934435dc84d66547c4fc92d936224d7238fJens Axboe          rb->DataType == GL_UNSIGNED_INT_24_8_EXT);
33815dc1934435dc84d66547c4fc92d936224d7238fJens Axboe   _mesa_memcpy(values, src, count * sizeof(GLuint));
339ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
340108fea772db5f1dd91e2fb67737e3e0d36827b76Jens Axboe
341108fea772db5f1dd91e2fb67737e3e0d36827b76Jens Axboe
342108fea772db5f1dd91e2fb67737e3e0d36827b76Jens Axboestatic void
343108fea772db5f1dd91e2fb67737e3e0d36827b76Jens Axboeget_values_uint(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
344ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe                const GLint x[], const GLint y[], void *values)
345ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
346ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   GLuint *dst = (GLuint *) values;
347ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   GLuint i;
348ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_INT ||
349549577a728fc3bacbfea8978c4f514cef5b073dcJens Axboe          rb->DataType == GL_UNSIGNED_INT_24_8_EXT);
350549577a728fc3bacbfea8978c4f514cef5b073dcJens Axboe   for (i = 0; i < count; i++) {
35184dd18865235caa675424c62a4624618ff961d78Bruce Cran      const GLuint *src = (GLuint *) rb->Data + y[i] * rb->Width + x[i];
35258c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe      dst[i] = *src;
3539e684a4976b7934f5ce011ea281dfef3352e5738Dan Ehrenberg   }
354549577a728fc3bacbfea8978c4f514cef5b073dcJens Axboe}
35516edf25dba269ee9e8239130e75b690440b1e120Jens Axboe
3566d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe
35716edf25dba269ee9e8239130e75b690440b1e120Jens Axboestatic void
3587e356b2dee2e86f3684424fc6e903f1ef9f00ef4Jens Axboeput_row_uint(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
359de890a1e48d40238dac69f302708dde8719de240Steven Lang             GLint x, GLint y, const void *values, const GLubyte *mask)
360de890a1e48d40238dac69f302708dde8719de240Steven Lang{
3617e356b2dee2e86f3684424fc6e903f1ef9f00ef4Jens Axboe   const GLuint *src = (const GLuint *) values;
362ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   GLuint *dst = (GLuint *) rb->Data + y * rb->Width + x;
363ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_INT ||
364ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe          rb->DataType == GL_UNSIGNED_INT_24_8_EXT);
365ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   if (mask) {
366581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe      GLuint i;
367127f686514ef8b1d9ab6ed702971b205454974e6Jens Axboe      for (i = 0; i < count; i++) {
368581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe         if (mask[i]) {
369127f686514ef8b1d9ab6ed702971b205454974e6Jens Axboe            dst[i] = src[i];
370ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe         }
371ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe      }
372ba3e4e0ca697f83c97a250d85a74506ace69de2cRadha Ramachandran   }
3731b8dbf256b974fac2864052931f3041ff3ead157Steven Lang   else {
374ba3e4e0ca697f83c97a250d85a74506ace69de2cRadha Ramachandran      _mesa_memcpy(dst, src, count * sizeof(GLuint));
3751b8dbf256b974fac2864052931f3041ff3ead157Steven Lang   }
376127f686514ef8b1d9ab6ed702971b205454974e6Jens Axboe}
3771b8dbf256b974fac2864052931f3041ff3ead157Steven Lang
378127f686514ef8b1d9ab6ed702971b205454974e6Jens Axboe
379127f686514ef8b1d9ab6ed702971b205454974e6Jens Axboestatic void
380127f686514ef8b1d9ab6ed702971b205454974e6Jens Axboeput_mono_row_uint(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
381127f686514ef8b1d9ab6ed702971b205454974e6Jens Axboe                  GLint x, GLint y, const void *value, const GLubyte *mask)
382581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe{
383127f686514ef8b1d9ab6ed702971b205454974e6Jens Axboe   const GLuint val = *((const GLuint *) value);
384127f686514ef8b1d9ab6ed702971b205454974e6Jens Axboe   GLuint *dst = (GLuint *) rb->Data + y * rb->Width + x;
385127f686514ef8b1d9ab6ed702971b205454974e6Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_INT ||
386581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe          rb->DataType == GL_UNSIGNED_INT_24_8_EXT);
387581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe   if (mask) {
388581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe      GLuint i;
389581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe      for (i = 0; i < count; i++) {
390581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe         if (mask[i]) {
391581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe            dst[i] = val;
392581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe         }
393581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe      }
3946eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li   }
3956eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li   else {
396581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe      GLuint i;
397581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe      for (i = 0; i < count; i++) {
398581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe         dst[i] = val;
399581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboe      }
4008347239af0a361e160293100bfc053f88bbbf737Jens Axboe   }
4018347239af0a361e160293100bfc053f88bbbf737Jens Axboe}
4028347239af0a361e160293100bfc053f88bbbf737Jens Axboe
4038347239af0a361e160293100bfc053f88bbbf737Jens Axboe
4046eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Listatic void
4056eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liput_values_uint(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
4066eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li                const GLint x[], const GLint y[], const void *values,
4078347239af0a361e160293100bfc053f88bbbf737Jens Axboe                const GLubyte *mask)
4088347239af0a361e160293100bfc053f88bbbf737Jens Axboe{
409dad915e36819e74c4540db19faae488ede963ee4Jens Axboe   const GLuint *src = (const GLuint *) values;
410dad915e36819e74c4540db19faae488ede963ee4Jens Axboe   GLuint i;
411dad915e36819e74c4540db19faae488ede963ee4Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_INT ||
412dad915e36819e74c4540db19faae488ede963ee4Jens Axboe          rb->DataType == GL_UNSIGNED_INT_24_8_EXT);
4134e991c23d2d06484f581eb5e2105bc102cb35941Jens Axboe   for (i = 0; i < count; i++) {
414e1f365035a952233463d85d659bd960ba78f012eJens Axboe      if (!mask || mask[i]) {
4152dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe         GLuint *dst = (GLuint *) rb->Data + y[i] * rb->Width + x[i];
416eefd98b18d9eae9d7f29adf65f35a057bedbfc8bJens Axboe         *dst = src[i];
417dad915e36819e74c4540db19faae488ede963ee4Jens Axboe      }
418f356d01d0cf8fec2ee58f66a9b5c00c93defbc47Jens Axboe   }
4199bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboe}
420f356d01d0cf8fec2ee58f66a9b5c00c93defbc47Jens Axboe
421f356d01d0cf8fec2ee58f66a9b5c00c93defbc47Jens Axboe
422f356d01d0cf8fec2ee58f66a9b5c00c93defbc47Jens Axboestatic void
4239bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboeput_mono_values_uint(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
424a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe                     const GLint x[], const GLint y[], const void *value,
425f356d01d0cf8fec2ee58f66a9b5c00c93defbc47Jens Axboe                     const GLubyte *mask)
426f356d01d0cf8fec2ee58f66a9b5c00c93defbc47Jens Axboe{
427f356d01d0cf8fec2ee58f66a9b5c00c93defbc47Jens Axboe   const GLuint val = *((const GLuint *) value);
4282dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe   GLuint i;
429076efc7c60c351df783960a646e7fe8fba29dc19Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_INT ||
4302dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe          rb->DataType == GL_UNSIGNED_INT_24_8_EXT);
4312dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe   for (i = 0; i < count; i++) {
432a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe      if (!mask || mask[i]) {
433076efc7c60c351df783960a646e7fe8fba29dc19Jens Axboe         GLuint *dst = (GLuint *) rb->Data + y[i] * rb->Width + x[i];
43416b462aeb47996111ee6aa516c9226708db7c248Jens Axboe         *dst = val;
43516b462aeb47996111ee6aa516c9226708db7c248Jens Axboe      }
436ed33585509a97c4a65e46967cb49419b6a4f8870Steven Noonan   }
43716b462aeb47996111ee6aa516c9226708db7c248Jens Axboe}
438627aa1a8477290140a342a7bf344a84bc5bed762Jens Axboe
4392dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe
44016b462aeb47996111ee6aa516c9226708db7c248Jens Axboe/**********************************************************************
44116b462aeb47996111ee6aa516c9226708db7c248Jens Axboe * Functions for buffers of 3 X GLubyte (or GLbyte) values.
442ed33585509a97c4a65e46967cb49419b6a4f8870Steven Noonan * Typically color buffers.
443ed33585509a97c4a65e46967cb49419b6a4f8870Steven Noonan * NOTE: the incoming and outgoing colors are RGBA!  We ignore incoming
444ed33585509a97c4a65e46967cb49419b6a4f8870Steven Noonan * alpha values and return 255 for outgoing alpha values.
445ed33585509a97c4a65e46967cb49419b6a4f8870Steven Noonan */
446ed33585509a97c4a65e46967cb49419b6a4f8870Steven Noonan
447ed33585509a97c4a65e46967cb49419b6a4f8870Steven Noonanstatic void *
448ed33585509a97c4a65e46967cb49419b6a4f8870Steven Noonanget_pointer_ubyte3(GLcontext *ctx, struct gl_renderbuffer *rb,
44916b462aeb47996111ee6aa516c9226708db7c248Jens Axboe                   GLint x, GLint y)
45016b462aeb47996111ee6aa516c9226708db7c248Jens Axboe{
45116b462aeb47996111ee6aa516c9226708db7c248Jens Axboe   ASSERT(rb->_ActualFormat == GL_RGB8);
4522dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe   /* No direct access since this buffer is RGB but caller will be
45316b462aeb47996111ee6aa516c9226708db7c248Jens Axboe    * treating it as if it were RGBA.
4542dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe    */
4555ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe   return NULL;
4562dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe}
4572dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe
4582dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe
4595ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboestatic void
4602dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboeget_row_ubyte3(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
4612dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe               GLint x, GLint y, void *values)
4626eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li{
4636eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li   const GLubyte *src = (const GLubyte *) rb->Data + 3 * (y * rb->Width + x);
4646eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li   GLubyte *dst = (GLubyte *) values;
4656eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li   GLuint i;
4666eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li   ASSERT(rb->_ActualFormat == GL_RGB8);
467a00735e66f9ec42549da94eba3170e543b542904Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
4682dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe   for (i = 0; i < count; i++) {
4696eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li      dst[i * 4 + 0] = src[i * 3 + 0];
470a00735e66f9ec42549da94eba3170e543b542904Jens Axboe      dst[i * 4 + 1] = src[i * 3 + 1];
4712b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe      dst[i * 4 + 2] = src[i * 3 + 2];
4722b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe      dst[i * 4 + 3] = 255;
4732b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe   }
4742b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe}
4752b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe
4762b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe
4772b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboestatic void
4786eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liget_values_ubyte3(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
4796eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li                  const GLint x[], const GLint y[], void *values)
4802b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe{
4812b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe   GLubyte *dst = (GLubyte *) values;
4826eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li   GLuint i;
4836eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li   ASSERT(rb->_ActualFormat == GL_RGB8);
4849bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
4852b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe   for (i = 0; i < count; i++) {
4869bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboe      const GLubyte *src
487a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe         = (GLubyte *) rb->Data + 3 * (y[i] * rb->Width + x[i]);
4882b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe      dst[i * 4 + 0] = src[0];
4892b7a01d01ea19f6e4090c7a8280bc6bf983e781fJens Axboe      dst[i * 4 + 1] = src[1];
4902dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe      dst[i * 4 + 2] = src[2];
4912dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe      dst[i * 4 + 3] = 255;
4929c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe   }
4938347239af0a361e160293100bfc053f88bbbf737Jens Axboe}
4948347239af0a361e160293100bfc053f88bbbf737Jens Axboe
4958347239af0a361e160293100bfc053f88bbbf737Jens Axboe
4968347239af0a361e160293100bfc053f88bbbf737Jens Axboestatic void
4972dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboeput_row_ubyte3(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
498a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe               GLint x, GLint y, const void *values, const GLubyte *mask)
499bb8895e07c6d6417410545f45d34b1b7916cd90aJens Axboe{
5002dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe   /* note: incoming values are RGB+A! */
501690adba373bb8c97a365c67da369e265953c4b4cJens Axboe   const GLubyte *src = (const GLubyte *) values;
502e0a223354342cc45a916b669343718b80a20c2eaJens Axboe   GLubyte *dst = (GLubyte *) rb->Data + 3 * (y * rb->Width + x);
503e0a223354342cc45a916b669343718b80a20c2eaJens Axboe   GLuint i;
50448097d5c61aa1718e6dd4b3b647ea2eb6f00fcfbJens Axboe   ASSERT(rb->_ActualFormat == GL_RGB8);
50548097d5c61aa1718e6dd4b3b647ea2eb6f00fcfbJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
5062dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe   for (i = 0; i < count; i++) {
5072dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe      if (!mask || mask[i]) {
508e916b390684ec1ca6247f98138fa9c1682701d29Jens Axboe         dst[i * 3 + 0] = src[i * 4 + 0];
509e916b390684ec1ca6247f98138fa9c1682701d29Jens Axboe         dst[i * 3 + 1] = src[i * 4 + 1];
510e916b390684ec1ca6247f98138fa9c1682701d29Jens Axboe         dst[i * 3 + 2] = src[i * 4 + 2];
511e916b390684ec1ca6247f98138fa9c1682701d29Jens Axboe      }
51267bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe   }
51367bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe}
514cb5ab5121ac4fa62e0ca2612b359f19bfdd30f29Jens Axboe
515cb5ab5121ac4fa62e0ca2612b359f19bfdd30f29Jens Axboe
516cb5ab5121ac4fa62e0ca2612b359f19bfdd30f29Jens Axboestatic void
517cb5ab5121ac4fa62e0ca2612b359f19bfdd30f29Jens Axboeput_row_rgb_ubyte3(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
5182dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe                   GLint x, GLint y, const void *values, const GLubyte *mask)
5192dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe{
520b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe   /* note: incoming values are RGB+A! */
5212dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe   const GLubyte *src = (const GLubyte *) values;
5222dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe   GLubyte *dst = (GLubyte *) rb->Data + 3 * (y * rb->Width + x);
5239f9214f243701626a04b4a0f9aceec03b8b40e0fJens Axboe   GLuint i;
5242dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe   ASSERT(rb->_ActualFormat == GL_RGB8);
5252dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
5264e991c23d2d06484f581eb5e2105bc102cb35941Jens Axboe   for (i = 0; i < count; i++) {
5276eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li      if (!mask || mask[i]) {
5286eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li         dst[i * 3 + 0] = src[i * 3 + 0];
5296eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li         dst[i * 3 + 1] = src[i * 3 + 1];
5306eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li         dst[i * 3 + 2] = src[i * 3 + 2];
5314e991c23d2d06484f581eb5e2105bc102cb35941Jens Axboe      }
532a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe   }
5334e991c23d2d06484f581eb5e2105bc102cb35941Jens Axboe}
5346eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li
5356eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li
5366eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Listatic void
5376eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Liput_mono_row_ubyte3(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
5386eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li                    GLint x, GLint y, const void *value, const GLubyte *mask)
5396eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li{
5404e991c23d2d06484f581eb5e2105bc102cb35941Jens Axboe   /* note: incoming value is RGB+A! */
541a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe   const GLubyte val0 = ((const GLubyte *) value)[0];
5424e991c23d2d06484f581eb5e2105bc102cb35941Jens Axboe   const GLubyte val1 = ((const GLubyte *) value)[1];
5434e991c23d2d06484f581eb5e2105bc102cb35941Jens Axboe   const GLubyte val2 = ((const GLubyte *) value)[2];
544cf4464ca60ce75ac241c621bc70a2500beeb782fJens Axboe   GLubyte *dst = (GLubyte *) rb->Data + 3 * (y * rb->Width + x);
545cf4464ca60ce75ac241c621bc70a2500beeb782fJens Axboe   ASSERT(rb->_ActualFormat == GL_RGB8);
546cf4464ca60ce75ac241c621bc70a2500beeb782fJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
547a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe   if (!mask && val0 == val1 && val1 == val2) {
548cf4464ca60ce75ac241c621bc70a2500beeb782fJens Axboe      /* optimized case */
549cf4464ca60ce75ac241c621bc70a2500beeb782fJens Axboe      _mesa_memset(dst, val0, 3 * count);
550aa31f1f108348ba2a8749c73fa8c25f3d4630a7cShawn Lewis   }
5515921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe   else {
5525ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe      GLuint i;
5539bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboe      for (i = 0; i < count; i++) {
554996936f995c47f4744a49e05419e7d4c0364c64eJens Axboe         if (!mask || mask[i]) {
555a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe            dst[i * 3 + 0] = val0;
556a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe            dst[i * 3 + 1] = val1;
557a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe            dst[i * 3 + 2] = val2;
558a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe         }
559a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe      }
560a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe   }
5619bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboe}
5622f1b8e8b2efff5cf6887fc465f711391ab5b1825Jens Axboe
5632f1b8e8b2efff5cf6887fc465f711391ab5b1825Jens Axboe
5642f1b8e8b2efff5cf6887fc465f711391ab5b1825Jens Axboestatic void
565d990588ef84dacb107971143c239565e149d6f73Jens Axboeput_values_ubyte3(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
56641ccd84597867a36289392e59634d9fd7dc4c397Jens Axboe                  const GLint x[], const GLint y[], const void *values,
5679bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboe                  const GLubyte *mask)
5689bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboe{
569a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe   /* note: incoming values are RGB+A! */
5709c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe   const GLubyte *src = (const GLubyte *) values;
5719c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe   GLuint i;
572a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe   ASSERT(rb->_ActualFormat == GL_RGB8);
573a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
5749c0d224129b0c59698e4c77e7fed00dc8cbb50e1Jens Axboe   for (i = 0; i < count; i++) {
57534f1c044d361d04a576c3e7ed387fe064f9db5c6Jens Axboe      if (!mask || mask[i]) {
576ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan         GLubyte *dst = (GLubyte *) rb->Data + 3 * (y[i] * rb->Width + x[i]);
577ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan         dst[0] = src[i * 4 + 0];
578ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan         dst[1] = src[i * 4 + 1];
579ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan         dst[2] = src[i * 4 + 2];
580ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan      }
581ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan   }
582ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan}
58367bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe
5849bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboe
585e72fa4d40565e7a213698d8696b81f80e4670982Joshua Aunestatic void
586e72fa4d40565e7a213698d8696b81f80e4670982Joshua Auneput_mono_values_ubyte3(GLcontext *ctx, struct gl_renderbuffer *rb,
587e72fa4d40565e7a213698d8696b81f80e4670982Joshua Aune                       GLuint count, const GLint x[], const GLint y[],
588e72fa4d40565e7a213698d8696b81f80e4670982Joshua Aune                       const void *value, const GLubyte *mask)
5899bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboe{
5909bbf57cc80d915d8cc87240276334ddd5aaac547Jens Axboe   /* note: incoming value is RGB+A! */
591a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe   const GLubyte val0 = ((const GLubyte *) value)[0];
592e72fa4d40565e7a213698d8696b81f80e4670982Joshua Aune   const GLubyte val1 = ((const GLubyte *) value)[1];
593e72fa4d40565e7a213698d8696b81f80e4670982Joshua Aune   const GLubyte val2 = ((const GLubyte *) value)[2];
594e72fa4d40565e7a213698d8696b81f80e4670982Joshua Aune   GLuint i;
59593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran   ASSERT(rb->_ActualFormat == GL_RGB8);
59693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
59793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran   for (i = 0; i < count; i++) {
59893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran      if (!mask || mask[i]) {
59993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran         GLubyte *dst = (GLubyte *) rb->Data + 3 * (y[i] * rb->Width + x[i]);
60093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran         dst[0] = val0;
60193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran         dst[1] = val1;
60293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran         dst[2] = val2;
60393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran      }
60493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran   }
60593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran}
60693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran
60793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran
608811ac503a6196f13da22565eb165c278988da4daJens Axboe/**********************************************************************
609811ac503a6196f13da22565eb165c278988da4daJens Axboe * Functions for buffers of 4 X GLubyte (or GLbyte) values.
610811ac503a6196f13da22565eb165c278988da4daJens Axboe * Typically color buffers.
611811ac503a6196f13da22565eb165c278988da4daJens Axboe */
612811ac503a6196f13da22565eb165c278988da4daJens Axboe
613811ac503a6196f13da22565eb165c278988da4daJens Axboestatic void *
614811ac503a6196f13da22565eb165c278988da4daJens Axboeget_pointer_ubyte4(GLcontext *ctx, struct gl_renderbuffer *rb,
615811ac503a6196f13da22565eb165c278988da4daJens Axboe                   GLint x, GLint y)
616811ac503a6196f13da22565eb165c278988da4daJens Axboe{
6175881fda43ce41756029a830cc83dbf4480cb6ea2Jens Axboe   if (!rb->Data)
6185881fda43ce41756029a830cc83dbf4480cb6ea2Jens Axboe      return NULL;
6195881fda43ce41756029a830cc83dbf4480cb6ea2Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
6205881fda43ce41756029a830cc83dbf4480cb6ea2Jens Axboe   ASSERT(rb->_ActualFormat == GL_RGBA8);
6215881fda43ce41756029a830cc83dbf4480cb6ea2Jens Axboe   return (GLubyte *) rb->Data + 4 * (y * rb->Width + x);
6225881fda43ce41756029a830cc83dbf4480cb6ea2Jens Axboe}
6235881fda43ce41756029a830cc83dbf4480cb6ea2Jens Axboe
6248d916c942bb088204ab5c0438c297903c9160698Jens Axboe
6258d916c942bb088204ab5c0438c297903c9160698Jens Axboestatic void
6268d916c942bb088204ab5c0438c297903c9160698Jens Axboeget_row_ubyte4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
6278d916c942bb088204ab5c0438c297903c9160698Jens Axboe               GLint x, GLint y, void *values)
6288d916c942bb088204ab5c0438c297903c9160698Jens Axboe{
6298d916c942bb088204ab5c0438c297903c9160698Jens Axboe   const GLubyte *src = (const GLubyte *) rb->Data + 4 * (y * rb->Width + x);
6308d916c942bb088204ab5c0438c297903c9160698Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
6318d916c942bb088204ab5c0438c297903c9160698Jens Axboe   ASSERT(rb->_ActualFormat == GL_RGBA8);
632a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe   _mesa_memcpy(values, src, 4 * count * sizeof(GLubyte));
633e1f365035a952233463d85d659bd960ba78f012eJens Axboe}
634e1f365035a952233463d85d659bd960ba78f012eJens Axboe
635906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe
636f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboestatic void
637f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboeget_values_ubyte4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
63899d633af3611958ea6217f270677d0a657e4dddcJens Axboe                  const GLint x[], const GLint y[], void *values)
639f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe{
640f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe   /* treat 4*GLubyte as 1*GLuint */
641f3502ba2dd72d846a388c774a01c6bb833871248Jens Axboe   GLuint *dst = (GLuint *) values;
642f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe   GLuint i;
643f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
644245142ff7554290cf666e3ef6b7b57512bf17d75Jens Axboe   ASSERT(rb->_ActualFormat == GL_RGBA8);
645f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe   for (i = 0; i < count; i++) {
646f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe      const GLuint *src = (GLuint *) rb->Data + (y[i] * rb->Width + x[i]);
647f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe      dst[i] = *src;
648f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe   }
649f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe}
650245142ff7554290cf666e3ef6b7b57512bf17d75Jens Axboe
651f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe
65298ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburnstatic void
653f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboeput_row_ubyte4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
654f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe               GLint x, GLint y, const void *values, const GLubyte *mask)
655f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe{
65609629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe   /* treat 4*GLubyte as 1*GLuint */
65709629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe   const GLuint *src = (const GLuint *) values;
65809629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe   GLuint *dst = (GLuint *) rb->Data + (y * rb->Width + x);
65909629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
66009629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe   ASSERT(rb->_ActualFormat == GL_RGBA8);
66109629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe   if (mask) {
66209629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe      GLuint i;
66309629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe      for (i = 0; i < count; i++) {
66409629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe         if (mask[i]) {
66509629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe            dst[i] = src[i];
66609629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe         }
66709629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe      }
66809629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe   }
66909629a90d5b68b220e3fb98318e2dcd019943edaJens Axboe   else {
670e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe      _mesa_memcpy(dst, src, 4 * count * sizeof(GLubyte));
671e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe   }
672e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe}
673e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe
674e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe
675e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboestatic void
676e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboeput_row_rgb_ubyte4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
677ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran                   GLint x, GLint y, const void *values, const GLubyte *mask)
678ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran{
679ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran   /* Store RGB values in RGBA buffer */
680e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe   const GLubyte *src = (const GLubyte *) values;
681e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe   GLubyte *dst = (GLubyte *) rb->Data + 4 * (y * rb->Width + x);
682e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe   GLuint i;
683e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
684e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe   ASSERT(rb->_ActualFormat == GL_RGBA8);
6854c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe   for (i = 0; i < count; i++) {
6865bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboe      if (!mask || mask[i]) {
687d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe         dst[i * 4 + 0] = src[i * 3 + 0];
688d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe         dst[i * 4 + 1] = src[i * 3 + 1];
689d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe         dst[i * 4 + 2] = src[i * 3 + 2];
6905bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboe         dst[i * 4 + 3] = 0xff;
6915bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboe      }
692d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe   }
6935bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboe}
694d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe
695d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe
6965bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboestatic void
6975bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboeput_mono_row_ubyte4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
6985bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboe                    GLint x, GLint y, const void *value, const GLubyte *mask)
6995bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboe{
7005bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboe   /* treat 4*GLubyte as 1*GLuint */
701d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe   const GLuint val = *((const GLuint *) value);
7025bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboe   GLuint *dst = (GLuint *) rb->Data + (y * rb->Width + x);
703d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
704d94722713ebd7bbdbf8b284b7563f2dd17964e24Jens Axboe   ASSERT(rb->_ActualFormat == GL_RGBA8);
705d94722713ebd7bbdbf8b284b7563f2dd17964e24Jens Axboe   if (!mask && val == 0) {
706d94722713ebd7bbdbf8b284b7563f2dd17964e24Jens Axboe      /* common case */
707d94722713ebd7bbdbf8b284b7563f2dd17964e24Jens Axboe      _mesa_bzero(dst, count * 4 * sizeof(GLubyte));
7084c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe   }
7094c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe   else {
7104c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe      /* general case */
7114c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe      if (mask) {
712d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe         GLuint i;
713d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe         for (i = 0; i < count; i++) {
714d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe            if (mask[i]) {
7154c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe               dst[i] = val;
7164c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe            }
717d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe         }
7184c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe      }
719d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe      else {
720d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe         GLuint i;
7214c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe         for (i = 0; i < count; i++) {
7224c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe            dst[i] = val;
7234c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe         }
7244c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe      }
7254c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe   }
726d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe}
7274c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe
728d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe
729d94722713ebd7bbdbf8b284b7563f2dd17964e24Jens Axboestatic void
730d94722713ebd7bbdbf8b284b7563f2dd17964e24Jens Axboeput_values_ubyte4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
731d94722713ebd7bbdbf8b284b7563f2dd17964e24Jens Axboe                  const GLint x[], const GLint y[], const void *values,
7325bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboe                  const GLubyte *mask)
7335bfc35d7abe2582dc54127ca1d6e03792c9d62f5Jens Axboe{
7344c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe   /* treat 4*GLubyte as 1*GLuint */
7354c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe   const GLuint *src = (const GLuint *) values;
7364c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe   GLuint i;
7374c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
7384c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe   ASSERT(rb->_ActualFormat == GL_RGBA8);
7394c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe   for (i = 0; i < count; i++) {
7403545a109a2cfe5ab22969ef453dc049db47f0b68Jens Axboe      if (!mask || mask[i]) {
741d24945f0f0538bea41704cbd9b593b350ca9bb0dJens Axboe         GLuint *dst = (GLuint *) rb->Data + (y[i] * rb->Width + x[i]);
7424c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe         *dst = src[i];
7434c07ad86c6cc6e158c70a5c625f60144db03f20dJens Axboe      }
7449c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe   }
745de890a1e48d40238dac69f302708dde8719de240Steven Lang}
746de890a1e48d40238dac69f302708dde8719de240Steven Lang
747de890a1e48d40238dac69f302708dde8719de240Steven Lang
748de890a1e48d40238dac69f302708dde8719de240Steven Langstatic void
749de890a1e48d40238dac69f302708dde8719de240Steven Langput_mono_values_ubyte4(GLcontext *ctx, struct gl_renderbuffer *rb,
750de890a1e48d40238dac69f302708dde8719de240Steven Lang                       GLuint count, const GLint x[], const GLint y[],
751de890a1e48d40238dac69f302708dde8719de240Steven Lang                       const void *value, const GLubyte *mask)
752de890a1e48d40238dac69f302708dde8719de240Steven Lang{
753de890a1e48d40238dac69f302708dde8719de240Steven Lang   /* treat 4*GLubyte as 1*GLuint */
754de890a1e48d40238dac69f302708dde8719de240Steven Lang   const GLuint val = *((const GLuint *) value);
755de890a1e48d40238dac69f302708dde8719de240Steven Lang   GLuint i;
756de890a1e48d40238dac69f302708dde8719de240Steven Lang   ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
7576e5c4b8e46c95ca75e30e1110a0d24b2df9c47e9Jens Axboe   ASSERT(rb->_ActualFormat == GL_RGBA8);
7586e5c4b8e46c95ca75e30e1110a0d24b2df9c47e9Jens Axboe   for (i = 0; i < count; i++) {
7596e5c4b8e46c95ca75e30e1110a0d24b2df9c47e9Jens Axboe      if (!mask || mask[i]) {
7606e5c4b8e46c95ca75e30e1110a0d24b2df9c47e9Jens Axboe         GLuint *dst = (GLuint *) rb->Data + (y[i] * rb->Width + x[i]);
761de890a1e48d40238dac69f302708dde8719de240Steven Lang         *dst = val;
762de890a1e48d40238dac69f302708dde8719de240Steven Lang      }
763de890a1e48d40238dac69f302708dde8719de240Steven Lang   }
764de890a1e48d40238dac69f302708dde8719de240Steven Lang}
765de890a1e48d40238dac69f302708dde8719de240Steven Lang
766de890a1e48d40238dac69f302708dde8719de240Steven Lang
767de890a1e48d40238dac69f302708dde8719de240Steven Lang/**********************************************************************
768de890a1e48d40238dac69f302708dde8719de240Steven Lang * Functions for buffers of 4 X GLushort (or GLshort) values.
769de890a1e48d40238dac69f302708dde8719de240Steven Lang * Typically accum buffer.
770de890a1e48d40238dac69f302708dde8719de240Steven Lang */
771de890a1e48d40238dac69f302708dde8719de240Steven Lang
772de890a1e48d40238dac69f302708dde8719de240Steven Langstatic void *
773de890a1e48d40238dac69f302708dde8719de240Steven Langget_pointer_ushort4(GLcontext *ctx, struct gl_renderbuffer *rb,
774de890a1e48d40238dac69f302708dde8719de240Steven Lang                    GLint x, GLint y)
775de890a1e48d40238dac69f302708dde8719de240Steven Lang{
776de890a1e48d40238dac69f302708dde8719de240Steven Lang   if (!rb->Data)
777de890a1e48d40238dac69f302708dde8719de240Steven Lang      return NULL;
778de890a1e48d40238dac69f302708dde8719de240Steven Lang   ASSERT(rb->DataType == GL_UNSIGNED_SHORT || rb->DataType == GL_SHORT);
779de890a1e48d40238dac69f302708dde8719de240Steven Lang   return (GLushort *) rb->Data + 4 * (y * rb->Width + x);
780de890a1e48d40238dac69f302708dde8719de240Steven Lang}
781de890a1e48d40238dac69f302708dde8719de240Steven Lang
782de890a1e48d40238dac69f302708dde8719de240Steven Lang
783de890a1e48d40238dac69f302708dde8719de240Steven Langstatic void
784de890a1e48d40238dac69f302708dde8719de240Steven Langget_row_ushort4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
785de890a1e48d40238dac69f302708dde8719de240Steven Lang                GLint x, GLint y, void *values)
786de890a1e48d40238dac69f302708dde8719de240Steven Lang{
787de890a1e48d40238dac69f302708dde8719de240Steven Lang   const GLshort *src = (const GLshort *) rb->Data + 4 * (y * rb->Width + x);
788de890a1e48d40238dac69f302708dde8719de240Steven Lang   ASSERT(rb->DataType == GL_UNSIGNED_SHORT || rb->DataType == GL_SHORT);
789de890a1e48d40238dac69f302708dde8719de240Steven Lang   _mesa_memcpy(values, src, 4 * count * sizeof(GLshort));
790de890a1e48d40238dac69f302708dde8719de240Steven Lang}
791de890a1e48d40238dac69f302708dde8719de240Steven Lang
792de890a1e48d40238dac69f302708dde8719de240Steven Lang
793de890a1e48d40238dac69f302708dde8719de240Steven Langstatic void
794de890a1e48d40238dac69f302708dde8719de240Steven Langget_values_ushort4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
795de890a1e48d40238dac69f302708dde8719de240Steven Lang                   const GLint x[], const GLint y[], void *values)
796de890a1e48d40238dac69f302708dde8719de240Steven Lang{
797de890a1e48d40238dac69f302708dde8719de240Steven Lang   GLushort *dst = (GLushort *) values;
798de890a1e48d40238dac69f302708dde8719de240Steven Lang   GLuint i;
799de890a1e48d40238dac69f302708dde8719de240Steven Lang   ASSERT(rb->DataType == GL_UNSIGNED_SHORT || rb->DataType == GL_SHORT);
800de890a1e48d40238dac69f302708dde8719de240Steven Lang   for (i = 0; i < count; i++) {
801de890a1e48d40238dac69f302708dde8719de240Steven Lang      const GLushort *src
802de890a1e48d40238dac69f302708dde8719de240Steven Lang         = (GLushort *) rb->Data + 4 * (y[i] * rb->Width + x[i]);
803de890a1e48d40238dac69f302708dde8719de240Steven Lang      dst[i] = *src;
804d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe   }
805d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe}
806d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe
807d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe
808d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboestatic void
809d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboeput_row_ushort4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
810d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe                GLint x, GLint y, const void *values, const GLubyte *mask)
811d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe{
812d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe   const GLushort *src = (const GLushort *) values;
813d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe   GLushort *dst = (GLushort *) rb->Data + 4 * (y * rb->Width + x);
814d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT || rb->DataType == GL_SHORT);
815d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe   if (mask) {
816d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe      GLuint i;
817d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe      for (i = 0; i < count; i++) {
818d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe         if (mask[i]) {
819d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe            dst[i * 4 + 0] = src[i * 4 + 0];
820d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe            dst[i * 4 + 1] = src[i * 4 + 1];
821d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe            dst[i * 4 + 2] = src[i * 4 + 2];
8229dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe            dst[i * 4 + 3] = src[i * 4 + 3];
8239dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe         }
8249dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe      }
8259dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe   }
8269dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe   else {
8279dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe      _mesa_memcpy(dst, src, 4 * count * sizeof(GLushort));
8289dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe   }
8299dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe}
8309dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe
8319dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe
8329dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboestatic void
8339dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboeput_row_rgb_ushort4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
8349dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe                    GLint x, GLint y, const void *values, const GLubyte *mask)
8359dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe{
8369dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe   /* Put RGB values in RGBA buffer */
8379dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe   const GLushort *src = (const GLushort *) values;
8389dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe   GLushort *dst = (GLushort *) rb->Data + 4 * (y * rb->Width + x);
8399dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT || rb->DataType == GL_SHORT);
8409dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe   if (mask) {
8419dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe      GLuint i;
842de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      for (i = 0; i < count; i++) {
843de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe         if (mask[i]) {
844de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe            dst[i * 4 + 0] = src[i * 3 + 0];
845de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe            dst[i * 4 + 1] = src[i * 3 + 1];
846de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe            dst[i * 4 + 2] = src[i * 3 + 2];
847de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe            dst[i * 4 + 3] = 0xffff;
848de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe         }
849de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      }
850de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   }
851de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   else {
852de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      _mesa_memcpy(dst, src, 4 * count * sizeof(GLushort));
853de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   }
854de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe}
855de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe
856de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe
857de98bd30b02bd89a78059d162b2c8426e889703dJens Axboestatic void
858de98bd30b02bd89a78059d162b2c8426e889703dJens Axboeput_mono_row_ushort4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
859de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                     GLint x, GLint y, const void *value, const GLubyte *mask)
860de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe{
861de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   const GLushort val0 = ((const GLushort *) value)[0];
862de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   const GLushort val1 = ((const GLushort *) value)[1];
863de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   const GLushort val2 = ((const GLushort *) value)[2];
864de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   const GLushort val3 = ((const GLushort *) value)[3];
865de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   GLushort *dst = (GLushort *) rb->Data + 4 * (y * rb->Width + x);
866de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT || rb->DataType == GL_SHORT);
867de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   if (!mask && val0 == 0 && val1 == 0 && val2 == 0 && val3 == 0) {
868de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      /* common case for clearing accum buffer */
869de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      _mesa_bzero(dst, count * 4 * sizeof(GLushort));
870de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   }
871de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   else {
872de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      GLuint i;
873de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      for (i = 0; i < count; i++) {
874de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe         if (!mask || mask[i]) {
875de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe            dst[i * 4 + 0] = val0;
876de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe            dst[i * 4 + 1] = val1;
877de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe            dst[i * 4 + 2] = val2;
878de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe            dst[i * 4 + 3] = val3;
879de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe         }
880de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      }
881e25b6d5a0a16b978385bfb93a4c156b03363d136Jens Axboe   }
882de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe}
883de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe
884de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe
885de98bd30b02bd89a78059d162b2c8426e889703dJens Axboestatic void
886de98bd30b02bd89a78059d162b2c8426e889703dJens Axboeput_values_ushort4(GLcontext *ctx, struct gl_renderbuffer *rb, GLuint count,
887de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                   const GLint x[], const GLint y[], const void *values,
888de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                   const GLubyte *mask)
889de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe{
890de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   const GLushort *src = (const GLushort *) values;
891de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   GLuint i;
892de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT || rb->DataType == GL_SHORT);
893de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   for (i = 0; i < count; i++) {
894de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      if (!mask || mask[i]) {
895de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe         GLushort *dst = (GLushort *) rb->Data + 4 * (y[i] * rb->Width + x[i]);
896de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe         dst[0] = src[i * 4 + 0];
897de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe         dst[1] = src[i * 4 + 1];
898de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe         dst[2] = src[i * 4 + 2];
899de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe         dst[3] = src[i * 4 + 3];
900de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      }
901de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   }
902de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe}
903de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe
904de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe
905de98bd30b02bd89a78059d162b2c8426e889703dJens Axboestatic void
906de98bd30b02bd89a78059d162b2c8426e889703dJens Axboeput_mono_values_ushort4(GLcontext *ctx, struct gl_renderbuffer *rb,
907de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                        GLuint count, const GLint x[], const GLint y[],
908de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe                        const void *value, const GLubyte *mask)
909de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe{
910de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   const GLushort val0 = ((const GLushort *) value)[0];
911de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   const GLushort val1 = ((const GLushort *) value)[1];
912de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   const GLushort val2 = ((const GLushort *) value)[2];
913de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   const GLushort val3 = ((const GLushort *) value)[3];
914de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   GLuint i;
915de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   ASSERT(rb->DataType == GL_UNSIGNED_SHORT || rb->DataType == GL_SHORT);
916de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   for (i = 0; i < count; i++) {
917de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      if (!mask || mask[i]) {
918f9633d729f0d2067c3f79b5e82e7129de1e650cdJens Axboe         GLushort *dst = (GLushort *) rb->Data + 4 * (y[i] * rb->Width + x[i]);
919f9633d729f0d2067c3f79b5e82e7129de1e650cdJens Axboe         dst[0] = val0;
920f9633d729f0d2067c3f79b5e82e7129de1e650cdJens Axboe         dst[1] = val1;
921f9633d729f0d2067c3f79b5e82e7129de1e650cdJens Axboe         dst[2] = val2;
922f9633d729f0d2067c3f79b5e82e7129de1e650cdJens Axboe         dst[3] = val3;
923f9633d729f0d2067c3f79b5e82e7129de1e650cdJens Axboe      }
924de890a1e48d40238dac69f302708dde8719de240Steven Lang   }
925906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe}
926906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe
927906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe
928906c8d75eef9247c02d1f1f6771b6fa2338329faJens Axboe
929b7cfb2e18ba4815aa74eaf5d8637d466a51b712dJens Axboe/**
93046bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe * This is a software fallback for the gl_renderbuffer->AllocStorage
931ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * function.
932af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe * Device drivers will typically override this function for the buffers
933af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe * which it manages (typically color buffers, Z and stencil).
934e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe * Other buffers (like software accumulation and aux buffers) which the driver
935de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe * doesn't manage can be handled with this function.
936ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe *
937ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * This one multi-purpose function can allocate stencil, depth, accum, color
938ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * or color-index buffers!
939ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe *
940ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * This function also plugs in the appropriate GetPointer, Get/PutRow and
941ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * Get/PutValues functions.
942ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe */
943d72be5454c8c5378f16804ff9b8d1afe8729a380Jens AxboeGLboolean
944d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe_mesa_soft_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
945cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe                                GLenum internalFormat,
946cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe                                GLuint width, GLuint height)
947cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe{
948f9633d729f0d2067c3f79b5e82e7129de1e650cdJens Axboe   GLuint pixelSize;
949cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe
950cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe   /* first clear these fields */
951cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe   rb->RedBits =
952cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe   rb->GreenBits =
95346bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe   rb->BlueBits =
95446bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe   rb->AlphaBits =
95558c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe   rb->IndexBits =
9566625155407de739e1e857419b7b4fb62f6c6bb2eJens Axboe   rb->DepthBits =
95758c55ba02aca24ed30beb343fcb1dc3df4667389Jens Axboe   rb->StencilBits = 0;
958de890a1e48d40238dac69f302708dde8719de240Steven Lang
959205927a3cfc25baeb318e3aedf3ac29d16bf4be9Jens Axboe   switch (internalFormat) {
960df64119de537aba99c85d1dc80190b354589f8b9Jens Axboe   case GL_RGB:
961de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   case GL_R3_G3_B2:
962690adba373bb8c97a365c67da369e265953c4b4cJens Axboe   case GL_RGB4:
963690adba373bb8c97a365c67da369e265953c4b4cJens Axboe   case GL_RGB5:
964e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe   case GL_RGB8:
965de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   case GL_RGB10:
966e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe   case GL_RGB12:
96780be24f4671164d597463e4b5c794d4cbd0a4537Jens Axboe   case GL_RGB16:
968de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      rb->_ActualFormat = GL_RGB8;
969e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe      rb->_BaseFormat = GL_RGB;
9707b05a215c8c39b8c878297b90eba112fe9176542Jens Axboe      rb->DataType = GL_UNSIGNED_BYTE;
971de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      rb->GetPointer = get_pointer_ubyte3;
972de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      rb->GetRow = get_row_ubyte3;
973af52b3455ad892322aab2791282b6bd4efdfdbf3Jens Axboe      rb->GetValues = get_values_ubyte3;
9740af7b542b69af5ab2400a9960a5bcde82c05723fJens Axboe      rb->PutRow = put_row_ubyte3;
975ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutRowRGB = put_row_rgb_ubyte3;
9764e991c23d2d06484f581eb5e2105bc102cb35941Jens Axboe      rb->PutMonoRow = put_mono_row_ubyte3;
9774e991c23d2d06484f581eb5e2105bc102cb35941Jens Axboe      rb->PutValues = put_values_ubyte3;
978e0a223354342cc45a916b669343718b80a20c2eaJens Axboe      rb->PutMonoValues = put_mono_values_ubyte3;
9799e684a4976b7934f5ce011ea281dfef3352e5738Dan Ehrenberg      rb->RedBits   = 8 * sizeof(GLubyte);
9809e684a4976b7934f5ce011ea281dfef3352e5738Dan Ehrenberg      rb->GreenBits = 8 * sizeof(GLubyte);
981de890a1e48d40238dac69f302708dde8719de240Steven Lang      rb->BlueBits  = 8 * sizeof(GLubyte);
982de890a1e48d40238dac69f302708dde8719de240Steven Lang      rb->AlphaBits = 0;
983de890a1e48d40238dac69f302708dde8719de240Steven Lang      pixelSize = 3 * sizeof(GLubyte);
984de890a1e48d40238dac69f302708dde8719de240Steven Lang      break;
985de890a1e48d40238dac69f302708dde8719de240Steven Lang   case GL_RGBA:
986de890a1e48d40238dac69f302708dde8719de240Steven Lang   case GL_RGBA2:
987de890a1e48d40238dac69f302708dde8719de240Steven Lang   case GL_RGBA4:
98807eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe   case GL_RGB5_A1:
98907eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe   case GL_RGBA8:
99007eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe      rb->_ActualFormat = GL_RGBA8;
99107eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe      rb->_BaseFormat = GL_RGBA;
99207eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe      rb->DataType = GL_UNSIGNED_BYTE;
99307eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe      rb->GetPointer = get_pointer_ubyte4;
99407eb79dfa0e3801875d1c2907cfdb5da7c9d2cb3Jens Axboe      rb->GetRow = get_row_ubyte4;
995521da527743088a9bd2ab882f8b64799d49d5848Jens Axboe      rb->GetValues = get_values_ubyte4;
996ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutRow = put_row_ubyte4;
997de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      rb->PutRowRGB = put_row_rgb_ubyte4;
998de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      rb->PutMonoRow = put_mono_row_ubyte4;
999de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      rb->PutValues = put_values_ubyte4;
1000833491908a1afd67d27ce79257de3a4d80143d9fYu-ju Hong      rb->PutMonoValues = put_mono_values_ubyte4;
10016eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li      rb->RedBits   = 8 * sizeof(GLubyte);
10026eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li      rb->GreenBits = 8 * sizeof(GLubyte);
10036eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li      rb->BlueBits  = 8 * sizeof(GLubyte);
10046eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li      rb->AlphaBits = 8 * sizeof(GLubyte);
10056eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li      pixelSize = 4 * sizeof(GLubyte);
10066eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li      break;
1007de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   case GL_RGB10_A2:
1008ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   case GL_RGBA12:
1009de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe   case GL_RGBA16:
10103c5df6fa2259c12fd6a7beb9a3521dec76d12dd2Jens Axboe      rb->_ActualFormat = GL_RGBA16;
1011ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->_BaseFormat = GL_RGBA;
10123c5df6fa2259c12fd6a7beb9a3521dec76d12dd2Jens Axboe      rb->DataType = GL_UNSIGNED_SHORT;
1013ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->GetPointer = get_pointer_ushort4;
1014ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->GetRow = get_row_ushort4;
10153c5df6fa2259c12fd6a7beb9a3521dec76d12dd2Jens Axboe      rb->GetValues = get_values_ushort4;
1016ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutRow = put_row_ushort4;
10179dbc7bfe8aab6def3e2b51edd57942371e4e5366Jens Axboe      rb->PutRowRGB = put_row_rgb_ushort4;
101893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran      rb->PutMonoRow = put_mono_row_ushort4;
10199c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe      rb->PutValues = put_values_ushort4;
102093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran      rb->PutMonoValues = put_mono_values_ushort4;
10219c60ce649d3f976d196709d4399bb7c540ce97b5Jens Axboe      rb->RedBits   = 8 * sizeof(GLushort);
1022ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->GreenBits = 8 * sizeof(GLushort);
1023ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->BlueBits  = 8 * sizeof(GLushort);
1024ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->AlphaBits = 8 * sizeof(GLushort);
102522f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe      pixelSize = 4 * sizeof(GLushort);
102622f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe      break;
102722f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe#if 00
102822f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe   case GL_ALPHA8:
1029ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->_ActualFormat = GL_ALPHA8;
103022f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe      rb->_BaseFormat = GL_RGBA; /* Yes, not GL_ALPHA! */
103122f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe      rb->DataType = GL_UNSIGNED_BYTE;
103222f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe      rb->GetPointer = get_pointer_alpha8;
103322f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe      rb->GetRow = get_row_alpha8;
1034ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->GetValues = get_values_alpha8;
1035de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      rb->PutRow = put_row_alpha8;
1036de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      rb->PutRowRGB = NULL;
103701452055af61d6f5de543575dba3ebb0c9e55fabJens Axboe      rb->PutMonoRow = put_mono_row_alpha8;
1038f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe      rb->PutValues = put_values_alpha8;
1039b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe      rb->PutMonoValues = put_mono_values_alpha8;
1040b7cfb2e18ba4815aa74eaf5d8637d466a51b712dJens Axboe      rb->RedBits   = 0; /*red*/
10412f122b135b7319ff8dd04dadf31ff28b301051a3Jens Axboe      rb->GreenBits = 0; /*green*/
1042807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe      rb->BlueBits  = 0; /*blue*/
10430353050fe32065e1932a43a7c39a7c390ea71142Jens Axboe      rb->AlphaBits = 8 * sizeof(GLubyte);
1044d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      pixelSize = sizeof(GLubyte);
1045d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      break;
1046f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe#endif
104722f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe   case GL_STENCIL_INDEX:
104822f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe   case GL_STENCIL_INDEX1_EXT:
104922f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe   case GL_STENCIL_INDEX4_EXT:
105022f80458a520d0c5371c64bf91d24cdd21dff825Jens Axboe   case GL_STENCIL_INDEX8_EXT:
1051d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->_ActualFormat = GL_STENCIL_INDEX8_EXT;
1052d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->_BaseFormat = GL_STENCIL_INDEX;
1053d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->DataType = GL_UNSIGNED_BYTE;
1054d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->GetPointer = get_pointer_ubyte;
1055d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->GetRow = get_row_ubyte;
1056d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->GetValues = get_values_ubyte;
1057d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->PutRow = put_row_ubyte;
1058d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->PutRowRGB = NULL;
1059d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->PutMonoRow = put_mono_row_ubyte;
1060d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->PutValues = put_values_ubyte;
1061d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->PutMonoValues = put_mono_values_ubyte;
1062d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->StencilBits = 8 * sizeof(GLubyte);
1063d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      pixelSize = sizeof(GLubyte);
1064d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      break;
1065d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe   case GL_STENCIL_INDEX16_EXT:
1066d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->_ActualFormat = GL_STENCIL_INDEX16_EXT;
1067d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->_BaseFormat = GL_STENCIL_INDEX;
1068d21e253540e701bbe78ec2fe1f9a5c5a0c980db7Jens Axboe      rb->DataType = GL_UNSIGNED_SHORT;
1069de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      rb->GetPointer = get_pointer_ushort;
1070f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe      rb->GetRow = get_row_ushort;
1071f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe      rb->GetValues = get_values_ushort;
1072f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe      rb->PutRow = put_row_ushort;
1073f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe      rb->PutRowRGB = NULL;
1074f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe      rb->PutMonoRow = put_mono_row_ushort;
10756eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li      rb->PutValues = put_values_ushort;
10766eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li      rb->PutMonoValues = put_mono_values_ushort;
1077f8977ee606bc51138a77f6a1b653df00faa77742Jens Axboe      rb->StencilBits = 8 * sizeof(GLushort);
1078b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe      pixelSize = sizeof(GLushort);
10796d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe      break;
1080c6ae0a5b8123ea9af2ce70319081fbd5d65c8093Jens Axboe   case GL_DEPTH_COMPONENT:
1081ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   case GL_DEPTH_COMPONENT16:
1082ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->_ActualFormat = GL_DEPTH_COMPONENT16;
1083ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->_BaseFormat = GL_DEPTH_COMPONENT;
1084ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->DataType = GL_UNSIGNED_SHORT;
1085ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->GetPointer = get_pointer_ushort;
1086de98bd30b02bd89a78059d162b2c8426e889703dJens Axboe      rb->GetRow = get_row_ushort;
1087ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->GetValues = get_values_ushort;
1088de890a1e48d40238dac69f302708dde8719de240Steven Lang      rb->PutRow = put_row_ushort;
1089ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutRowRGB = NULL;
1090ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutMonoRow = put_mono_row_ushort;
1091ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutValues = put_values_ushort;
1092ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutMonoValues = put_mono_values_ushort;
10932dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe      rb->DepthBits = 8 * sizeof(GLushort);
10942dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe      pixelSize = sizeof(GLushort);
109592c1d41f9cb4da2513ad261552f92511d69f6b8eJens Axboe      break;
1096e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe   case GL_DEPTH_COMPONENT24:
1097e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe   case GL_DEPTH_COMPONENT32:
10982dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe      rb->_BaseFormat = GL_DEPTH_COMPONENT;
1099e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe      rb->DataType = GL_UNSIGNED_INT;
11004e6ea2f1e9b7da6d7d1057670fcc19f063e46fd4Jens Axboe      rb->GetPointer = get_pointer_uint;
1101e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe      rb->GetRow = get_row_uint;
1102e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe      rb->GetValues = get_values_uint;
1103e132cbae2cf26736af86fede134c14d41dae4a5aJens Axboe      rb->PutRow = put_row_uint;
1104751548451d969148529b642c05e7544726ec3b64Jens Axboe      rb->PutRowRGB = NULL;
1105ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutMonoRow = put_mono_row_uint;
110646bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe      rb->PutValues = put_values_uint;
1107ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutMonoValues = put_mono_values_uint;
1108ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      if (internalFormat == GL_DEPTH_COMPONENT24) {
11093c5df6fa2259c12fd6a7beb9a3521dec76d12dd2Jens Axboe         rb->_ActualFormat = GL_DEPTH_COMPONENT24;
1110ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe         rb->DepthBits = 24;
1111ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      }
1112ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      else {
1113ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe         rb->_ActualFormat = GL_DEPTH_COMPONENT32;
1114ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe         rb->DepthBits = 32;
1115ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      }
111679d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      pixelSize = sizeof(GLuint);
111779d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      break;
111879d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe   case GL_DEPTH_STENCIL_EXT:
111946bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe   case GL_DEPTH24_STENCIL8_EXT:
112079d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->_ActualFormat = GL_DEPTH24_STENCIL8_EXT;
112179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->_BaseFormat = GL_DEPTH_STENCIL_EXT;
112279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->DataType = GL_UNSIGNED_INT_24_8_EXT;
112379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->GetPointer = get_pointer_uint;
112479d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->GetRow = get_row_uint;
112579d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->GetValues = get_values_uint;
112679d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->PutRow = put_row_uint;
112779d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->PutRowRGB = NULL;
112879d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->PutMonoRow = put_mono_row_uint;
112979d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->PutValues = put_values_uint;
113079d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->PutMonoValues = put_mono_values_uint;
113146bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe      rb->DepthBits = 24;
113279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->StencilBits = 8;
113379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      pixelSize = sizeof(GLuint);
113479d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      break;
113579d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe   case GL_COLOR_INDEX8_EXT:
1136de890a1e48d40238dac69f302708dde8719de240Steven Lang      rb->_ActualFormat = GL_COLOR_INDEX8_EXT;
113779d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->_BaseFormat = GL_COLOR_INDEX;
113879d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->DataType = GL_UNSIGNED_BYTE;
113979d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->GetPointer = get_pointer_ubyte;
1140de890a1e48d40238dac69f302708dde8719de240Steven Lang      rb->GetRow = get_row_ubyte;
114179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->GetValues = get_values_ubyte;
114279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->PutRow = put_row_ubyte;
114379d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->PutRowRGB = NULL;
114479d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->PutMonoRow = put_mono_row_ubyte;
114579d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->PutValues = put_values_ubyte;
114679d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->PutMonoValues = put_mono_values_ubyte;
114779d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->IndexBits = 8 * sizeof(GLubyte);
114879d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      pixelSize = sizeof(GLubyte);
114979d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      break;
115046bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe   case GL_COLOR_INDEX16_EXT:
115179d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->_ActualFormat = GL_COLOR_INDEX16_EXT;
115279d16311c8d0c7188d73df77838fb1b4b6ff58dbJens Axboe      rb->_BaseFormat = GL_COLOR_INDEX;
115301f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      rb->DataType = GL_UNSIGNED_SHORT;
115401f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      rb->GetPointer = get_pointer_ushort;
1155ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe      rb->GetRow = get_row_ushort;
1156ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe      rb->GetValues = get_values_ushort;
1157ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe      rb->PutRow = put_row_ushort;
115801f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      rb->PutRowRGB = NULL;
115901f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      rb->PutMonoRow = put_mono_row_ushort;
116001f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      rb->PutValues = put_values_ushort;
116101f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      rb->PutMonoValues = put_mono_values_ushort;
1162ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe      rb->IndexBits = 8 * sizeof(GLushort);
1163ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe      pixelSize = sizeof(GLushort);
1164ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe      break;
1165ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe   case COLOR_INDEX32:
1166ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe      rb->_ActualFormat = COLOR_INDEX32;
116701f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      rb->_BaseFormat = GL_COLOR_INDEX;
116801f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      rb->DataType = GL_UNSIGNED_INT;
1169ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->GetPointer = get_pointer_uint;
1170ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->GetRow = get_row_uint;
1171ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->GetValues = get_values_uint;
1172ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutRow = put_row_uint;
1173ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutRowRGB = NULL;
1174ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutMonoRow = put_mono_row_uint;
1175ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      rb->PutValues = put_values_uint;
11765cc2da300b3fc30e00b79b4ddb3f372df3b2fe93Ingo Molnar      rb->PutMonoValues = put_mono_values_uint;
11775cc2da300b3fc30e00b79b4ddb3f372df3b2fe93Ingo Molnar      rb->IndexBits = 8 * sizeof(GLuint);
117876cd9378b90dddf2cedc9a5d49f317aaad485b90Jens Axboe      pixelSize = sizeof(GLuint);
1179ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      break;
1180ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   default:
1181ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      _mesa_problem(ctx, "Bad internalFormat in _mesa_soft_renderbuffer_storage");
1182ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      return GL_FALSE;
1183ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   }
1184ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1185313cb206ffc6e50c089314d322ebf1c523f37531Jens Axboe   ASSERT(rb->DataType);
1186072619835aa805f3335dca9d72f4d4eb1009aecdJens Axboe   ASSERT(rb->GetPointer);
1187072619835aa805f3335dca9d72f4d4eb1009aecdJens Axboe   ASSERT(rb->GetRow);
118846bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe   ASSERT(rb->GetValues);
1189ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   ASSERT(rb->PutRow);
1190e1f365035a952233463d85d659bd960ba78f012eJens Axboe   ASSERT(rb->PutMonoRow);
1191ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   ASSERT(rb->PutValues);
1192fee3bb48f748afe5cf10f8505e1efd36b87c627eJens Axboe   ASSERT(rb->PutMonoValues);
1193ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1194ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   /* free old buffer storage */
11950c7e37a04aa04ba22e812f8de7971fcef46b8191Jens Axboe   if (rb->Data) {
1196097b2991ace8e069dbfb0c2286d31da714247573Jens Axboe      _mesa_free(rb->Data);
1197ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe      rb->Data = NULL;
119801f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe   }
11993b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe
12003b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   if (width > 0 && height > 0) {
1201ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      /* allocate new buffer storage */
120250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe      rb->Data = _mesa_malloc(width * height * pixelSize);
120350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe      if (rb->Data == NULL) {
120450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe         rb->Width = 0;
120550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe         rb->Height = 0;
120650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe         _mesa_error(ctx, GL_OUT_OF_MEMORY,
120750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe                     "software renderbuffer allocation (%d x %d x %d)",
120850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe                     width, height, pixelSize);
12095a729cbec53a158fa8d8dc5737749cfee20ab31bAaron Carroll         return GL_FALSE;
121050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe      }
121150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe   }
121250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
121350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe   rb->Width = width;
1214ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   rb->Height = height;
1215ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1216ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   return GL_TRUE;
12177f7e6e59f48bbd754847c825075a9c46962e0116Jens Axboe}
12187f7e6e59f48bbd754847c825075a9c46962e0116Jens Axboe
12197f7e6e59f48bbd754847c825075a9c46962e0116Jens Axboe
12207f7e6e59f48bbd754847c825075a9c46962e0116Jens Axboe
12217f7e6e59f48bbd754847c825075a9c46962e0116Jens Axboe/**********************************************************************/
12227f7e6e59f48bbd754847c825075a9c46962e0116Jens Axboe/**********************************************************************/
1223ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe/**********************************************************************/
12243b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe
12253b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe
1226b7c6302da8b30f221310dd6c917136229ee5e688Jens Axboe/**
12273b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe * Here we utilize the gl_renderbuffer->Wrapper field to put an alpha
12280c7e37a04aa04ba22e812f8de7971fcef46b8191Jens Axboe * buffer wrapper around an existing RGB renderbuffer (hw or sw).
12297c124ac153eebf48bc85f9033ae06fd7152e4216Jens Axboe *
1230ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe * When PutRow is called (for example), we store the alpha values in
1231ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe * this buffer, then pass on the PutRow call to the wrapped RGB
1232ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe * buffer.
1233ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe */
1234ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe
123550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
123650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboestatic GLboolean
123750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboealloc_storage_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb,
123843f747922e001a7bfb904dfcaa51934b986345aeJens Axboe                     GLenum internalFormat, GLuint width, GLuint height)
1239ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe{
1240ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe   ASSERT(arb != arb->Wrapped);
1241ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe   ASSERT(arb->_ActualFormat == GL_ALPHA8);
1242cdc7f1936e07f3b51aaa96c589e43abd7fea0051gurudas pai
1243ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe   /* first, pass the call to the wrapped RGB buffer */
1244cdc7f1936e07f3b51aaa96c589e43abd7fea0051gurudas pai   if (!arb->Wrapped->AllocStorage(ctx, arb->Wrapped, internalFormat,
12456c7c7da18aa2ab744b9485482e64acd30f31da6dJens Axboe                                  width, height)) {
1246cdc7f1936e07f3b51aaa96c589e43abd7fea0051gurudas pai      return GL_FALSE;
1247ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   }
1248ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
124984dd18865235caa675424c62a4624618ff961d78Bruce Cran   /* next, resize my alpha buffer */
125001f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe   if (arb->Data) {
125101f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      _mesa_free(arb->Data);
12525ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe   }
12535ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe
1254088b42076dcbadf4d61367e19e49cb0d12aaadd1Jens Axboe   arb->Data = _mesa_malloc(width * height * sizeof(GLubyte));
12556c7c7da18aa2ab744b9485482e64acd30f31da6dJens Axboe   if (arb->Data == NULL) {
1256ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      arb->Width = 0;
12577a4b80a14c6ac6d47d486b1f5d1f166fa7065ee3Jens Axboe      arb->Height = 0;
12587a4b80a14c6ac6d47d486b1f5d1f166fa7065ee3Jens Axboe      _mesa_error(ctx, GL_OUT_OF_MEMORY, "software alpha buffer allocation");
125901f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      return GL_FALSE;
126001f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe   }
126101f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe
126201f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe   arb->Width = width;
126301f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe   arb->Height = height;
126401f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe
1265ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   return GL_TRUE;
1266ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
1267cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe
1268097b2991ace8e069dbfb0c2286d31da714247573Jens Axboe
1269097b2991ace8e069dbfb0c2286d31da714247573Jens Axboe/**
1270cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe * Delete an alpha_renderbuffer object, as well as the wrapped RGB buffer.
1271cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe */
1272097b2991ace8e069dbfb0c2286d31da714247573Jens Axboestatic void
1273cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboedelete_renderbuffer_alpha8(struct gl_renderbuffer *arb)
1274cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe{
1275de890a1e48d40238dac69f302708dde8719de240Steven Lang   if (arb->Data) {
127645410acb636e526575d62a037f81ade7916b738cJens Axboe      _mesa_free(arb->Data);
127745410acb636e526575d62a037f81ade7916b738cJens Axboe   }
127845410acb636e526575d62a037f81ade7916b738cJens Axboe   ASSERT(arb->Wrapped);
127945410acb636e526575d62a037f81ade7916b738cJens Axboe   ASSERT(arb != arb->Wrapped);
1280ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   arb->Wrapped->Delete(arb->Wrapped);
1281972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe   arb->Wrapped = NULL;
1282972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe   _mesa_free(arb);
1283972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe}
1284f94819192600fe35d03ebed26a803abdc2b9864cJens Axboe
12852dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe
1286972cfd2546081c0397447ca9243ea419b1ff579aJens Axboestatic void *
1287972cfd2546081c0397447ca9243ea419b1ff579aJens Axboeget_pointer_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb,
1288972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe                   GLint x, GLint y)
12893b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe{
12903b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   return NULL;   /* don't allow direct access! */
12913b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe}
129250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
129350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
129450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboestatic void
129550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboeget_row_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,
129650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe               GLint x, GLint y, void *values)
129750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe{
129850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe   /* NOTE: 'values' is RGBA format! */
129950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe   const GLubyte *src = (const GLubyte *) arb->Data + y * arb->Width + x;
1300ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   GLubyte *dst = (GLubyte *) values;
1301ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   GLuint i;
1302e1f365035a952233463d85d659bd960ba78f012eJens Axboe   ASSERT(arb != arb->Wrapped);
1303b6754f9d3f719627d8aae4c3e8f39212d9405f99Jens Axboe   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);
13047c124ac153eebf48bc85f9033ae06fd7152e4216Jens Axboe   /* first, pass the call to the wrapped RGB buffer */
1305ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe   arb->Wrapped->GetRow(ctx, arb->Wrapped, count, x, y, values);
1306ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe   /* second, fill in alpha values from this buffer! */
1307ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe   for (i = 0; i < count; i++) {
1308ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe      dst[i * 4 + 3] = src[i];
1309ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe   }
1310ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe}
13117c124ac153eebf48bc85f9033ae06fd7152e4216Jens Axboe
1312ccf8f1273301ccb286636ff169a7d47e09f47a90Jens Axboe
13137c124ac153eebf48bc85f9033ae06fd7152e4216Jens Axboestatic void
13144ae3f76333bf2382e516db0b5c202b8982b1170fJens Axboeget_values_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,
1315aea47d444b02bd7c622f82bb73151fd7136a499fJens Axboe                  const GLint x[], const GLint y[], void *values)
13163b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe{
13173b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   GLubyte *dst = (GLubyte *) values;
13183b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   GLuint i;
13193b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   ASSERT(arb != arb->Wrapped);
13203b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);
13213b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   /* first, pass the call to the wrapped RGB buffer */
13223b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   arb->Wrapped->GetValues(ctx, arb->Wrapped, count, x, y, values);
13233b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   /* second, fill in alpha values from this buffer! */
1324ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   for (i = 0; i < count; i++) {
1325ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      const GLubyte *src = (GLubyte *) arb->Data + y[i] * arb->Width + x[i];
13263b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe      dst[i * 4 + 3] = *src;
13273b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   }
13283b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe}
13293b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe
13303b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe
13313b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboestatic void
133246bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboeput_row_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,
13333b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe               GLint x, GLint y, const void *values, const GLubyte *mask)
1334b1508cf9ead36dc789a4e289f7522a070e57058cJens Axboe{
1335b1508cf9ead36dc789a4e289f7522a070e57058cJens Axboe   const GLubyte *src = (const GLubyte *) values;
133645410acb636e526575d62a037f81ade7916b738cJens Axboe   GLubyte *dst = (GLubyte *) arb->Data + y * arb->Width + x;
13373b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   GLuint i;
13383b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   ASSERT(arb != arb->Wrapped);
13393b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);
13403b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe   /* first, pass the call to the wrapped RGB buffer */
13417c124ac153eebf48bc85f9033ae06fd7152e4216Jens Axboe   arb->Wrapped->PutRow(ctx, arb->Wrapped, count, x, y, values, mask);
1342ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   /* second, store alpha in our buffer */
1343cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe   for (i = 0; i < count; i++) {
1344cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe      if (!mask || mask[i]) {
1345cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe         dst[i] = src[i * 4 + 3];
13467e356b2dee2e86f3684424fc6e903f1ef9f00ef4Jens Axboe      }
13477e356b2dee2e86f3684424fc6e903f1ef9f00ef4Jens Axboe   }
13487e356b2dee2e86f3684424fc6e903f1ef9f00ef4Jens Axboe}
13497e356b2dee2e86f3684424fc6e903f1ef9f00ef4Jens Axboe
13507e356b2dee2e86f3684424fc6e903f1ef9f00ef4Jens Axboe
13517e356b2dee2e86f3684424fc6e903f1ef9f00ef4Jens Axboestatic void
13523b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboeput_row_rgb_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,
13533b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe                   GLint x, GLint y, const void *values, const GLubyte *mask)
13543b8b7135602a4d3a7132fee10da9c1203ab643adJens Axboe{
1355ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   const GLubyte *src = (const GLubyte *) values;
1356ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   GLubyte *dst = (GLubyte *) arb->Data + y * arb->Width + x;
13572577594dd6e2857d9efbf6bd81cd7ef507dbcd64Jens Axboe   GLuint i;
135850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe   ASSERT(arb != arb->Wrapped);
13595a729cbec53a158fa8d8dc5737749cfee20ab31bAaron Carroll   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);
136045410acb636e526575d62a037f81ade7916b738cJens Axboe   /* first, pass the call to the wrapped RGB buffer */
1361ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   arb->Wrapped->PutRowRGB(ctx, arb->Wrapped, count, x, y, values, mask);
1362ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   /* second, store alpha in our buffer */
1363ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   for (i = 0; i < count; i++) {
1364ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      if (!mask || mask[i]) {
1365ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe         dst[i] = src[i * 4 + 3];
1366ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      }
1367375b2695693f56987e23deef3ded8e5b06ef6797Jens Axboe   }
13688c029376bbe6d8a6bcb01c3ef7d545720aca3868Jens Axboe}
13698b28bd41375930664a0ff9ff9b101a88ac416ac5Dmitry Monakhov
1370ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1371ee738499877bb1ee913e839cb4a8d4edad2d52adJens Axboestatic void
1372ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboeput_mono_row_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,
1373214e1ecae844a32bf8f66d19132f4948d922dceeJens Axboe                    GLint x, GLint y, const void *value, const GLubyte *mask)
1374ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
1375ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   const GLubyte val = ((const GLubyte *) value)[3];
1376ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   GLubyte *dst = (GLubyte *) arb->Data + y * arb->Width + x;
137745378b35a047b590d0d3b6f9a7b8fea6dfa47300Jens Axboe   ASSERT(arb != arb->Wrapped);
13784785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);
13793d43382c7864753728b181ac356222d67bdd4a3fJens Axboe   /* first, pass the call to the wrapped RGB buffer */
138045378b35a047b590d0d3b6f9a7b8fea6dfa47300Jens Axboe   arb->Wrapped->PutMonoRow(ctx, arb->Wrapped, count, x, y, value, mask);
138183881283564820dabaa07c1bdea0e75e686efcaaJens Axboe   /* second, store alpha in our buffer */
138283881283564820dabaa07c1bdea0e75e686efcaaJens Axboe   if (mask) {
138383881283564820dabaa07c1bdea0e75e686efcaaJens Axboe      GLuint i;
1384111e032d60f2341cfe09accbfcf25ec81b9251e0Jens Axboe      for (i = 0; i < count; i++) {
138583881283564820dabaa07c1bdea0e75e686efcaaJens Axboe         if (mask[i]) {
1386b2cecdc28469f8042d6cc3d83d83b18086845f18liang xie            dst[i] = val;
138783881283564820dabaa07c1bdea0e75e686efcaaJens Axboe         }
138883881283564820dabaa07c1bdea0e75e686efcaaJens Axboe      }
138983881283564820dabaa07c1bdea0e75e686efcaaJens Axboe   }
1390f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe   else {
139175db6e2c168e895cd93504a7d20ddc853413e3b1Jens Axboe      _mesa_memset(dst, val, count);
1392f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe   }
139383881283564820dabaa07c1bdea0e75e686efcaaJens Axboe}
139423893646c9306b785f866fb9e976f3db673af0caJens Axboe
139583881283564820dabaa07c1bdea0e75e686efcaaJens Axboe
13965ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboestatic void
1397de890a1e48d40238dac69f302708dde8719de240Steven Langput_values_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb, GLuint count,
1398de890a1e48d40238dac69f302708dde8719de240Steven Lang                  const GLint x[], const GLint y[],
1399de890a1e48d40238dac69f302708dde8719de240Steven Lang                  const void *values, const GLubyte *mask)
1400de890a1e48d40238dac69f302708dde8719de240Steven Lang{
140183881283564820dabaa07c1bdea0e75e686efcaaJens Axboe   const GLubyte *src = (const GLubyte *) values;
140283881283564820dabaa07c1bdea0e75e686efcaaJens Axboe   GLuint i;
140383881283564820dabaa07c1bdea0e75e686efcaaJens Axboe   ASSERT(arb != arb->Wrapped);
1404e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);
1405e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe   /* first, pass the call to the wrapped RGB buffer */
140606464907159baf7a1eeac654a023743e33f28d86Jens Axboe   arb->Wrapped->PutValues(ctx, arb->Wrapped, count, x, y, values, mask);
140706464907159baf7a1eeac654a023743e33f28d86Jens Axboe   /* second, store alpha in our buffer */
140883881283564820dabaa07c1bdea0e75e686efcaaJens Axboe   for (i = 0; i < count; i++) {
14095ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe      if (!mask || mask[i]) {
141083881283564820dabaa07c1bdea0e75e686efcaaJens Axboe         GLubyte *dst = (GLubyte *) arb->Data + y[i] * arb->Width + x[i];
141183881283564820dabaa07c1bdea0e75e686efcaaJens Axboe         *dst = src[i * 4 + 3];
14122b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe      }
141383881283564820dabaa07c1bdea0e75e686efcaaJens Axboe   }
141483881283564820dabaa07c1bdea0e75e686efcaaJens Axboe}
141583881283564820dabaa07c1bdea0e75e686efcaaJens Axboe
141683881283564820dabaa07c1bdea0e75e686efcaaJens Axboe
141783881283564820dabaa07c1bdea0e75e686efcaaJens Axboestatic void
1418f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liuput_mono_values_alpha8(GLcontext *ctx, struct gl_renderbuffer *arb,
1419f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu                       GLuint count, const GLint x[], const GLint y[],
1420f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu                       const void *value, const GLubyte *mask)
1421aa58d2520204f5ae12291fae0289a90fb03dc587Jens Axboe{
142223893646c9306b785f866fb9e976f3db673af0caJens Axboe   const GLubyte val = ((const GLubyte *) value)[3];
14234785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe   GLuint i;
14244785f99523f5c69635eb4bd826f25cd2e264cda7Jens Axboe   ASSERT(arb != arb->Wrapped);
142579e48f72dea1639bcbee310c354938287b6d5790Jens Axboe   ASSERT(arb->DataType == GL_UNSIGNED_BYTE);
1426ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   /* first, pass the call to the wrapped RGB buffer */
14270b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   arb->Wrapped->PutValues(ctx, arb->Wrapped, count, x, y, value, mask);
14280b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   /* second, store alpha in our buffer */
14290b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   for (i = 0; i < count; i++) {
14300b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe      if (!mask || mask[i]) {
14310b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe         GLubyte *dst = (GLubyte *) arb->Data + y[i] * arb->Width + x[i];
14320b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe         *dst = val;
14330b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe      }
14340b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   }
14350b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe}
14360b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14370b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14380b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboestatic void
14390b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboecopy_buffer_alpha8(struct gl_renderbuffer* dst, struct gl_renderbuffer* src)
14400b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe{
14410b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   ASSERT(dst->_ActualFormat == GL_ALPHA8);
14420b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   ASSERT(src->_ActualFormat == GL_ALPHA8);
14430b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   ASSERT(dst->Width == src->Width);
14440b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   ASSERT(dst->Height == src->Height);
14450b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14460b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   _mesa_memcpy(dst->Data, src->Data, dst->Width * dst->Height * sizeof(GLubyte));
14470b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe}
14480b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14490b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14500b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe/**********************************************************************/
14510b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe/**********************************************************************/
14520b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe/**********************************************************************/
14530b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14540b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14550b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe/**
14560b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe * Default GetPointer routine.  Always return NULL to indicate that
14570b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe * direct buffer access is not supported.
14580b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe */
14590b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboestatic void *
14600b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboenop_get_pointer(GLcontext *ctx, struct gl_renderbuffer *rb, GLint x, GLint y)
14610b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe{
14620b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   return NULL;
14630b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe}
14640b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14650b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14660b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe/**
14670b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe * Initialize the fields of a gl_renderbuffer to default values.
14680b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe */
14690b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboevoid
14700b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe_mesa_init_renderbuffer(struct gl_renderbuffer *rb, GLuint name)
14710b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe{
14720b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   _glthread_INIT_MUTEX(rb->Mutex);
14730b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14740b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   rb->Magic = RB_MAGIC;
14750b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   rb->ClassID = 0;
14760b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   rb->Name = name;
14770b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   rb->RefCount = 0;
14780b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   rb->Delete = _mesa_delete_renderbuffer;
14790b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe
14800b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe   /* The rest of these should be set later by the caller of this function or
14810b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe    * the AllocStorage method:
14820b8d11ed135ac467c071c2ae0fe4f3a69a3b8febJens Axboe    */
148302444ad1868ee94c7c38810cc775784e6a9a5dbeJens Axboe   rb->AllocStorage = NULL;
1484ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
1485ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->Width = 0;
1486c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe   rb->Height = 0;
1487ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->InternalFormat = GL_NONE;
1488ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->_ActualFormat = GL_NONE;
1489ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->_BaseFormat = GL_NONE;
1490ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->DataType = GL_NONE;
1491ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = 0;
1492ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->IndexBits = 0;
1493ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->DepthBits = 0;
1494ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->StencilBits = 0;
1495ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->Data = NULL;
1496ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
1497ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   /* Point back to ourself so that we don't have to check for Wrapped==NULL
1498ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe    * all over the drivers.
1499bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe    */
1500c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe   rb->Wrapped = rb;
1501ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
1502ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->GetPointer = nop_get_pointer;
1503ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->GetRow = NULL;
1504ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->GetValues = NULL;
1505ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   rb->PutRow = NULL;
15065e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe   rb->PutRowRGB = NULL;
15075e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe   rb->PutMonoRow = NULL;
15085e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe   rb->PutValues = NULL;
15095e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe   rb->PutMonoValues = NULL;
15105e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe}
15115e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe
1512ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe
1513ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe/**
15145e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe * Allocate a new gl_renderbuffer object.  This can be used for user-created
15155e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe * renderbuffers or window-system renderbuffers.
15165e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe */
15175e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboestruct gl_renderbuffer *
15185e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe_mesa_new_renderbuffer(GLcontext *ctx, GLuint name)
15195e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe{
15205e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe   struct gl_renderbuffer *rb = CALLOC_STRUCT(gl_renderbuffer);
15215e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe   if (rb) {
15225e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe      _mesa_init_renderbuffer(rb, name);
15235e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe   }
15245e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe   return rb;
15255e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe}
15265e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe
15275e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe
15285e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboe/**
1529ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe * Delete a gl_framebuffer.
1530bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe * This is the default function for renderbuffer->Delete().
1531ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe */
15325e1d306e4f9a6337d07cc2d536d77c53e083226fJens Axboevoid
1533ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe_mesa_delete_renderbuffer(struct gl_renderbuffer *rb)
1534ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe{
1535ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   if (rb->Data) {
1536ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe      _mesa_free(rb->Data);
1537ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe   }
1538c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe   _mesa_free(rb);
1539ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe}
154079e48f72dea1639bcbee310c354938287b6d5790Jens Axboe
154169b98d4c9945bed6b3446a9e73bfaf8e557cf033Jens Axboe
154279e48f72dea1639bcbee310c354938287b6d5790Jens Axboe/**
154379e48f72dea1639bcbee310c354938287b6d5790Jens Axboe * Allocate a software-based renderbuffer.  This is called via the
1544c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe * ctx->Driver.NewRenderbuffer() function when the user creates a new
154579e48f72dea1639bcbee310c354938287b6d5790Jens Axboe * renderbuffer.
154679e48f72dea1639bcbee310c354938287b6d5790Jens Axboe * This would not be used for hardware-based renderbuffers.
15479ac8a797da61a59c9fa1b59f8574246555403d19Jens Axboe */
15484c6107ff4db87f50545bad515543f5024bb39e4aJens Axboestruct gl_renderbuffer *
15494c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe_mesa_new_soft_renderbuffer(GLcontext *ctx, GLuint name)
15504c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe{
15514c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe   struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, name);
15524c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe   if (rb) {
15534c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe      rb->AllocStorage = _mesa_soft_renderbuffer_storage;
15544c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe      /* Normally, one would setup the PutRow, GetRow, etc functions here.
15554c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe       * But we're doing that in the _mesa_soft_renderbuffer_storage() function
15564c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe       * instead.
15574c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe       */
15584c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe   }
15594c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe   return rb;
15604c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe}
15614c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe
15624c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe
15634c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe/**
15644c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe * Add software-based color renderbuffers to the given framebuffer.
15654c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe * This is a helper routine for device drivers when creating a
15664c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe * window system framebuffer (not a user-created render/framebuffer).
1567c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe * Once this function is called, you can basically forget about this
1568c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe * renderbuffer; core Mesa will handle all the buffer management and
1569c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe * rendering!
1570c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe */
1571c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens AxboeGLboolean
1572c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe_mesa_add_color_renderbuffers(GLcontext *ctx, struct gl_framebuffer *fb,
1573c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe                              GLuint rgbBits, GLuint alphaBits,
1574c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe                              GLboolean frontLeft, GLboolean backLeft,
1575c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe                              GLboolean frontRight, GLboolean backRight)
1576c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe{
1577c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe   GLuint b;
1578c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe
1579c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe   if (rgbBits > 16 || alphaBits > 16) {
1580c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe      _mesa_problem(ctx,
1581c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe                    "Unsupported bit depth in _mesa_add_color_renderbuffers");
1582c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe      return GL_FALSE;
1583c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe   }
1584fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe
15857a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe   assert(MAX_COLOR_ATTACHMENTS >= 4);
1586fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe
15877a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe   for (b = BUFFER_FRONT_LEFT; b <= BUFFER_BACK_RIGHT; b++) {
15887a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe      struct gl_renderbuffer *rb;
158946bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe
1590ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      if (b == BUFFER_FRONT_LEFT && !frontLeft)
1591b46928282e0a890f49250e79b81af773a2b7108fJens Axboe         continue;
1592c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe      else if (b == BUFFER_BACK_LEFT && !backLeft)
15934c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe         continue;
1594402668f3e05259bfc135fc097136428feda01006Jens Axboe      else if (b == BUFFER_FRONT_RIGHT && !frontRight)
15959bae26e8a220ab28b59d6710c6f7aa6e28b86171Jens Axboe         continue;
159681179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe      else if (b == BUFFER_BACK_RIGHT && !backRight)
1597ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe         continue;
1598c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe
1599c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe      assert(fb->Attachment[b].Renderbuffer == NULL);
1600c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe
1601c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe      rb = _mesa_new_renderbuffer(ctx, 0);
1602c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe      if (!rb) {
16037a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe         _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating color buffer");
1604c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe         return GL_FALSE;
1605085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe      }
1606085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe
1607c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe      if (rgbBits <= 8) {
1608fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe         if (alphaBits)
16097a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe            rb->_ActualFormat = GL_RGBA8;
16107a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe         else
16117a4b824059d9ce4b5151e904219c9b5e757ffd3bJens Axboe            rb->_ActualFormat = GL_RGB8;
1612ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      }
16132b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe      else {
16142b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe         assert(rgbBits <= 16);
16152b386d2569c9078ca9790c4e6d318ec3835b8739Jens Axboe         if (alphaBits)
1616b46928282e0a890f49250e79b81af773a2b7108fJens Axboe            rb->_ActualFormat = GL_RGBA16;
16178c029376bbe6d8a6bcb01c3ef7d545720aca3868Jens Axboe         else
1618b46928282e0a890f49250e79b81af773a2b7108fJens Axboe            rb->_ActualFormat = GL_RGBA16; /* don't really have RGB16 yet */
1619b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      }
1620b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      rb->InternalFormat = rb->_ActualFormat;
1621b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
16223d73e5a9549d30324d1c5e31eb644077380c0b95Jens Axboe      rb->AllocStorage = _mesa_soft_renderbuffer_storage;
1623b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      _mesa_add_renderbuffer(fb, b, rb);
1624b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   }
1625b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
1626b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   return GL_TRUE;
1627b46928282e0a890f49250e79b81af773a2b7108fJens Axboe}
1628b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
1629b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
1630b46928282e0a890f49250e79b81af773a2b7108fJens Axboe/**
1631b46928282e0a890f49250e79b81af773a2b7108fJens Axboe * Add software-based color index renderbuffers to the given framebuffer.
1632b46928282e0a890f49250e79b81af773a2b7108fJens Axboe * This is a helper routine for device drivers when creating a
1633b46928282e0a890f49250e79b81af773a2b7108fJens Axboe * window system framebuffer (not a user-created render/framebuffer).
1634f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe * Once this function is called, you can basically forget about this
1635b46928282e0a890f49250e79b81af773a2b7108fJens Axboe * renderbuffer; core Mesa will handle all the buffer management and
1636f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe * rendering!
1637f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe */
1638f3afa57e36550288340f1b6c694f354ae72654b9Jens AxboeGLboolean
1639f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe_mesa_add_color_index_renderbuffers(GLcontext *ctx, struct gl_framebuffer *fb,
1640f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe                                    GLuint indexBits,
1641f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe                                    GLboolean frontLeft, GLboolean backLeft,
1642f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe                                    GLboolean frontRight, GLboolean backRight)
1643f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe{
1644f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe   GLuint b;
1645b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
1646b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   if (indexBits > 8) {
16477874f8b74cf9da4c142b0574d0ba67a7c9c6db20Jens Axboe      _mesa_problem(ctx,
1648c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe                "Unsupported bit depth in _mesa_add_color_index_renderbuffers");
16497874f8b74cf9da4c142b0574d0ba67a7c9c6db20Jens Axboe      return GL_FALSE;
16507874f8b74cf9da4c142b0574d0ba67a7c9c6db20Jens Axboe   }
1651c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe
1652fd28ca4948aa67b76585c6c23d7f70a2cdc7a0d5Jens Axboe   assert(MAX_COLOR_ATTACHMENTS >= 4);
16537874f8b74cf9da4c142b0574d0ba67a7c9c6db20Jens Axboe
1654c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe   for (b = BUFFER_FRONT_LEFT; b <= BUFFER_BACK_RIGHT; b++) {
16557874f8b74cf9da4c142b0574d0ba67a7c9c6db20Jens Axboe      struct gl_renderbuffer *rb;
16567874f8b74cf9da4c142b0574d0ba67a7c9c6db20Jens Axboe
1657c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe      if (b == BUFFER_FRONT_LEFT && !frontLeft)
1658de890a1e48d40238dac69f302708dde8719de240Steven Lang         continue;
1659de890a1e48d40238dac69f302708dde8719de240Steven Lang      else if (b == BUFFER_BACK_LEFT && !backLeft)
1660de890a1e48d40238dac69f302708dde8719de240Steven Lang         continue;
1661de890a1e48d40238dac69f302708dde8719de240Steven Lang      else if (b == BUFFER_FRONT_RIGHT && !frontRight)
1662de890a1e48d40238dac69f302708dde8719de240Steven Lang         continue;
1663de890a1e48d40238dac69f302708dde8719de240Steven Lang      else if (b == BUFFER_BACK_RIGHT && !backRight)
1664cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe         continue;
1665cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe
1666cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe      assert(fb->Attachment[b].Renderbuffer == NULL);
1667724e4435c1374e97309b122429ad9291744966c0Jens Axboe
1668724e4435c1374e97309b122429ad9291744966c0Jens Axboe      rb = _mesa_new_renderbuffer(ctx, 0);
1669724e4435c1374e97309b122429ad9291744966c0Jens Axboe      if (!rb) {
1670b46928282e0a890f49250e79b81af773a2b7108fJens Axboe         _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating color buffer");
16717874f8b74cf9da4c142b0574d0ba67a7c9c6db20Jens Axboe         return GL_FALSE;
16723d43382c7864753728b181ac356222d67bdd4a3fJens Axboe      }
16737874f8b74cf9da4c142b0574d0ba67a7c9c6db20Jens Axboe
16747874f8b74cf9da4c142b0574d0ba67a7c9c6db20Jens Axboe      if (indexBits <= 8) {
1675c2c9458515bda1f77e25f95122ef6ec8d8cc3ec7Jens Axboe         /* only support GLuint for now */
1676f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboe         /*rb->InternalFormat = GL_COLOR_INDEX8_EXT;*/
1677f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboe         rb->_ActualFormat = COLOR_INDEX32;
167809786f5fa4e64e63be97ae8469866715226bf837Jens Axboe      }
167909786f5fa4e64e63be97ae8469866715226bf837Jens Axboe      else {
1680f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboe         rb->_ActualFormat = COLOR_INDEX32;
1681f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboe      }
1682f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboe      rb->InternalFormat = rb->_ActualFormat;
1683f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboe
1684f57a9c59e366aa2f0621aa260bfd5ef5aeb61643Jens Axboe      rb->AllocStorage = _mesa_soft_renderbuffer_storage;
1685e592a06b36999bbb30675a4a58d4ff16ed65e555Aaron Carroll      _mesa_add_renderbuffer(fb, b, rb);
1686e592a06b36999bbb30675a4a58d4ff16ed65e555Aaron Carroll   }
1687e592a06b36999bbb30675a4a58d4ff16ed65e555Aaron Carroll
1688e592a06b36999bbb30675a4a58d4ff16ed65e555Aaron Carroll   return GL_TRUE;
1689e592a06b36999bbb30675a4a58d4ff16ed65e555Aaron Carroll}
1690e592a06b36999bbb30675a4a58d4ff16ed65e555Aaron Carroll
1691e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe
1692e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe/**
1693e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe * Add software-based alpha renderbuffers to the given framebuffer.
1694e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe * This is a helper routine for device drivers when creating a
1695e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe * window system framebuffer (not a user-created render/framebuffer).
1696e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe * Once this function is called, you can basically forget about this
1697e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe * renderbuffer; core Mesa will handle all the buffer management and
1698e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe * rendering!
1699e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe */
1700e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens AxboeGLboolean
1701e382e661f6a67a24d8042b9e4b8f812b7126bdc4Jens Axboe_mesa_add_alpha_renderbuffers(GLcontext *ctx, struct gl_framebuffer *fb,
1702ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe                              GLuint alphaBits,
1703c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe                              GLboolean frontLeft, GLboolean backLeft,
1704c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe                              GLboolean frontRight, GLboolean backRight)
1705ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe{
1706111e032d60f2341cfe09accbfcf25ec81b9251e0Jens Axboe   GLuint b;
1707111e032d60f2341cfe09accbfcf25ec81b9251e0Jens Axboe
1708111e032d60f2341cfe09accbfcf25ec81b9251e0Jens Axboe   /* for window system framebuffers only! */
1709ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe   assert(fb->Name == 0);
1710ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe
1711ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe   if (alphaBits > 8) {
171201f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      _mesa_problem(ctx,
17135ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe                    "Unsupported bit depth in _mesa_add_alpha_renderbuffers");
17145ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe      return GL_FALSE;
1715c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe   }
1716c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe
171701f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe   assert(MAX_COLOR_ATTACHMENTS >= 4);
171801f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe
1719ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe   /* Wrap each of the RGB color buffers with an alpha renderbuffer.
1720ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe    */
1721ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe   for (b = BUFFER_FRONT_LEFT; b <= BUFFER_BACK_RIGHT; b++) {
1722ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe      struct gl_renderbuffer *arb;
172301f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe
1724ad0a273593b93f61e72fbdf1910fcf8cdcac738cJens Axboe      if (b == BUFFER_FRONT_LEFT && !frontLeft)
17259ac8a797da61a59c9fa1b59f8574246555403d19Jens Axboe         continue;
172607b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe      else if (b == BUFFER_BACK_LEFT && !backLeft)
17279ac8a797da61a59c9fa1b59f8574246555403d19Jens Axboe         continue;
1728b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      else if (b == BUFFER_FRONT_RIGHT && !frontRight)
17295ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe         continue;
1730b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      else if (b == BUFFER_BACK_RIGHT && !backRight)
1731b46928282e0a890f49250e79b81af773a2b7108fJens Axboe         continue;
1732c2b1e753ca7abaca7f177cb1ca5087ca3971542bJens Axboe
173346bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe      /* the RGB buffer to wrap must already exist!! */
17346625155407de739e1e857419b7b4fb62f6c6bb2eJens Axboe      assert(fb->Attachment[b].Renderbuffer);
1735c2b1e753ca7abaca7f177cb1ca5087ca3971542bJens Axboe
1736c2b1e753ca7abaca7f177cb1ca5087ca3971542bJens Axboe      /* only GLubyte supported for now */
1737c2b1e753ca7abaca7f177cb1ca5087ca3971542bJens Axboe      assert(fb->Attachment[b].Renderbuffer->DataType == GL_UNSIGNED_BYTE);
1738b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
173901f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      /* allocate alpha renderbuffer */
17403106f220e1710d7e53cb7bd0dbc7dac4584af463Jens Axboe      arb = _mesa_new_renderbuffer(ctx, 0);
17413106f220e1710d7e53cb7bd0dbc7dac4584af463Jens Axboe      if (!arb) {
174201f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe         _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating alpha buffer");
17433106f220e1710d7e53cb7bd0dbc7dac4584af463Jens Axboe         return GL_FALSE;
1744c2b1e753ca7abaca7f177cb1ca5087ca3971542bJens Axboe      }
174501f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe
174601f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      /* wrap the alpha renderbuffer around the RGB renderbuffer */
174701f06b63ba67d3bc7fa11766d9f13d229c4cec5cJens Axboe      arb->Wrapped = fb->Attachment[b].Renderbuffer;
1748de890a1e48d40238dac69f302708dde8719de240Steven Lang
1749de890a1e48d40238dac69f302708dde8719de240Steven Lang      /* Set up my alphabuffer fields and plug in my functions.
1750b46928282e0a890f49250e79b81af773a2b7108fJens Axboe       * The functions will put/get the alpha values from/to RGBA arrays
1751de890a1e48d40238dac69f302708dde8719de240Steven Lang       * and then call the wrapped buffer's functions to handle the RGB
1752b46928282e0a890f49250e79b81af773a2b7108fJens Axboe       * values.
175338d0adb0d129e2eef7bf21e85ba4758c3789cb8eJens Axboe       */
17549d918187e8eceda6637544b7cb0fa3ee734ee5c0Jens Axboe      arb->InternalFormat = arb->Wrapped->InternalFormat;
17559d918187e8eceda6637544b7cb0fa3ee734ee5c0Jens Axboe      arb->_ActualFormat  = GL_ALPHA8;
17569d918187e8eceda6637544b7cb0fa3ee734ee5c0Jens Axboe      arb->_BaseFormat    = arb->Wrapped->_BaseFormat;
17579d918187e8eceda6637544b7cb0fa3ee734ee5c0Jens Axboe      arb->DataType       = arb->Wrapped->DataType;
17589d918187e8eceda6637544b7cb0fa3ee734ee5c0Jens Axboe      arb->AllocStorage   = alloc_storage_alpha8;
17599d918187e8eceda6637544b7cb0fa3ee734ee5c0Jens Axboe      arb->Delete         = delete_renderbuffer_alpha8;
17609d918187e8eceda6637544b7cb0fa3ee734ee5c0Jens Axboe      arb->GetPointer     = get_pointer_alpha8;
1761bfb3ea221ed3b5ce4a0795cee778b965ee83cf9fJens Axboe      arb->GetRow         = get_row_alpha8;
1762bfb3ea221ed3b5ce4a0795cee778b965ee83cf9fJens Axboe      arb->GetValues      = get_values_alpha8;
1763bfb3ea221ed3b5ce4a0795cee778b965ee83cf9fJens Axboe      arb->PutRow         = put_row_alpha8;
1764bfb3ea221ed3b5ce4a0795cee778b965ee83cf9fJens Axboe      arb->PutRowRGB      = put_row_rgb_alpha8;
1765bfb3ea221ed3b5ce4a0795cee778b965ee83cf9fJens Axboe      arb->PutMonoRow     = put_mono_row_alpha8;
1766a88c8c14172004a1b6518ca181fe7f60c64c2c1aJens Axboe      arb->PutValues      = put_values_alpha8;
1767bfb3ea221ed3b5ce4a0795cee778b965ee83cf9fJens Axboe      arb->PutMonoValues  = put_mono_values_alpha8;
1768de890a1e48d40238dac69f302708dde8719de240Steven Lang
1769de890a1e48d40238dac69f302708dde8719de240Steven Lang      /* clear the pointer to avoid assertion/sanity check failure later */
1770de890a1e48d40238dac69f302708dde8719de240Steven Lang      fb->Attachment[b].Renderbuffer = NULL;
1771de890a1e48d40238dac69f302708dde8719de240Steven Lang
1772de890a1e48d40238dac69f302708dde8719de240Steven Lang      /* plug the alpha renderbuffer into the colorbuffer attachment */
1773de890a1e48d40238dac69f302708dde8719de240Steven Lang      _mesa_add_renderbuffer(fb, b, arb);
1774de890a1e48d40238dac69f302708dde8719de240Steven Lang   }
1775de890a1e48d40238dac69f302708dde8719de240Steven Lang
1776de890a1e48d40238dac69f302708dde8719de240Steven Lang   return GL_TRUE;
1777de890a1e48d40238dac69f302708dde8719de240Steven Lang}
1778de890a1e48d40238dac69f302708dde8719de240Steven Lang
1779de890a1e48d40238dac69f302708dde8719de240Steven Lang
1780de890a1e48d40238dac69f302708dde8719de240Steven Lang/**
1781b46928282e0a890f49250e79b81af773a2b7108fJens Axboe * For framebuffers that use a software alpha channel wrapper
1782b46928282e0a890f49250e79b81af773a2b7108fJens Axboe * created by _mesa_add_alpha_renderbuffer or _mesa_add_soft_renderbuffers,
1783a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe * copy the back buffer alpha channel into the front buffer alpha channel.
1784a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboe */
1785a9523c6f4a43e4bbf942ee49068fe4f052c6991dJens Axboevoid
1786fca7035863bd570270376a0c06776e5549ff813eJens Axboe_mesa_copy_soft_alpha_renderbuffers(GLcontext *ctx, struct gl_framebuffer *fb)
1787fca7035863bd570270376a0c06776e5549ff813eJens Axboe{
1788fca7035863bd570270376a0c06776e5549ff813eJens Axboe   if (fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer &&
1789fca7035863bd570270376a0c06776e5549ff813eJens Axboe       fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer)
1790fca7035863bd570270376a0c06776e5549ff813eJens Axboe      copy_buffer_alpha8(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer,
1791fca7035863bd570270376a0c06776e5549ff813eJens Axboe                         fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer);
1792fca7035863bd570270376a0c06776e5549ff813eJens Axboe
1793fca7035863bd570270376a0c06776e5549ff813eJens Axboe
179450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe   if (fb->Attachment[BUFFER_FRONT_RIGHT].Renderbuffer &&
1795a37f69b72a74cbde6151458b890aab8d093f0c9fJens Axboe       fb->Attachment[BUFFER_BACK_RIGHT].Renderbuffer)
1796132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe      copy_buffer_alpha8(fb->Attachment[BUFFER_FRONT_RIGHT].Renderbuffer,
1797132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe                         fb->Attachment[BUFFER_BACK_RIGHT].Renderbuffer);
1798132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe}
1799132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
1800132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
180187aa8f1901e26bc377f3035a485d35c417d0255aJens Axboe/**
1802bebe639808147d587bbe776566d390b9ff98773fJens Axboe * Add a software-based depth renderbuffer to the given framebuffer.
180350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe * This is a helper routine for device drivers when creating a
180481179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe * window system framebuffer (not a user-created render/framebuffer).
180550d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe * Once this function is called, you can basically forget about this
1806e46d809110bd4ad2980ca64931b683673444454bJens Axboe * renderbuffer; core Mesa will handle all the buffer management and
1807402668f3e05259bfc135fc097136428feda01006Jens Axboe * rendering!
1808e46d809110bd4ad2980ca64931b683673444454bJens Axboe */
1809f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong LiuGLboolean
1810f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu_mesa_add_depth_renderbuffer(GLcontext *ctx, struct gl_framebuffer *fb,
1811f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu                             GLuint depthBits)
1812f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu{
1813f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu   struct gl_renderbuffer *rb;
1814f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu
1815f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu   if (depthBits > 32) {
1816f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu      _mesa_problem(ctx,
1817132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe                    "Unsupported depthBits in _mesa_add_depth_renderbuffer");
1818132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe      return GL_FALSE;
1819132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe   }
1820132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
1821132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe   assert(fb->Attachment[BUFFER_DEPTH].Renderbuffer == NULL);
1822132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
1823132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe   rb = _mesa_new_renderbuffer(ctx, 0);
1824a52766160d7f2a937c74d4adee1819ef00467d4bJens Axboe   if (!rb) {
1825bebe639808147d587bbe776566d390b9ff98773fJens Axboe      _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating depth buffer");
1826bebe639808147d587bbe776566d390b9ff98773fJens Axboe      return GL_FALSE;
1827bebe639808147d587bbe776566d390b9ff98773fJens Axboe   }
1828bebe639808147d587bbe776566d390b9ff98773fJens Axboe
1829bebe639808147d587bbe776566d390b9ff98773fJens Axboe   if (depthBits <= 16) {
183014ea90edf265aae2b82f25418fde179c452909f9Jens Axboe      rb->_ActualFormat = GL_DEPTH_COMPONENT16;
183114ea90edf265aae2b82f25418fde179c452909f9Jens Axboe   }
183214ea90edf265aae2b82f25418fde179c452909f9Jens Axboe   else if (depthBits <= 24) {
183314ea90edf265aae2b82f25418fde179c452909f9Jens Axboe      rb->_ActualFormat = GL_DEPTH_COMPONENT24;
183414ea90edf265aae2b82f25418fde179c452909f9Jens Axboe   }
183514ea90edf265aae2b82f25418fde179c452909f9Jens Axboe   else {
183614ea90edf265aae2b82f25418fde179c452909f9Jens Axboe      rb->_ActualFormat = GL_DEPTH_COMPONENT32;
183714ea90edf265aae2b82f25418fde179c452909f9Jens Axboe   }
183814ea90edf265aae2b82f25418fde179c452909f9Jens Axboe   rb->InternalFormat = rb->_ActualFormat;
183914ea90edf265aae2b82f25418fde179c452909f9Jens Axboe
184014ea90edf265aae2b82f25418fde179c452909f9Jens Axboe   rb->AllocStorage = _mesa_soft_renderbuffer_storage;
184114ea90edf265aae2b82f25418fde179c452909f9Jens Axboe   _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb);
1842132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
18437d11f87148b8ec0f5627c701c934c752bf774029Jens Axboe   return GL_TRUE;
18447d11f87148b8ec0f5627c701c934c752bf774029Jens Axboe}
18457d11f87148b8ec0f5627c701c934c752bf774029Jens Axboe
18467d11f87148b8ec0f5627c701c934c752bf774029Jens Axboe
184706464907159baf7a1eeac654a023743e33f28d86Jens Axboe/**
184806464907159baf7a1eeac654a023743e33f28d86Jens Axboe * Add a software-based stencil renderbuffer to the given framebuffer.
184906464907159baf7a1eeac654a023743e33f28d86Jens Axboe * This is a helper routine for device drivers when creating a
185006464907159baf7a1eeac654a023743e33f28d86Jens Axboe * window system framebuffer (not a user-created render/framebuffer).
185106464907159baf7a1eeac654a023743e33f28d86Jens Axboe * Once this function is called, you can basically forget about this
185206464907159baf7a1eeac654a023743e33f28d86Jens Axboe * renderbuffer; core Mesa will handle all the buffer management and
185306464907159baf7a1eeac654a023743e33f28d86Jens Axboe * rendering!
185406464907159baf7a1eeac654a023743e33f28d86Jens Axboe */
185506464907159baf7a1eeac654a023743e33f28d86Jens AxboeGLboolean
185606464907159baf7a1eeac654a023743e33f28d86Jens Axboe_mesa_add_stencil_renderbuffer(GLcontext *ctx, struct gl_framebuffer *fb,
185706464907159baf7a1eeac654a023743e33f28d86Jens Axboe                               GLuint stencilBits)
185806464907159baf7a1eeac654a023743e33f28d86Jens Axboe{
1859798827c895a585f284842f6b99378be19c821263Jens Axboe   struct gl_renderbuffer *rb;
1860798827c895a585f284842f6b99378be19c821263Jens Axboe
1861798827c895a585f284842f6b99378be19c821263Jens Axboe   if (stencilBits > 16) {
1862b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      _mesa_problem(ctx,
1863c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe                  "Unsupported stencilBits in _mesa_add_stencil_renderbuffer");
1864c09823ab5c841791025c564ecfc9ada0f850770bJens Axboe      return GL_FALSE;
1865b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   }
1866ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1867c7d5c941db51482ba196ef888fdd44f285363946Jens Axboe   assert(fb->Attachment[BUFFER_STENCIL].Renderbuffer == NULL);
1868c7d5c941db51482ba196ef888fdd44f285363946Jens Axboe
1869ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   rb = _mesa_new_renderbuffer(ctx, 0);
1870c9fad893e8333682d6ab67a269b0dd74f303c5bcJens Axboe   if (!rb) {
18710b14f0a8bc16f949d9ff3eb425fa7a896513fb15Jens Axboe      _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating stencil buffer");
18720b14f0a8bc16f949d9ff3eb425fa7a896513fb15Jens Axboe      return GL_FALSE;
1873536582bf89bb97eb3636e41470f303877a738810Jens Axboe   }
1874a37f69b72a74cbde6151458b890aab8d093f0c9fJens Axboe
1875132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe   if (stencilBits <= 8) {
1876132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe      rb->_ActualFormat = GL_STENCIL_INDEX8_EXT;
1877cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe   }
1878132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe   else {
1879132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe      /* not really supported (see s_stencil.c code) */
188081179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe      rb->_ActualFormat = GL_STENCIL_INDEX16_EXT;
1881402668f3e05259bfc135fc097136428feda01006Jens Axboe   }
188250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe   rb->InternalFormat = rb->_ActualFormat;
1883b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
18847d6a8904cc2973a857f4bb50f85e7c75375c553dJens Axboe   rb->AllocStorage = _mesa_soft_renderbuffer_storage;
188546bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe   _mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb);
1886972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe
1887774a617767830b5023f6cad4a45609a92ec82d41Jens Axboe   return GL_TRUE;
18887874f8b74cf9da4c142b0574d0ba67a7c9c6db20Jens Axboe}
1889b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
1890b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
1891b46928282e0a890f49250e79b81af773a2b7108fJens Axboe/**
1892b46928282e0a890f49250e79b81af773a2b7108fJens Axboe * Add a software-based accumulation renderbuffer to the given framebuffer.
1893eb8bbf48e79a8c6afd3c84e3d64263d10ee45daaJens Axboe * This is a helper routine for device drivers when creating a
1894972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe * window system framebuffer (not a user-created render/framebuffer).
1895972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe * Once this function is called, you can basically forget about this
1896ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * renderbuffer; core Mesa will handle all the buffer management and
1897ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * rendering!
18980420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe */
1899ebac4655dd3624f3296ff83be48e0cdc02852f1Jens AxboeGLboolean
1900b46928282e0a890f49250e79b81af773a2b7108fJens Axboe_mesa_add_accum_renderbuffer(GLcontext *ctx, struct gl_framebuffer *fb,
1901b46928282e0a890f49250e79b81af773a2b7108fJens Axboe                             GLuint redBits, GLuint greenBits,
1902b46928282e0a890f49250e79b81af773a2b7108fJens Axboe                             GLuint blueBits, GLuint alphaBits)
19034c6107ff4db87f50545bad515543f5024bb39e4aJens Axboe{
19045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe   struct gl_renderbuffer *rb;
1905b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
19069d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe   if (redBits > 16 || greenBits > 16 || blueBits > 16 || alphaBits > 16) {
19079d9eb2e7872c99154094f7750d4c978f075b0144Jens Axboe      _mesa_problem(ctx,
1908ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe                    "Unsupported accumBits in _mesa_add_accum_renderbuffer");
1909ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe      return GL_FALSE;
1910ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe   }
19110420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe
19120420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe   assert(fb->Attachment[BUFFER_ACCUM].Renderbuffer == NULL);
19130420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe
191451167799022df58d45a99bbd7aa9cf81a47c46c9Jens Axboe   rb = _mesa_new_renderbuffer(ctx, 0);
191551167799022df58d45a99bbd7aa9cf81a47c46c9Jens Axboe   if (!rb) {
19160420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe      _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating accum buffer");
19170420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe      return GL_FALSE;
191846bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe   }
19190420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe
19200420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe   rb->_ActualFormat = GL_RGBA16;
19210420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe   rb->InternalFormat = GL_RGBA16;
19220420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe   rb->AllocStorage = _mesa_soft_renderbuffer_storage;
192351167799022df58d45a99bbd7aa9cf81a47c46c9Jens Axboe   _mesa_add_renderbuffer(fb, BUFFER_ACCUM, rb);
192451167799022df58d45a99bbd7aa9cf81a47c46c9Jens Axboe
19250420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe   return GL_TRUE;
192646bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe}
1927ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1928cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe
1929cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe
1930cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe/**
1931132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe * Add a software-based accumulation renderbuffer to the given framebuffer.
1932cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe * This is a helper routine for device drivers when creating a
1933cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe * window system framebuffer (not a user-created render/framebuffer).
1934cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe * Once this function is called, you can basically forget about this
1935cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe * renderbuffer; core Mesa will handle all the buffer management and
1936cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe * rendering!
193746bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe *
1938cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe * NOTE: color-index aux buffers not supported.
1939cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens Axboe */
1940cdf54d85054858d9e3fc4d7ee8ea5c6a418f1b43Jens AxboeGLboolean
1941132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe_mesa_add_aux_renderbuffers(GLcontext *ctx, struct gl_framebuffer *fb,
194214ea90edf265aae2b82f25418fde179c452909f9Jens Axboe                            GLuint colorBits, GLuint numBuffers)
194314ea90edf265aae2b82f25418fde179c452909f9Jens Axboe{
194414ea90edf265aae2b82f25418fde179c452909f9Jens Axboe   GLuint i;
194514ea90edf265aae2b82f25418fde179c452909f9Jens Axboe
194614ea90edf265aae2b82f25418fde179c452909f9Jens Axboe   if (colorBits > 16) {
1947972cfd2546081c0397447ca9243ea419b1ff579aJens Axboe      _mesa_problem(ctx,
1948ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe                    "Unsupported accumBits in _mesa_add_aux_renderbuffers");
194988c6ed8085efd1403fd34072311991cb666a5b9eJens Axboe      return GL_FALSE;
19507e356b2dee2e86f3684424fc6e903f1ef9f00ef4Jens Axboe   }
1951b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
1952b46928282e0a890f49250e79b81af773a2b7108fJens Axboe   assert(numBuffers < MAX_AUX_BUFFERS);
1953f9633d729f0d2067c3f79b5e82e7129de1e650cdJens Axboe
1954cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe   for (i = 0; i < numBuffers; i++) {
195507b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe      struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, 0);
195607b3232de97ac32a873f0b5d17c8f49c18ed3ae7Jens Axboe
1957a37f69b72a74cbde6151458b890aab8d093f0c9fJens Axboe      assert(fb->Attachment[BUFFER_AUX0 + i].Renderbuffer == NULL);
19585c341e9a5734742ae1137388345d4f47efdd4f05Jens Axboe
1959085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe      if (!rb) {
1960085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe         _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating accum buffer");
1961cca73aa73328c3cb4d78adf1e54345701eff29fdJens Axboe         return GL_FALSE;
1962d65e11c6483f6664ac93da58dd8d46508f651e53Jens Axboe      }
1963085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe
1964085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe      if (colorBits <= 8) {
1965085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe         rb->_ActualFormat = GL_RGBA8;
1966085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe      }
1967085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe      else {
1968085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe         rb->_ActualFormat = GL_RGBA16;
1969085399db78898fa12d8a469f2db6e5ad1dfe0794Jens Axboe      }
1970b46928282e0a890f49250e79b81af773a2b7108fJens Axboe      rb->InternalFormat = rb->_ActualFormat;
1971b46928282e0a890f49250e79b81af773a2b7108fJens Axboe
1972be4ecfdf6c8daa75c4df8ac875c9a87da80d81a0Jens Axboe      rb->AllocStorage = _mesa_soft_renderbuffer_storage;
1973be4ecfdf6c8daa75c4df8ac875c9a87da80d81a0Jens Axboe      _mesa_add_renderbuffer(fb, BUFFER_AUX0 + i, rb);
1974be4ecfdf6c8daa75c4df8ac875c9a87da80d81a0Jens Axboe   }
1975be4ecfdf6c8daa75c4df8ac875c9a87da80d81a0Jens Axboe   return GL_TRUE;
1976be4ecfdf6c8daa75c4df8ac875c9a87da80d81a0Jens Axboe}
1977be4ecfdf6c8daa75c4df8ac875c9a87da80d81a0Jens Axboe
1978f3afa57e36550288340f1b6c694f354ae72654b9Jens Axboe
19793d43382c7864753728b181ac356222d67bdd4a3fJens Axboe/**
1980f6dea4d33fb57a6e7cb64414793c57f10b702851Jens Axboe * Create/attach software-based renderbuffers to the given framebuffer.
1981ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * This is a helper routine for device drivers.  Drivers can just as well
1982ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * call the individual _mesa_add_*_renderbuffer() routines directly.
1983588b7f09161ff432777de4cf9c3345b6f976ad98Jens Axboe */
1984588b7f09161ff432777de4cf9c3345b6f976ad98Jens Axboevoid
1985588b7f09161ff432777de4cf9c3345b6f976ad98Jens Axboe_mesa_add_soft_renderbuffers(struct gl_framebuffer *fb,
1986588b7f09161ff432777de4cf9c3345b6f976ad98Jens Axboe                             GLboolean color,
1987588b7f09161ff432777de4cf9c3345b6f976ad98Jens Axboe                             GLboolean depth,
1988                             GLboolean stencil,
1989                             GLboolean accum,
1990                             GLboolean alpha,
1991                             GLboolean aux)
1992{
1993   GLboolean frontLeft = GL_TRUE;
1994   GLboolean backLeft = fb->Visual.doubleBufferMode;
1995   GLboolean frontRight = fb->Visual.stereoMode;
1996   GLboolean backRight = fb->Visual.stereoMode && fb->Visual.doubleBufferMode;
1997
1998   if (color) {
1999      if (fb->Visual.rgbMode) {
2000         assert(fb->Visual.redBits == fb->Visual.greenBits);
2001         assert(fb->Visual.redBits == fb->Visual.blueBits);
2002         _mesa_add_color_renderbuffers(NULL, fb,
2003                                       fb->Visual.redBits,
2004                                       fb->Visual.alphaBits,
2005                                       frontLeft, backLeft,
2006                                       frontRight, backRight);
2007      }
2008      else {
2009         _mesa_add_color_index_renderbuffers(NULL, fb,
2010                                             fb->Visual.indexBits,
2011                                             frontLeft, backLeft,
2012                                             frontRight, backRight);
2013      }
2014   }
2015
2016   if (depth) {
2017      assert(fb->Visual.depthBits > 0);
2018      _mesa_add_depth_renderbuffer(NULL, fb, fb->Visual.depthBits);
2019   }
2020
2021   if (stencil) {
2022      assert(fb->Visual.stencilBits > 0);
2023      _mesa_add_stencil_renderbuffer(NULL, fb, fb->Visual.stencilBits);
2024   }
2025
2026   if (accum) {
2027      assert(fb->Visual.rgbMode);
2028      assert(fb->Visual.accumRedBits > 0);
2029      assert(fb->Visual.accumGreenBits > 0);
2030      assert(fb->Visual.accumBlueBits > 0);
2031      _mesa_add_accum_renderbuffer(NULL, fb,
2032                                   fb->Visual.accumRedBits,
2033                                   fb->Visual.accumGreenBits,
2034                                   fb->Visual.accumBlueBits,
2035                                   fb->Visual.accumAlphaBits);
2036   }
2037
2038   if (aux) {
2039      assert(fb->Visual.rgbMode);
2040      assert(fb->Visual.numAuxBuffers > 0);
2041      _mesa_add_aux_renderbuffers(NULL, fb, fb->Visual.redBits,
2042                                  fb->Visual.numAuxBuffers);
2043   }
2044
2045   if (alpha) {
2046      assert(fb->Visual.rgbMode);
2047      assert(fb->Visual.alphaBits > 0);
2048      _mesa_add_alpha_renderbuffers(NULL, fb, fb->Visual.alphaBits,
2049                                    frontLeft, backLeft,
2050                                    frontRight, backRight);
2051   }
2052
2053#if 0
2054   if (multisample) {
2055      /* maybe someday */
2056   }
2057#endif
2058}
2059
2060
2061/**
2062 * Attach a renderbuffer to a framebuffer.
2063 */
2064void
2065_mesa_add_renderbuffer(struct gl_framebuffer *fb,
2066                       GLuint bufferName, struct gl_renderbuffer *rb)
2067{
2068   assert(fb);
2069   assert(rb);
2070   assert(bufferName < BUFFER_COUNT);
2071
2072   /* There should be no previous renderbuffer on this attachment point,
2073    * with the exception of depth/stencil since the same renderbuffer may
2074    * be used for both.
2075    */
2076   assert(bufferName == BUFFER_DEPTH ||
2077          bufferName == BUFFER_STENCIL ||
2078          fb->Attachment[bufferName].Renderbuffer == NULL);
2079
2080   /* winsys vs. user-created buffer cross check */
2081   if (fb->Name) {
2082      assert(rb->Name);
2083   }
2084   else {
2085      assert(!rb->Name);
2086   }
2087
2088   /* If Mesa's compiled with deep color channels (16 or 32 bits / channel)
2089    * and the device driver is expecting 8-bit values (GLubyte), we can
2090    * use a "renderbuffer adaptor/wrapper" to do the necessary conversions.
2091    */
2092   if (rb->_BaseFormat == GL_RGBA) {
2093      if (CHAN_BITS == 16 && rb->DataType == GL_UNSIGNED_BYTE) {
2094         GET_CURRENT_CONTEXT(ctx);
2095         rb = _mesa_new_renderbuffer_16wrap8(ctx, rb);
2096      }
2097      else if (CHAN_BITS == 32 && rb->DataType == GL_UNSIGNED_BYTE) {
2098         GET_CURRENT_CONTEXT(ctx);
2099         rb = _mesa_new_renderbuffer_32wrap8(ctx, rb);
2100      }
2101      else if (CHAN_BITS == 32 && rb->DataType == GL_UNSIGNED_SHORT) {
2102         GET_CURRENT_CONTEXT(ctx);
2103         rb = _mesa_new_renderbuffer_32wrap16(ctx, rb);
2104      }
2105   }
2106
2107   fb->Attachment[bufferName].Type = GL_RENDERBUFFER_EXT;
2108   fb->Attachment[bufferName].Complete = GL_TRUE;
2109   _mesa_reference_renderbuffer(&fb->Attachment[bufferName].Renderbuffer, rb);
2110}
2111
2112
2113/**
2114 * Remove the named renderbuffer from the given framebuffer.
2115 */
2116void
2117_mesa_remove_renderbuffer(struct gl_framebuffer *fb, GLuint bufferName)
2118{
2119   struct gl_renderbuffer *rb;
2120
2121   assert(bufferName < BUFFER_COUNT);
2122
2123   rb = fb->Attachment[bufferName].Renderbuffer;
2124   if (!rb)
2125      return;
2126
2127   _mesa_reference_renderbuffer(&rb, NULL);
2128
2129   fb->Attachment[bufferName].Renderbuffer = NULL;
2130}
2131
2132
2133/**
2134 * Set *ptr to point to rb.  If *ptr points to another renderbuffer,
2135 * dereference that buffer first.  The new renderbuffer's refcount will
2136 * be incremented.  The old renderbuffer's refcount will be decremented.
2137 */
2138void
2139_mesa_reference_renderbuffer(struct gl_renderbuffer **ptr,
2140                             struct gl_renderbuffer *rb)
2141{
2142   assert(ptr);
2143   if (*ptr == rb) {
2144      /* no change */
2145      return;
2146   }
2147
2148   if (*ptr) {
2149      /* Unreference the old renderbuffer */
2150      GLboolean deleteFlag = GL_FALSE;
2151      struct gl_renderbuffer *oldRb = *ptr;
2152
2153      assert(oldRb->Magic == RB_MAGIC);
2154      _glthread_LOCK_MUTEX(oldRb->Mutex);
2155      assert(oldRb->Magic == RB_MAGIC);
2156      ASSERT(oldRb->RefCount > 0);
2157      oldRb->RefCount--;
2158      /*printf("RB DECR %p (%d) to %d\n", (void*) oldRb, oldRb->Name, oldRb->RefCount);*/
2159      deleteFlag = (oldRb->RefCount == 0);
2160      _glthread_UNLOCK_MUTEX(oldRb->Mutex);
2161
2162      if (deleteFlag) {
2163         oldRb->Magic = 0; /* now invalid memory! */
2164         oldRb->Delete(oldRb);
2165      }
2166
2167      *ptr = NULL;
2168   }
2169   assert(!*ptr);
2170
2171   if (rb) {
2172      assert(rb->Magic == RB_MAGIC);
2173      /* reference new renderbuffer */
2174      _glthread_LOCK_MUTEX(rb->Mutex);
2175      rb->RefCount++;
2176      /*printf("RB INCR %p (%d) to %d\n", (void*) rb, rb->Name, rb->RefCount);*/
2177      _glthread_UNLOCK_MUTEX(rb->Mutex);
2178      *ptr = rb;
2179   }
2180}
2181
2182
2183/**
2184 * Create a new combined depth/stencil renderbuffer for implementing
2185 * the GL_EXT_packed_depth_stencil extension.
2186 * \return new depth/stencil renderbuffer
2187 */
2188struct gl_renderbuffer *
2189_mesa_new_depthstencil_renderbuffer(GLcontext *ctx, GLuint name)
2190{
2191   struct gl_renderbuffer *dsrb;
2192
2193   dsrb = _mesa_new_renderbuffer(ctx, name);
2194   if (!dsrb)
2195      return NULL;
2196
2197   /* init fields not covered by _mesa_new_renderbuffer() */
2198   dsrb->InternalFormat = GL_DEPTH24_STENCIL8_EXT;
2199   dsrb->_ActualFormat = GL_DEPTH24_STENCIL8_EXT;
2200   dsrb->AllocStorage = _mesa_soft_renderbuffer_storage;
2201
2202   return dsrb;
2203}
2204