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