s_renderbuffer.c revision 1e1b5cb01a10e39d01923e3c7e989c44210950cd
1ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/* 2ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Mesa 3-D graphics library 3ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Version: 6.5 4ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * 5ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 6ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * 7ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 8ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * copy of this software and associated documentation files (the "Software"), 9ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * to deal in the Software without restriction, including without limitation 10ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * and/or sell copies of the Software, and to permit persons to whom the 12ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Software is furnished to do so, subject to the following conditions: 13ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * 14ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * The above copyright notice and this permission notice shall be included 15ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * in all copies or substantial portions of the Software. 16ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * 17ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 24ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 25ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 26ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 27379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul * Functions for allocating/managing software-based renderbuffers. 28ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Also, routines for reading/writing software-based renderbuffer data as 29ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * ubytes, ushorts, uints, etc. 30ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 31ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 32ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 33379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul#include "main/glheader.h" 34379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul#include "main/imports.h" 35379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul#include "main/context.h" 36379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul#include "main/fbobject.h" 37379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul#include "main/formats.h" 38379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul#include "main/mtypes.h" 39379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul#include "main/renderbuffer.h" 40379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul#include "swrast/s_renderbuffer.h" 41ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 42ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 43ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 44ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 45ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is the default software fallback for gl_renderbuffer's span 46ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * access functions. 47ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * 48ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * The assumptions are that rb->Data will be a pointer to (0,0), that pixels 49ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * are packed in the type of rb->Format, and that subsequent rows appear 50ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rb->RowStride pixels later. 51ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 52ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulvoid 53379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul_swrast_set_renderbuffer_accessors(struct gl_renderbuffer *rb) 54ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 55ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul switch (rb->Format) { 56ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_RGB888: 57ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_UNSIGNED_BYTE; 58ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 59ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 60ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_RGBA8888: 61ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_RGBA8888_REV: 62ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_UNSIGNED_BYTE; 63ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 64ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 65ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_R8: 66ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_UNSIGNED_BYTE; 67d65bbfa947b9e2c5353bda857470a01d5398b3faBrian Paul 68ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 69ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 70ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_GR88: 71ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_UNSIGNED_BYTE; 72ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 73ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 74ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_R16: 75ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_UNSIGNED_SHORT; 76d65bbfa947b9e2c5353bda857470a01d5398b3faBrian Paul 77ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 78ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 79ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_RG1616: 80ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_UNSIGNED_SHORT; 81ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 82ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 83ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_SIGNED_RGBA_16: 84ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_SHORT; 85ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 86ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 87ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_S8: 88ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_UNSIGNED_BYTE; 89ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 90ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 91ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_Z16: 92ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_UNSIGNED_SHORT; 93ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 94ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 95ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_Z32: 96ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_X8_Z24: 97ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_Z24_X8: 98ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_UNSIGNED_INT; 99ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 100ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 101ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_Z24_S8: 102ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_S8_Z24: 103ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->DataType = GL_UNSIGNED_INT_24_8_EXT; 104ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 105ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 106ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_RGBA_FLOAT32: 107d65bbfa947b9e2c5353bda857470a01d5398b3faBrian Paul rb->DataType = GL_FLOAT; 108ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 109ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 110ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_INTENSITY_FLOAT32: 111d65bbfa947b9e2c5353bda857470a01d5398b3faBrian Paul rb->DataType = GL_FLOAT; 112ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 113ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 114ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_LUMINANCE_FLOAT32: 115d65bbfa947b9e2c5353bda857470a01d5398b3faBrian Paul rb->DataType = GL_FLOAT; 116ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 117ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 118ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_ALPHA_FLOAT32: 119d65bbfa947b9e2c5353bda857470a01d5398b3faBrian Paul rb->DataType = GL_FLOAT; 120ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 121ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 122ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_RG_FLOAT32: 123d65bbfa947b9e2c5353bda857470a01d5398b3faBrian Paul rb->DataType = GL_FLOAT; 124ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 125ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 126ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case MESA_FORMAT_R_FLOAT32: 127d65bbfa947b9e2c5353bda857470a01d5398b3faBrian Paul rb->DataType = GL_FLOAT; 128ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 129ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 130ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul default: 131ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 132ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 133ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 134ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 135ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 136ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a software fallback for the gl_renderbuffer->AllocStorage 137ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * function. 138ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Device drivers will typically override this function for the buffers 139ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * which it manages (typically color buffers, Z and stencil). 140ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Other buffers (like software accumulation and aux buffers) which the driver 141ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * doesn't manage can be handled with this function. 142ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * 143ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This one multi-purpose function can allocate stencil, depth, accum, color 144ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * or color-index buffers! 145ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 146ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 147ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulsoft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb, 148ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLenum internalFormat, 149ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint width, GLuint height) 150ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 151ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul switch (internalFormat) { 152ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB: 153ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_R3_G3_B2: 154ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB4: 155ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB5: 156ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB8: 157ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB10: 158ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB12: 159ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB16: 160ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_RGB888; 161ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 162ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA: 163ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA2: 164ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA4: 165ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB5_A1: 166ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA8: 167ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul#if 1 168ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB10_A2: 169ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA12: 170ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul#endif 171ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (_mesa_little_endian()) 172ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_RGBA8888_REV; 173ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else 174ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_RGBA8888; 175ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 176ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA16: 177ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA16_SNORM: 178ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* for accum buffer */ 179ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_SIGNED_RGBA_16; 180ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 181ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_STENCIL_INDEX: 182ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_STENCIL_INDEX1_EXT: 183ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_STENCIL_INDEX4_EXT: 184ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_STENCIL_INDEX8_EXT: 185ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_STENCIL_INDEX16_EXT: 186ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_S8; 187ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 188ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH_COMPONENT: 189ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH_COMPONENT16: 190ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_Z16; 191ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 192ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH_COMPONENT24: 193ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_X8_Z24; 194ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 195ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH_COMPONENT32: 196ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_Z32; 197ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 198ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH_STENCIL_EXT: 199ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH24_STENCIL8_EXT: 200ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_Z24_S8; 201ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 202ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul default: 203ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* unsupported format */ 204ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 205ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 206ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 207379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul _swrast_set_renderbuffer_accessors(rb); 208ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 209ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul ASSERT(rb->DataType); 210ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 211ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* free old buffer storage */ 212ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (rb->Data) { 213ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul free(rb->Data); 214ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Data = NULL; 215ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 216ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 2171e1b5cb01a10e39d01923e3c7e989c44210950cdBrian Paul rb->RowStrideBytes = width * _mesa_get_format_bytes(rb->Format); 218ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 219ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (width > 0 && height > 0) { 220ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* allocate new buffer storage */ 221ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Data = malloc(width * height * _mesa_get_format_bytes(rb->Format)); 222ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 223ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (rb->Data == NULL) { 224ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Width = 0; 225ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Height = 0; 226ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, 227ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "software renderbuffer allocation (%d x %d x %d)", 228ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul width, height, _mesa_get_format_bytes(rb->Format)); 229ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 230ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 231ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 232ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 233ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Width = width; 234ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Height = height; 235ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->_BaseFormat = _mesa_base_fbo_format(ctx, internalFormat); 236ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 237ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (rb->Name == 0 && 238ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul internalFormat == GL_RGBA16_SNORM && 239ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->_BaseFormat == 0) { 240ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* NOTE: This is a special case just for accumulation buffers. 241ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a very limited use case- there's no snorm texturing or 242ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering going on. 243ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 244ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->_BaseFormat = GL_RGBA; 245ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 246ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else { 247ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* the internalFormat should have been error checked long ago */ 248ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul ASSERT(rb->_BaseFormat); 249ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 250ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 251ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 252ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 253ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 254ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 255ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulvoid 256379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul_swrast_map_soft_renderbuffer(struct gl_context *ctx, 257379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul struct gl_renderbuffer *rb, 258379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLuint x, GLuint y, GLuint w, GLuint h, 259379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLbitfield mode, 260379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLubyte **out_map, 261379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLint *out_stride) 262ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 263ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLubyte *map = rb->Data; 264ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul int cpp = _mesa_get_format_bytes(rb->Format); 2651e1b5cb01a10e39d01923e3c7e989c44210950cdBrian Paul int stride = rb->Width * cpp; 266ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 267ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul ASSERT(rb->Data); 268ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 269ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul map += y * stride; 270ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul map += x * cpp; 271ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 272ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul *out_map = map; 273ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul *out_stride = stride; 274ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 275ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 276ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 277ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulvoid 278379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul_swrast_unmap_soft_renderbuffer(struct gl_context *ctx, 279379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul struct gl_renderbuffer *rb) 280ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 281ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 282ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 283ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 284ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 285ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 286ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Allocate a software-based renderbuffer. This is called via the 287ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * ctx->Driver.NewRenderbuffer() function when the user creates a new 288ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer. 289ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This would not be used for hardware-based renderbuffers. 290ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 291ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstruct gl_renderbuffer * 292379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul_swrast_new_soft_renderbuffer(struct gl_context *ctx, GLuint name) 293ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 294ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, name); 295ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (rb) { 296ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 297ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 298ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return rb; 299ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 300ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 301ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 302ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 303ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Add software-based color renderbuffers to the given framebuffer. 304ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers when creating a 305ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * window system framebuffer (not a user-created render/framebuffer). 306ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Once this function is called, you can basically forget about this 307ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer; core Mesa will handle all the buffer management and 308ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering! 309ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 310ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 311ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Pauladd_color_renderbuffers(struct gl_context *ctx, struct gl_framebuffer *fb, 312ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint rgbBits, GLuint alphaBits, 313ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean frontLeft, GLboolean backLeft, 314ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean frontRight, GLboolean backRight) 315ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 316ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul gl_buffer_index b; 317ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 318ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (rgbBits > 16 || alphaBits > 16) { 319ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_problem(ctx, 320ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "Unsupported bit depth in add_color_renderbuffers"); 321ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 322ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 323ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 324ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(MAX_COLOR_ATTACHMENTS >= 4); 325ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 326ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul for (b = BUFFER_FRONT_LEFT; b <= BUFFER_BACK_RIGHT; b++) { 327ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul struct gl_renderbuffer *rb; 328ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 329ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (b == BUFFER_FRONT_LEFT && !frontLeft) 330ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul continue; 331ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else if (b == BUFFER_BACK_LEFT && !backLeft) 332ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul continue; 333ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else if (b == BUFFER_FRONT_RIGHT && !frontRight) 334ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul continue; 335ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else if (b == BUFFER_BACK_RIGHT && !backRight) 336ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul continue; 337ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 338ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Attachment[b].Renderbuffer == NULL); 339ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 340ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb = _mesa_new_renderbuffer(ctx, 0); 341ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (!rb) { 342ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating color buffer"); 343ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 344ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 345ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 346ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_RGBA; 347ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 348ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 349ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_add_renderbuffer(fb, b, rb); 350ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 351ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 352ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 353ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 354ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 355ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 356ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 357ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Add a software-based depth renderbuffer to the given framebuffer. 358ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers when creating a 359ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * window system framebuffer (not a user-created render/framebuffer). 360ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Once this function is called, you can basically forget about this 361ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer; core Mesa will handle all the buffer management and 362ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering! 363ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 364ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 365ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Pauladd_depth_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb, 366ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint depthBits) 367ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 368ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul struct gl_renderbuffer *rb; 369ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 370ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (depthBits > 32) { 371ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_problem(ctx, 372ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "Unsupported depthBits in add_depth_renderbuffer"); 373ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 374ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 375ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 376ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Attachment[BUFFER_DEPTH].Renderbuffer == NULL); 377ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 378ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb = _mesa_new_renderbuffer(ctx, 0); 379ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (!rb) { 380ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating depth buffer"); 381ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 382ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 383ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 384ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (depthBits <= 16) { 385ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_DEPTH_COMPONENT16; 386ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 387ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else if (depthBits <= 24) { 388ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_DEPTH_COMPONENT24; 389ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 390ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else { 391ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_DEPTH_COMPONENT32; 392ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 393ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 394ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 395ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb); 396ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 397ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 398ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 399ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 400ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 401ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 402ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Add a software-based stencil renderbuffer to the given framebuffer. 403ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers when creating a 404ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * window system framebuffer (not a user-created render/framebuffer). 405ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Once this function is called, you can basically forget about this 406ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer; core Mesa will handle all the buffer management and 407ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering! 408ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 409ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 410ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Pauladd_stencil_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb, 411ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint stencilBits) 412ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 413ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul struct gl_renderbuffer *rb; 414ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 415ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (stencilBits > 16) { 416ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_problem(ctx, 417ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "Unsupported stencilBits in add_stencil_renderbuffer"); 418ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 419ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 420ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 421ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Attachment[BUFFER_STENCIL].Renderbuffer == NULL); 422ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 423ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb = _mesa_new_renderbuffer(ctx, 0); 424ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (!rb) { 425ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating stencil buffer"); 426ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 427ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 428ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 429ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(stencilBits <= 8); 430ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_STENCIL_INDEX8; 431ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 432ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 433ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb); 434ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 435ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 436ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 437ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 438ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 439d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paulstatic GLboolean 440d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Pauladd_depth_stencil_renderbuffer(struct gl_context *ctx, 441d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul struct gl_framebuffer *fb) 442d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul{ 443d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul struct gl_renderbuffer *rb; 444d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 445d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul assert(fb->Attachment[BUFFER_DEPTH].Renderbuffer == NULL); 446d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul assert(fb->Attachment[BUFFER_STENCIL].Renderbuffer == NULL); 447d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 448d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul rb = _mesa_new_renderbuffer(ctx, 0); 449d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul if (!rb) { 450d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating depth+stencil buffer"); 451d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul return GL_FALSE; 452d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul } 453d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 454d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul rb->InternalFormat = GL_DEPTH_STENCIL; 455d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 456d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 457d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb); 458d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb); 459d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 460d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul return GL_TRUE; 461d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul} 462d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 463d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 464ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 465ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Add a software-based accumulation renderbuffer to the given framebuffer. 466ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers when creating a 467ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * window system framebuffer (not a user-created render/framebuffer). 468ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Once this function is called, you can basically forget about this 469ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer; core Mesa will handle all the buffer management and 470ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering! 471ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 472ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 473ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Pauladd_accum_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb, 474ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint redBits, GLuint greenBits, 475ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint blueBits, GLuint alphaBits) 476ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 477ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul struct gl_renderbuffer *rb; 478ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 479ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (redBits > 16 || greenBits > 16 || blueBits > 16 || alphaBits > 16) { 480ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_problem(ctx, 481ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "Unsupported accumBits in add_accum_renderbuffer"); 482ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 483ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 484ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 485ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Attachment[BUFFER_ACCUM].Renderbuffer == NULL); 486ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 487ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb = _mesa_new_renderbuffer(ctx, 0); 488ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (!rb) { 489ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating accum buffer"); 490ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 491ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 492ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 493ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_RGBA16_SNORM; 494ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 495ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_ACCUM, rb); 496ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 497ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 498ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 499ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 500ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 501ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 502ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 503ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Add a software-based aux renderbuffer to the given framebuffer. 504ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers when creating a 505ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * window system framebuffer (not a user-created render/framebuffer). 506ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Once this function is called, you can basically forget about this 507ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer; core Mesa will handle all the buffer management and 508ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering! 509ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * 510ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * NOTE: color-index aux buffers not supported. 511ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 512ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 513ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Pauladd_aux_renderbuffers(struct gl_context *ctx, struct gl_framebuffer *fb, 514ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint colorBits, GLuint numBuffers) 515ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 516ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint i; 517ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 518ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (colorBits > 16) { 519ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_problem(ctx, 520ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "Unsupported colorBits in add_aux_renderbuffers"); 521ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 522ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 523ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 524ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(numBuffers <= MAX_AUX_BUFFERS); 525ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 526ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul for (i = 0; i < numBuffers; i++) { 527ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, 0); 528ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 529ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Attachment[BUFFER_AUX0 + i].Renderbuffer == NULL); 530ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 531ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (!rb) { 532ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating aux buffer"); 533ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 534ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 535ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 536ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert (colorBits <= 8); 537ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_RGBA; 538ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 539ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 540ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_AUX0 + i, rb); 541ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 542ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 543ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 544ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 545ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 546ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 547ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Create/attach software-based renderbuffers to the given framebuffer. 548ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers. Drivers can just as well 549ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * call the individual _mesa_add_*_renderbuffer() routines directly. 550ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 551ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulvoid 552379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul_swrast_add_soft_renderbuffers(struct gl_framebuffer *fb, 553379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean color, 554379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean depth, 555379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean stencil, 556379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean accum, 557379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean alpha, 558379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean aux) 559ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 560ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean frontLeft = GL_TRUE; 561ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean backLeft = fb->Visual.doubleBufferMode; 562ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean frontRight = fb->Visual.stereoMode; 563ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean backRight = fb->Visual.stereoMode && fb->Visual.doubleBufferMode; 564ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 565ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (color) { 566ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.redBits == fb->Visual.greenBits); 567ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.redBits == fb->Visual.blueBits); 568ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul add_color_renderbuffers(NULL, fb, 569ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.redBits, 570ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.alphaBits, 571ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul frontLeft, backLeft, 572ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul frontRight, backRight); 573ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 574ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 575d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul#if 0 576d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul /* This is pretty much for debugging purposes only since there's a perf 577d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul * hit for using combined depth/stencil in swrast. 578d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul */ 579d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul if (depth && fb->Visual.depthBits == 24 && 580d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul stencil && fb->Visual.stencilBits == 8) { 581d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul /* use combined depth/stencil buffer */ 582d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul add_depth_stencil_renderbuffer(NULL, fb); 583d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul } 584d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul else 585d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul#else 586d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul (void) add_depth_stencil_renderbuffer; 587d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul#endif 588d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul { 589d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul if (depth) { 590d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul assert(fb->Visual.depthBits > 0); 591d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul add_depth_renderbuffer(NULL, fb, fb->Visual.depthBits); 592d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul } 593ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 594d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul if (stencil) { 595d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul assert(fb->Visual.stencilBits > 0); 596d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul add_stencil_renderbuffer(NULL, fb, fb->Visual.stencilBits); 597d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul } 598ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 599ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 600ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (accum) { 601ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.accumRedBits > 0); 602ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.accumGreenBits > 0); 603ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.accumBlueBits > 0); 604ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul add_accum_renderbuffer(NULL, fb, 605ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.accumRedBits, 606ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.accumGreenBits, 607ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.accumBlueBits, 608ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.accumAlphaBits); 609ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 610ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 611ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (aux) { 612ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.numAuxBuffers > 0); 613ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul add_aux_renderbuffers(NULL, fb, fb->Visual.redBits, 614ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.numAuxBuffers); 615ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 616ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 617ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul#if 0 618ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (multisample) { 619ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* maybe someday */ 620ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 621ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul#endif 622ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 623