s_renderbuffer.c revision 6c1e27ba219e41ae2641cca0d3c67462bdba8631
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" 400c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul#include "swrast/s_context.h" 41379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul#include "swrast/s_renderbuffer.h" 42ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 43ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 44ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 45ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a software fallback for the gl_renderbuffer->AllocStorage 46ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * function. 47ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Device drivers will typically override this function for the buffers 48ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * which it manages (typically color buffers, Z and stencil). 49ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Other buffers (like software accumulation and aux buffers) which the driver 50ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * doesn't manage can be handled with this function. 51ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * 52ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This one multi-purpose function can allocate stencil, depth, accum, color 53ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * or color-index buffers! 54ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 55ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 56ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulsoft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb, 57ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLenum internalFormat, 58ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint width, GLuint height) 59ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 600c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul struct swrast_renderbuffer *srb = swrast_renderbuffer(rb); 616c1e27ba219e41ae2641cca0d3c67462bdba8631Brian Paul GLuint bpp; 620c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul 63ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul switch (internalFormat) { 64ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB: 65ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_R3_G3_B2: 66ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB4: 67ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB5: 68ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB8: 69ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB10: 70ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB12: 71ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB16: 72ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_RGB888; 73ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 74ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA: 75ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA2: 76ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA4: 77ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB5_A1: 78ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA8: 79ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul#if 1 80ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGB10_A2: 81ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA12: 82ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul#endif 83ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (_mesa_little_endian()) 84ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_RGBA8888_REV; 85ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else 86ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_RGBA8888; 87ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 88ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA16: 89ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_RGBA16_SNORM: 90ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* for accum buffer */ 91ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_SIGNED_RGBA_16; 92ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 93ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_STENCIL_INDEX: 94ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_STENCIL_INDEX1_EXT: 95ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_STENCIL_INDEX4_EXT: 96ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_STENCIL_INDEX8_EXT: 97ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_STENCIL_INDEX16_EXT: 98ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_S8; 99ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 100ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH_COMPONENT: 101ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH_COMPONENT16: 102ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_Z16; 103ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 104ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH_COMPONENT24: 105ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_X8_Z24; 106ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 107ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH_COMPONENT32: 108ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_Z32; 109ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 110ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH_STENCIL_EXT: 111ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul case GL_DEPTH24_STENCIL8_EXT: 112ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Format = MESA_FORMAT_Z24_S8; 113ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul break; 114ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul default: 115ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* unsupported format */ 116ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 117ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 118ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 1196c1e27ba219e41ae2641cca0d3c67462bdba8631Brian Paul bpp = _mesa_get_format_bytes(rb->Format); 1206c1e27ba219e41ae2641cca0d3c67462bdba8631Brian Paul 121ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* free old buffer storage */ 1220c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul if (srb->Buffer) { 1230c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul free(srb->Buffer); 1240c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul srb->Buffer = NULL; 125ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 126ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 1276c1e27ba219e41ae2641cca0d3c67462bdba8631Brian Paul srb->RowStride = width * bpp; 128ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 129ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (width > 0 && height > 0) { 130ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* allocate new buffer storage */ 1316c1e27ba219e41ae2641cca0d3c67462bdba8631Brian Paul srb->Buffer = malloc(srb->RowStride * height); 132ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 1330c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul if (srb->Buffer == NULL) { 134ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Width = 0; 135ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Height = 0; 136ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, 137ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "software renderbuffer allocation (%d x %d x %d)", 1386c1e27ba219e41ae2641cca0d3c67462bdba8631Brian Paul width, height, bpp); 139ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 140ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 141ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 142ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 143ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Width = width; 144ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->Height = height; 145ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->_BaseFormat = _mesa_base_fbo_format(ctx, internalFormat); 146ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 147ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (rb->Name == 0 && 148ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul internalFormat == GL_RGBA16_SNORM && 149ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->_BaseFormat == 0) { 150ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* NOTE: This is a special case just for accumulation buffers. 151ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a very limited use case- there's no snorm texturing or 152ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering going on. 153ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 154ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->_BaseFormat = GL_RGBA; 155ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 156ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else { 157ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* the internalFormat should have been error checked long ago */ 158ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul ASSERT(rb->_BaseFormat); 159ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 160ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 161ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 162ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 163ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 164ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 165f6a3979a0444a14c198c10501e9ff13f24625443Brian Paul/** 166f6a3979a0444a14c198c10501e9ff13f24625443Brian Paul * Called via gl_renderbuffer::Delete() 167f6a3979a0444a14c198c10501e9ff13f24625443Brian Paul */ 168f6a3979a0444a14c198c10501e9ff13f24625443Brian Paulstatic void 169f6a3979a0444a14c198c10501e9ff13f24625443Brian Paulsoft_renderbuffer_delete(struct gl_renderbuffer *rb) 170f6a3979a0444a14c198c10501e9ff13f24625443Brian Paul{ 1710c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul struct swrast_renderbuffer *srb = swrast_renderbuffer(rb); 1720c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul 1730c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul if (srb->Buffer) { 1740c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul free(srb->Buffer); 1750c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul srb->Buffer = NULL; 176f6a3979a0444a14c198c10501e9ff13f24625443Brian Paul } 1770c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul free(srb); 178f6a3979a0444a14c198c10501e9ff13f24625443Brian Paul} 179f6a3979a0444a14c198c10501e9ff13f24625443Brian Paul 180f6a3979a0444a14c198c10501e9ff13f24625443Brian Paul 181ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulvoid 182379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul_swrast_map_soft_renderbuffer(struct gl_context *ctx, 183379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul struct gl_renderbuffer *rb, 184379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLuint x, GLuint y, GLuint w, GLuint h, 185379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLbitfield mode, 186379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLubyte **out_map, 187379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLint *out_stride) 188ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 1890c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul struct swrast_renderbuffer *srb = swrast_renderbuffer(rb); 1900c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul GLubyte *map = srb->Buffer; 191ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul int cpp = _mesa_get_format_bytes(rb->Format); 1921e1b5cb01a10e39d01923e3c7e989c44210950cdBrian Paul int stride = rb->Width * cpp; 193ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 1947a36345f70a0b8ac2d480bb52eb2c74c2be5a978Brian Paul if (!map) { 1957a36345f70a0b8ac2d480bb52eb2c74c2be5a978Brian Paul *out_map = NULL; 1967a36345f70a0b8ac2d480bb52eb2c74c2be5a978Brian Paul *out_stride = 0; 1977a36345f70a0b8ac2d480bb52eb2c74c2be5a978Brian Paul } 198ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 199ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul map += y * stride; 200ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul map += x * cpp; 201ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 202ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul *out_map = map; 203ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul *out_stride = stride; 204ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 205ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 206ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 207ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulvoid 208379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul_swrast_unmap_soft_renderbuffer(struct gl_context *ctx, 209379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul struct gl_renderbuffer *rb) 210ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 211ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 212ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 213ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 214ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 215ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 216ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Allocate a software-based renderbuffer. This is called via the 217ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * ctx->Driver.NewRenderbuffer() function when the user creates a new 218ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer. 219ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This would not be used for hardware-based renderbuffers. 220ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 221ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstruct gl_renderbuffer * 222379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul_swrast_new_soft_renderbuffer(struct gl_context *ctx, GLuint name) 223ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 2240c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul struct swrast_renderbuffer *srb = CALLOC_STRUCT(swrast_renderbuffer); 2250c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul if (srb) { 2260c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul _mesa_init_renderbuffer(&srb->Base, name); 2270c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul srb->Base.AllocStorage = soft_renderbuffer_storage; 2280c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul srb->Base.Delete = soft_renderbuffer_delete; 229ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 2300c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul return &srb->Base; 231ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 232ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 233ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 234ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 235ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Add software-based color renderbuffers to the given framebuffer. 236ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers when creating a 237ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * window system framebuffer (not a user-created render/framebuffer). 238ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Once this function is called, you can basically forget about this 239ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer; core Mesa will handle all the buffer management and 240ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering! 241ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 242ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 243ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Pauladd_color_renderbuffers(struct gl_context *ctx, struct gl_framebuffer *fb, 244ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint rgbBits, GLuint alphaBits, 245ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean frontLeft, GLboolean backLeft, 246ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean frontRight, GLboolean backRight) 247ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 248ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul gl_buffer_index b; 249ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 250ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (rgbBits > 16 || alphaBits > 16) { 251ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_problem(ctx, 252ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "Unsupported bit depth in add_color_renderbuffers"); 253ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 254ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 255ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 256ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(MAX_COLOR_ATTACHMENTS >= 4); 257ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 258ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul for (b = BUFFER_FRONT_LEFT; b <= BUFFER_BACK_RIGHT; b++) { 259ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul struct gl_renderbuffer *rb; 260ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 261ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (b == BUFFER_FRONT_LEFT && !frontLeft) 262ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul continue; 263ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else if (b == BUFFER_BACK_LEFT && !backLeft) 264ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul continue; 265ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else if (b == BUFFER_FRONT_RIGHT && !frontRight) 266ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul continue; 267ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else if (b == BUFFER_BACK_RIGHT && !backRight) 268ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul continue; 269ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 270ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Attachment[b].Renderbuffer == NULL); 271ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 272f2479530b8be3866c234ac759a7fa84e634dd1aaBrian Paul rb = ctx->Driver.NewRenderbuffer(ctx, 0); 273ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (!rb) { 274ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating color buffer"); 275ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 276ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 277ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 278ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_RGBA; 279ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 280ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 281ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_add_renderbuffer(fb, b, rb); 282ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 283ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 284ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 285ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 286ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 287ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 288ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 289ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Add a software-based depth renderbuffer to the given framebuffer. 290ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers when creating a 291ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * window system framebuffer (not a user-created render/framebuffer). 292ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Once this function is called, you can basically forget about this 293ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer; core Mesa will handle all the buffer management and 294ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering! 295ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 296ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 297ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Pauladd_depth_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb, 298ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint depthBits) 299ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 300ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul struct gl_renderbuffer *rb; 301ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 302ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (depthBits > 32) { 303ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_problem(ctx, 304ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "Unsupported depthBits in add_depth_renderbuffer"); 305ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 306ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 307ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 308ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Attachment[BUFFER_DEPTH].Renderbuffer == NULL); 309ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 310f2479530b8be3866c234ac759a7fa84e634dd1aaBrian Paul rb = _swrast_new_soft_renderbuffer(ctx, 0); 311ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (!rb) { 312ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating depth buffer"); 313ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 314ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 315ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 316ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (depthBits <= 16) { 317ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_DEPTH_COMPONENT16; 318ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 319ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else if (depthBits <= 24) { 320ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_DEPTH_COMPONENT24; 321ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 322ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul else { 323ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_DEPTH_COMPONENT32; 324ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 325ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 326ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 327ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb); 328ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 329ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 330ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 331ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 332ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 333ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 334ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Add a software-based stencil renderbuffer to the given framebuffer. 335ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers when creating a 336ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * window system framebuffer (not a user-created render/framebuffer). 337ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Once this function is called, you can basically forget about this 338ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer; core Mesa will handle all the buffer management and 339ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering! 340ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 341ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 342ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Pauladd_stencil_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb, 343ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint stencilBits) 344ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 345ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul struct gl_renderbuffer *rb; 346ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 347ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (stencilBits > 16) { 348ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_problem(ctx, 349ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "Unsupported stencilBits in add_stencil_renderbuffer"); 350ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 351ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 352ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 353ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Attachment[BUFFER_STENCIL].Renderbuffer == NULL); 354ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 355f2479530b8be3866c234ac759a7fa84e634dd1aaBrian Paul rb = _swrast_new_soft_renderbuffer(ctx, 0); 356ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (!rb) { 357ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating stencil buffer"); 358ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 359ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 360ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 361ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(stencilBits <= 8); 362ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_STENCIL_INDEX8; 363ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 364ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 365ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb); 366ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 367ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 368ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 369ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 370ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 371d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paulstatic GLboolean 372d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Pauladd_depth_stencil_renderbuffer(struct gl_context *ctx, 373d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul struct gl_framebuffer *fb) 374d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul{ 375d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul struct gl_renderbuffer *rb; 376d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 377d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul assert(fb->Attachment[BUFFER_DEPTH].Renderbuffer == NULL); 378d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul assert(fb->Attachment[BUFFER_STENCIL].Renderbuffer == NULL); 379d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 380f2479530b8be3866c234ac759a7fa84e634dd1aaBrian Paul rb = _swrast_new_soft_renderbuffer(ctx, 0); 381d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul if (!rb) { 382d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating depth+stencil buffer"); 383d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul return GL_FALSE; 384d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul } 385d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 386d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul rb->InternalFormat = GL_DEPTH_STENCIL; 387d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 388d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 389d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb); 390d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb); 391d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 392d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul return GL_TRUE; 393d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul} 394d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 395d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul 396ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 397ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Add a software-based accumulation renderbuffer to the given framebuffer. 398ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers when creating a 399ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * window system framebuffer (not a user-created render/framebuffer). 400ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Once this function is called, you can basically forget about this 401ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer; core Mesa will handle all the buffer management and 402ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering! 403ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 404ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 405ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Pauladd_accum_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb, 406ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint redBits, GLuint greenBits, 407ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint blueBits, GLuint alphaBits) 408ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 409ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul struct gl_renderbuffer *rb; 410ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 411ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (redBits > 16 || greenBits > 16 || blueBits > 16 || alphaBits > 16) { 412ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_problem(ctx, 413ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "Unsupported accumBits in add_accum_renderbuffer"); 414ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 415ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 416ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 417ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Attachment[BUFFER_ACCUM].Renderbuffer == NULL); 418ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 419f2479530b8be3866c234ac759a7fa84e634dd1aaBrian Paul rb = _swrast_new_soft_renderbuffer(ctx, 0); 420ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (!rb) { 421ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating accum buffer"); 422ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 423ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 424ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 425ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_RGBA16_SNORM; 426ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 427ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_ACCUM, rb); 428ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 429ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 430ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 431ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 432ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 433ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 434ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 435ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Add a software-based aux renderbuffer to the given framebuffer. 436ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers when creating a 437ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * window system framebuffer (not a user-created render/framebuffer). 438ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Once this function is called, you can basically forget about this 439ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * renderbuffer; core Mesa will handle all the buffer management and 440ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * rendering! 441ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * 442ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * NOTE: color-index aux buffers not supported. 443ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 444ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulstatic GLboolean 445ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Pauladd_aux_renderbuffers(struct gl_context *ctx, struct gl_framebuffer *fb, 446ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint colorBits, GLuint numBuffers) 447ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 448ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLuint i; 449ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 450ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (colorBits > 16) { 451ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_problem(ctx, 452ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul "Unsupported colorBits in add_aux_renderbuffers"); 453ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 454ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 455ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 456ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(numBuffers <= MAX_AUX_BUFFERS); 457ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 458ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul for (i = 0; i < numBuffers; i++) { 459f2479530b8be3866c234ac759a7fa84e634dd1aaBrian Paul struct gl_renderbuffer *rb = _swrast_new_soft_renderbuffer(ctx, 0); 460ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 461ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Attachment[BUFFER_AUX0 + i].Renderbuffer == NULL); 462ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 463ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (!rb) { 464ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating aux buffer"); 465ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_FALSE; 466ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 467ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 468ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert (colorBits <= 8); 469ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->InternalFormat = GL_RGBA; 470ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 471ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul rb->AllocStorage = soft_renderbuffer_storage; 472ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul _mesa_add_renderbuffer(fb, BUFFER_AUX0 + i, rb); 473ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 474ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul return GL_TRUE; 475ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 476ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 477ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 478ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul/** 479ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * Create/attach software-based renderbuffers to the given framebuffer. 480ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * This is a helper routine for device drivers. Drivers can just as well 481ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul * call the individual _mesa_add_*_renderbuffer() routines directly. 482ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul */ 483ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paulvoid 484379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul_swrast_add_soft_renderbuffers(struct gl_framebuffer *fb, 485379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean color, 486379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean depth, 487379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean stencil, 488379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean accum, 489379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean alpha, 490379e0a3ada995b4cf57d142e0dd4618022e0aadcBrian Paul GLboolean aux) 491ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul{ 492ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean frontLeft = GL_TRUE; 493ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean backLeft = fb->Visual.doubleBufferMode; 494ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean frontRight = fb->Visual.stereoMode; 495ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul GLboolean backRight = fb->Visual.stereoMode && fb->Visual.doubleBufferMode; 496ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 497ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (color) { 498ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.redBits == fb->Visual.greenBits); 499ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.redBits == fb->Visual.blueBits); 500ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul add_color_renderbuffers(NULL, fb, 501ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.redBits, 502ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.alphaBits, 503ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul frontLeft, backLeft, 504ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul frontRight, backRight); 505ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 506ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 507d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul#if 0 508d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul /* This is pretty much for debugging purposes only since there's a perf 509d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul * hit for using combined depth/stencil in swrast. 510d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul */ 511d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul if (depth && fb->Visual.depthBits == 24 && 512d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul stencil && fb->Visual.stencilBits == 8) { 513d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul /* use combined depth/stencil buffer */ 514d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul add_depth_stencil_renderbuffer(NULL, fb); 515d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul } 516d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul else 517d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul#else 518d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul (void) add_depth_stencil_renderbuffer; 519d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul#endif 520d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul { 521d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul if (depth) { 522d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul assert(fb->Visual.depthBits > 0); 523d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul add_depth_renderbuffer(NULL, fb, fb->Visual.depthBits); 524d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul } 525ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 526d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul if (stencil) { 527d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul assert(fb->Visual.stencilBits > 0); 528d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul add_stencil_renderbuffer(NULL, fb, fb->Visual.stencilBits); 529d7c0fac90b1fe550df3d75777747c1ae9be41fc0Brian Paul } 530ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 531ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 532ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (accum) { 533ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.accumRedBits > 0); 534ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.accumGreenBits > 0); 535ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.accumBlueBits > 0); 536ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul add_accum_renderbuffer(NULL, fb, 537ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.accumRedBits, 538ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.accumGreenBits, 539ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.accumBlueBits, 540ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.accumAlphaBits); 541ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 542ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 543ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (aux) { 544ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul assert(fb->Visual.numAuxBuffers > 0); 545ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul add_aux_renderbuffers(NULL, fb, fb->Visual.redBits, 546ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul fb->Visual.numAuxBuffers); 547ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 548ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul 549ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul#if 0 550ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul if (multisample) { 551ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul /* maybe someday */ 552ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul } 553ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul#endif 554ff8e6420fbbbd80c8fd7327f2f2b68e016b7f5c0Brian Paul} 555