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