1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 6.5.3 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2007 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 * Off-Screen Mesa rendering / Rendering into client memory space 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note on thread safety: this driver is thread safe. All 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * functions are reentrant. The notion of current context is 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * managed by the core _mesa_make_current() and _mesa_get_current_context() 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * functions. Those functions are thread-safe. 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "GL/osmesa.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/extensions.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/formats.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/framebuffer.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mipmap.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/renderbuffer.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/swrast.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast_setup/swrast_setup.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_context.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_lines.h" 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_renderbuffer.h" 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_triangle.h" 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/tnl.h" 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_context.h" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_pipeline.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/driverfuncs.h" 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/meta.h" 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vbo/vbo.h" 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define OSMESA_RENDERBUFFER_CLASS 0x053 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OSMesa rendering context, derived from core Mesa struct gl_context. 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct osmesa_context 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context mesa; /*< Base class - this must be first */ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_config *gl_visual; /*< Describes the buffers */ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct swrast_renderbuffer *srb; /*< The user's colorbuffer */ 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_framebuffer *gl_buffer; /*< The framebuffer, containing user's rb */ 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format; /*< User-specified context format */ 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint userRowLength; /*< user-specified number of pixels per row */ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rInd, gInd, bInd, aInd;/*< index offsets for RGBA formats */ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvoid *rowaddr[SWRAST_MAX_HEIGHT]; /*< address of first pixel in each image row */ 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean yup; /*< TRUE -> Y increases upward */ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*< FALSE -> Y increases downward */ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum DataType; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE OSMesaContext 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMESA_CONTEXT(struct gl_context *ctx) 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Just cast, since we're using structure containment */ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (OSMesaContext) ctx; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*** Private Device Driver Functions ***/ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte * 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_string( struct gl_context *ctx, GLenum name ) 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (name) { 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RENDERER: 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if CHAN_BITS == 32 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (const GLubyte *) "Mesa OffScreen32"; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif CHAN_BITS == 16 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (const GLubyte *) "Mesa OffScreen16"; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (const GLubyte *) "Mesa OffScreen"; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgosmesa_update_state( struct gl_context *ctx, GLuint new_state ) 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* easy - just propogate */ 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_InvalidateState( ctx, new_state ); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swsetup_InvalidateState( ctx, new_state ); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_InvalidateState( ctx, new_state ); 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _vbo_InvalidateState( ctx, new_state ); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Macros for optimized line/triangle rendering. 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only for 8-bit channel, RGBA, BGRA, ARGB formats. 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PACK_RGBA(DST, R, G, B, A) \ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (DST)[osmesa->rInd] = R; \ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (DST)[osmesa->gInd] = G; \ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (DST)[osmesa->bInd] = B; \ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (DST)[osmesa->aInd] = A; \ 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PIXELADDR4(X,Y) ((GLchan *) osmesa->rowaddr[Y] + 4 * (X)) 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw a flat-shaded, RGB line into an osmesa buffer. 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME flat_rgba_line 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CLIP_HACK 1 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SETUP_CODE \ 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); \ 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLchan *color = vert1->color; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PLOT(X, Y) \ 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLchan *p = PIXELADDR4(X, Y); \ 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PACK_RGBA(p, color[0], color[1], color[2], color[3]); \ 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_linetemp.h" 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer. 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME flat_rgba_z_line 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CLIP_HACK 1 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_Z 1 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SETUP_CODE \ 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); \ 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLchan *color = vert1->color; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PLOT(X, Y) \ 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (Z < *zPtr) { \ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLchan *p = PIXELADDR4(X, Y); \ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PACK_RGBA(p, color[RCOMP], color[GCOMP], \ 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color[BCOMP], color[ACOMP]); \ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *zPtr = Z; \ 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_linetemp.h" 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Analyze context state to see if we can provide a fast line drawing 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * function. Otherwise, return NULL. 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic swrast_line_func 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgosmesa_choose_line_function( struct gl_context *ctx ) 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const SWcontext *swrast = SWRAST_CONTEXT(ctx); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode != GL_RENDER) return NULL; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Line.SmoothFlag) return NULL; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Texture._EnabledUnits) return NULL; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.ShadeModel != GL_FLAT) return NULL; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Line.Width != 1.0F) return NULL; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Line.StippleFlag) return NULL; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Line.SmoothFlag) return NULL; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->format != OSMESA_RGBA && 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->format != OSMESA_BGRA && 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->format != OSMESA_ARGB) return NULL; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swrast->_RasterMask==DEPTH_BIT 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Depth.Func==GL_LESS 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Depth.Mask==GL_TRUE 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (swrast_line_func) flat_rgba_z_line; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swrast->_RasterMask == 0) { 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (swrast_line_func) flat_rgba_line; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (swrast_line_func) NULL; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** Optimized triangle rendering *****/ 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Smooth-shaded, z-less triangle, RGBA color. 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME smooth_rgba_z_triangle 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_Z 1 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_RGB 1 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_ALPHA 1 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SETUP_CODE \ 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_SPAN( span ) { \ 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; \ 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLchan *img = PIXELADDR4(span.x, span.y); \ 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < span.end; i++, img += 4) { \ 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint z = FixedToDepth(span.z); \ 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (z < zRow[i]) { \ 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PACK_RGBA(img, FixedToChan(span.red), \ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FixedToChan(span.green), FixedToChan(span.blue), \ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FixedToChan(span.alpha)); \ 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zRow[i] = z; \ 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.red += span.redStep; \ 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.green += span.greenStep; \ 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.blue += span.blueStep; \ 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.alpha += span.alphaStep; \ 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.z += span.zStep; \ 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_tritemp.h" 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Flat-shaded, z-less triangle, RGBA color. 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME flat_rgba_z_triangle 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_Z 1 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SETUP_CODE \ 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); \ 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint pixel; \ 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1], \ 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v2->color[2], v2->color[3]); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_SPAN( span ) { \ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; \ 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y); \ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < span.end; i++) { \ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint z = FixedToDepth(span.z); \ 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (z < zRow[i]) { \ 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img[i] = pixel; \ 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zRow[i] = z; \ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.z += span.zStep; \ 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_tritemp.h" 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return pointer to an optimized triangle function if possible. 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic swrast_tri_func 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgosmesa_choose_triangle_function( struct gl_context *ctx ) 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const SWcontext *swrast = SWRAST_CONTEXT(ctx); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.StippleFlag) return (swrast_tri_func) NULL; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Texture._EnabledUnits) return (swrast_tri_func) NULL; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->format != OSMESA_RGBA && 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->format != OSMESA_BGRA && 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->format != OSMESA_ARGB) return (swrast_tri_func) NULL; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Polygon.CullFlag && 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (swrast_tri_func) NULL; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (swrast->_RasterMask == DEPTH_BIT && 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Depth.Func == GL_LESS && 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Depth.Mask == GL_TRUE && 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.ShadeModel == GL_SMOOTH) { 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (swrast_tri_func) smooth_rgba_z_triangle; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (swrast_tri_func) flat_rgba_z_triangle; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (swrast_tri_func) NULL; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Override for the swrast triangle-selection function. Try to use one 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of our internal triangle functions, otherwise fall back to the 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * standard swrast functions. 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgosmesa_choose_triangle( struct gl_context *ctx ) 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWcontext *swrast = SWRAST_CONTEXT(ctx); 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->Triangle = osmesa_choose_triangle_function( ctx ); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!swrast->Triangle) 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_choose_triangle( ctx ); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgosmesa_choose_line( struct gl_context *ctx ) 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWcontext *swrast = SWRAST_CONTEXT(ctx); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->Line = osmesa_choose_line_function( ctx ); 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!swrast->Line) 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_choose_line( ctx ); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Recompute the values of the context's rowaddr array. 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_row_addresses( OSMesaContext osmesa ) 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint bytesPerRow, i; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *origin = (GLubyte *) osmesa->srb->Buffer; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rowlength; /* in pixels */ 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint height = osmesa->srb->Base.Height; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->userRowLength) 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rowlength = osmesa->userRowLength; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rowlength = osmesa->srb->Base.Width; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytesPerRow = rowlength * _mesa_get_format_bytes(osmesa->srb->Base.Format); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->yup) { 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Y=0 is bottom line of window */ 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < height; i++) { 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + i * bytesPerRow); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Y=0 is top line of window */ 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < height; i++) { 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint j = height - i - 1; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + j * bytesPerRow); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Don't use _mesa_delete_renderbuffer since we can't free rb->Buffer. 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgosmesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_delete_renderbuffer(ctx, rb); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate renderbuffer storage. We don't actually allocate any storage 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * since we're using a user-provided buffer. 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Just set up all the gl_renderbuffer methods. 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgosmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb, 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum internalFormat, GLuint width, GLuint height) 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: we can ignoring internalFormat for "window-system" renderbuffers */ 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) internalFormat; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Given the user-provided format and type, figure out which MESA_FORMAT_x 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to use. 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX There aren't Mesa formats for all the possible combinations here! 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX Specifically, there's only RGBA-order 16-bit/channel and float 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX formats. 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX The 8-bit/channel formats should all be OK. 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->format == OSMESA_RGBA) { 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->DataType == GL_UNSIGNED_BYTE) { 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_little_endian()) 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA8888_REV; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA8888; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (osmesa->DataType == GL_UNSIGNED_SHORT) { 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA_16; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA_FLOAT32; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (osmesa->format == OSMESA_BGRA) { 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->DataType == GL_UNSIGNED_BYTE) { 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_little_endian()) 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_ARGB8888; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_ARGB8888_REV; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (osmesa->DataType == GL_UNSIGNED_SHORT) { 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, "Unsupported OSMesa format BGRA/GLushort"); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */ 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, "Unsupported OSMesa format BGRA/GLfloat"); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */ 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (osmesa->format == OSMESA_ARGB) { 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->DataType == GL_UNSIGNED_BYTE) { 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_little_endian()) 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_ARGB8888_REV; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_ARGB8888; 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (osmesa->DataType == GL_UNSIGNED_SHORT) { 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, "Unsupported OSMesa format ARGB/GLushort"); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */ 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, "Unsupported OSMesa format ARGB/GLfloat"); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (osmesa->format == OSMESA_RGB) { 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->DataType == GL_UNSIGNED_BYTE) { 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGB888; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (osmesa->DataType == GL_UNSIGNED_SHORT) { 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, "Unsupported OSMesa format RGB/GLushort"); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */ 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, "Unsupported OSMesa format RGB/GLfloat"); 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */ 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (osmesa->format == OSMESA_BGR) { 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->DataType == GL_UNSIGNED_BYTE) { 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_BGR888; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (osmesa->DataType == GL_UNSIGNED_SHORT) { 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, "Unsupported OSMesa format BGR/GLushort"); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */ 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, "Unsupported OSMesa format BGR/GLfloat"); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */ 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (osmesa->format == OSMESA_RGB_565) { 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(osmesa->DataType == GL_UNSIGNED_BYTE); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGB565; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage"); 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Width = width; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Height = height; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_row_addresses( osmesa ); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate a new renderbuffer to describe the user-provided color buffer. 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct swrast_renderbuffer * 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnew_osmesa_renderbuffer(struct gl_context *ctx, GLenum format, GLenum type) 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint name = 0; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct swrast_renderbuffer *srb = CALLOC_STRUCT(swrast_renderbuffer); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srb) { 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_init_renderbuffer(&srb->Base, name); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srb->Base.ClassID = OSMESA_RENDERBUFFER_CLASS; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srb->Base.RefCount = 1; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srb->Base.Delete = osmesa_delete_renderbuffer; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srb->Base.AllocStorage = osmesa_renderbuffer_storage; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srb->Base.InternalFormat = GL_RGBA; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srb->Base._BaseFormat = GL_RGBA; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return srb; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgosmesa_MapRenderbuffer(struct gl_context *ctx, 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint x, GLuint y, GLuint w, GLuint h, 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield mode, 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte **mapOut, GLint *rowStrideOut) 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rb->ClassID == OSMESA_RENDERBUFFER_CLASS) { 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this is an OSMesa renderbuffer which wraps user memory */ 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct swrast_renderbuffer *srb = swrast_renderbuffer(rb); 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint bpp = _mesa_get_format_bytes(rb->Format); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rowStride; /* in bytes */ 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->userRowLength) 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rowStride = osmesa->userRowLength * bpp; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rowStride = rb->Width * bpp; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!osmesa->yup) { 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Y=0 is top line of window */ 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = rb->Height - y - 1; 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rowStrideOut = -rowStride; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *rowStrideOut = rowStride; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *mapOut = (GLubyte *) srb->Buffer + y * rowStride + x * bpp; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_map_soft_renderbuffer(ctx, rb, x, y, w, h, mode, 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mapOut, rowStrideOut); 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgosmesa_UnmapRenderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rb->ClassID == OSMESA_RENDERBUFFER_CLASS) { 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no-op */ 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_unmap_soft_renderbuffer(ctx, rb); 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** Public Functions *****/ 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create an Off-Screen Mesa rendering context. The only attribute needed is 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * an RGBA vs Color-Index mode flag. 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: format - Must be GL_RGBA 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sharelist - specifies another OSMesaContext with which to share 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * display lists. NULL indicates no sharing. 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: an OSMesaContext or 0 if error 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI OSMesaContext GLAPIENTRY 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaCreateContext( GLenum format, OSMesaContext sharelist ) 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS, 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 8, 0, sharelist); 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * New in Mesa 3.5 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create context and specify size of ancillary buffers. 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI OSMesaContext GLAPIENTRY 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint accumBits, OSMesaContext sharelist ) 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OSMesaContext osmesa; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dd_function_table functions; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint rind, gind, bind, aind; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rind = gind = bind = aind = 0; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (format==OSMESA_RGBA) { 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org redBits = CHAN_BITS; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org greenBits = CHAN_BITS; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blueBits = CHAN_BITS; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaBits = CHAN_BITS; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rind = 0; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gind = 1; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = 2; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aind = 3; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (format==OSMESA_BGRA) { 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org redBits = CHAN_BITS; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org greenBits = CHAN_BITS; 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blueBits = CHAN_BITS; 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaBits = CHAN_BITS; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = 0; 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gind = 1; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rind = 2; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aind = 3; 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (format==OSMESA_ARGB) { 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org redBits = CHAN_BITS; 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org greenBits = CHAN_BITS; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blueBits = CHAN_BITS; 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaBits = CHAN_BITS; 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aind = 0; 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rind = 1; 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gind = 2; 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = 3; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (format==OSMESA_RGB) { 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org redBits = CHAN_BITS; 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org greenBits = CHAN_BITS; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blueBits = CHAN_BITS; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaBits = 0; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rind = 0; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gind = 1; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = 2; 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (format==OSMESA_BGR) { 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org redBits = CHAN_BITS; 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org greenBits = CHAN_BITS; 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blueBits = CHAN_BITS; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaBits = 0; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rind = 2; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gind = 1; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = 0; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if CHAN_TYPE == GL_UNSIGNED_BYTE 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (format==OSMESA_RGB_565) { 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org redBits = 5; 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org greenBits = 6; 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blueBits = 5; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaBits = 0; 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rind = 0; /* not used */ 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gind = 0; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind = 0; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context); 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa) { 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->gl_visual = _mesa_create_visual( GL_FALSE, /* double buffer */ 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FALSE, /* stereo */ 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org redBits, 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org greenBits, 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blueBits, 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaBits, 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthBits, 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stencilBits, 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org accumBits, 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org accumBits, 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org accumBits, 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaBits ? accumBits : 0, 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1 /* num samples */ 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!osmesa->gl_visual) { 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(osmesa); 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Initialize device driver function table */ 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_init_driver_functions(&functions); 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* override with our functions */ 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions.GetString = get_string; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions.UpdateState = osmesa_update_state; 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions.GetBufferSize = NULL; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_initialize_context(&osmesa->mesa, 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org API_OPENGL, 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->gl_visual, 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sharelist ? &sharelist->mesa 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : (struct gl_context *) NULL, 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &functions, (void *) osmesa)) { 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_destroy_visual( osmesa->gl_visual ); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(osmesa); 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_sw_extensions(&(osmesa->mesa)); 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_1_3_extensions(&(osmesa->mesa)); 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_1_4_extensions(&(osmesa->mesa)); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_1_5_extensions(&(osmesa->mesa)); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_2_0_extensions(&(osmesa->mesa)); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_enable_2_1_extensions(&(osmesa->mesa)); 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->gl_buffer = _mesa_create_framebuffer(osmesa->gl_visual); 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!osmesa->gl_buffer) { 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_destroy_visual( osmesa->gl_visual ); 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_free_context_data( &osmesa->mesa ); 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(osmesa); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create depth/stencil/accum buffers. We'll create the color 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer later in OSMesaMakeCurrent(). 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_add_soft_renderbuffers(osmesa->gl_buffer, 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FALSE, /* color */ 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->gl_visual->haveDepthBuffer, 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->gl_visual->haveStencilBuffer, 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->gl_visual->haveAccumBuffer, 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FALSE, /* alpha */ 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FALSE /* aux */ ); 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->format = format; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->userRowLength = 0; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->yup = GL_TRUE; 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->rInd = rind; 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->gInd = gind; 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->bInd = bind; 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->aInd = aind; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_meta_init(&osmesa->mesa); 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Initialize the software rasterizer and helper modules. */ 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = &osmesa->mesa; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWcontext *swrast; 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl; 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_swrast_CreateContext( ctx ) || 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !_vbo_CreateContext( ctx ) || 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !_tnl_CreateContext( ctx ) || 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !_swsetup_CreateContext( ctx )) { 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_destroy_visual(osmesa->gl_visual); 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_free_context_data(ctx); 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(osmesa); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swsetup_Wakeup( ctx ); 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use default TCL pipeline */ 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl = TNL_CONTEXT(ctx); 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->Driver.RunPipeline = _tnl_run_pipeline; 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.MapRenderbuffer = osmesa_MapRenderbuffer; 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.UnmapRenderbuffer = osmesa_UnmapRenderbuffer; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.GenerateMipmap = _mesa_generate_mipmap; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Extend the software rasterizer with our optimized line and triangle 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * drawing functions. 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast = SWRAST_CONTEXT( ctx ); 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->choose_line = osmesa_choose_line; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->choose_triangle = osmesa_choose_triangle; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return osmesa; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Destroy an Off-Screen Mesa rendering context. 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param osmesa the context to destroy 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI void GLAPIENTRY 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaDestroyContext( OSMesaContext osmesa ) 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa) { 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->srb) 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_reference_renderbuffer((struct gl_renderbuffer **) &osmesa->srb, NULL); 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_meta_free( &osmesa->mesa ); 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swsetup_DestroyContext( &osmesa->mesa ); 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_DestroyContext( &osmesa->mesa ); 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _vbo_DestroyContext( &osmesa->mesa ); 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_DestroyContext( &osmesa->mesa ); 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_destroy_visual( osmesa->gl_visual ); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_reference_framebuffer( &osmesa->gl_buffer, NULL ); 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_free_context_data( &osmesa->mesa ); 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free( osmesa ); 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Bind an OSMesaContext to an image buffer. The image buffer is just a 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * block of memory which the client provides. Its size must be at least 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as large as width*height*sizeof(type). Its address should be a multiple 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of 4 if using RGBA mode. 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Image data is stored in the order of glDrawPixels: row-major order 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with the lower-left image pixel stored in the first array position 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (ie. bottom-to-top). 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If the context's viewport hasn't been initialized yet, it will now be 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * initialized to (0,0,width,height). 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: osmesa - the rendering context 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer - the image buffer memory 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * type - data type for pixel components 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are supported. But if Mesa's been compiled with CHAN_BITS==16 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * then type may be GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE. And if 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa's been build with CHAN_BITS==32 then type may be GL_FLOAT, 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE. 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * width, height - size of image buffer in pixels, at least 1 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: GL_TRUE if success, GL_FALSE if error because of invalid osmesa, 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * invalid buffer address, invalid type, width<1, height<1, 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * width>internal limit or height>internal limit. 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI GLboolean GLAPIENTRY 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type, 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height ) 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!osmesa || !buffer || 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width < 1 || height < 1 || 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width > SWRAST_MAX_WIDTH || height > SWRAST_MAX_HEIGHT) { 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->format == OSMESA_RGB_565 && type != GL_UNSIGNED_SHORT_5_6_5) { 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(type == GL_UNSIGNED_BYTE || 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (type == GL_UNSIGNED_SHORT && CHAN_BITS >= 16) || 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (type == GL_FLOAT && CHAN_BITS == 32))) { 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* i.e. is sizeof(type) * 8 > CHAN_BITS? */ 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa_update_state( &osmesa->mesa, 0 ); 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Call this periodically to detect when the user has begun using 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL rendering from multiple threads. 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _glapi_check_multithread(); 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Create a front/left color buffer which wraps the user-provided buffer. 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * There is no back color buffer. 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If the user tries to use a 8, 16 or 32-bit/channel buffer that 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * doesn't match what Mesa was compiled for (CHAN_BITS) the 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _mesa_add_renderbuffer() function will create a "wrapper" renderbuffer 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that converts rendering from CHAN_BITS to the user-requested channel 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * size. 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!osmesa->srb) { 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->srb = new_osmesa_renderbuffer(&osmesa->mesa, osmesa->format, type); 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT); 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &osmesa->srb->Base); 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(osmesa->srb->Base.RefCount == 2); 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->DataType = type; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set renderbuffer fields. Set width/height = 0 to force 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * osmesa_renderbuffer_storage() being called by _mesa_resize_framebuffer() 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->srb->Buffer = buffer; 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->srb->Base.Width = osmesa->srb->Base.Height = 0; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set the framebuffer's size. This causes the 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * osmesa_renderbuffer_storage() function to get called. 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height); 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->gl_buffer->Initialized = GL_TRUE; /* XXX TEMPORARY? */ 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_make_current( &osmesa->mesa, osmesa->gl_buffer, osmesa->gl_buffer ); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Remove renderbuffer attachment, then re-add. This installs the 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * renderbuffer adaptor/wrapper if needed (for bpp conversion). 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT); 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &osmesa->srb->Base); 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this updates the visual's red/green/blue/alphaBits fields */ 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_framebuffer_visual(&osmesa->mesa, osmesa->gl_buffer); 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* update the framebuffer size */ 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height); 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI OSMesaContext GLAPIENTRY 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaGetCurrentContext( void ) 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = _mesa_get_current_context(); 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx) 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (OSMesaContext) ctx; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI void GLAPIENTRY 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaPixelStore( GLint pname, GLint value ) 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OSMesaContext osmesa = OSMesaGetCurrentContext(); 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OSMESA_ROW_LENGTH: 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (value<0) { 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( &osmesa->mesa, GL_INVALID_VALUE, 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "OSMesaPixelStore(value)" ); 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->userRowLength = value; 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OSMESA_Y_UP: 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->yup = value ? GL_TRUE : GL_FALSE; 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( &osmesa->mesa, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" ); 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_row_addresses( osmesa ); 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI void GLAPIENTRY 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaGetIntegerv( GLint pname, GLint *value ) 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OSMesaContext osmesa = OSMesaGetCurrentContext(); 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OSMESA_WIDTH: 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->gl_buffer) 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = osmesa->gl_buffer->Width; 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = 0; 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OSMESA_HEIGHT: 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->gl_buffer) 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = osmesa->gl_buffer->Height; 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = 0; 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OSMESA_FORMAT: 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = osmesa->format; 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OSMESA_TYPE: 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* current color buffer's data type */ 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = osmesa->DataType; 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OSMESA_ROW_LENGTH: 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = osmesa->userRowLength; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OSMESA_Y_UP: 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = osmesa->yup; 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OSMESA_MAX_WIDTH: 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = SWRAST_MAX_WIDTH; 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OSMESA_MAX_HEIGHT: 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *value = SWRAST_MAX_HEIGHT; 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(&osmesa->mesa, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)"); 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the depth buffer associated with an OSMesa context. 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: c - the OSMesa context 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output: width, height - size of buffer in pixels 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * bytesPerValue - bytes per depth value (2 or 4) 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer - pointer to depth buffer values 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: GL_TRUE or GL_FALSE to indicate success or failure. 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI GLboolean GLAPIENTRY 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *bytesPerValue, void **buffer ) 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct swrast_renderbuffer *srb = NULL; 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c->gl_buffer) 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srb = swrast_renderbuffer(c->gl_buffer-> 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Attachment[BUFFER_DEPTH].Renderbuffer); 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!srb || !srb->Buffer) { 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = 0; 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = 0; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bytesPerValue = 0; 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *buffer = 0; 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = srb->Base.Width; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = srb->Base.Height; 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c->gl_visual->depthBits <= 16) 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bytesPerValue = sizeof(GLushort); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *bytesPerValue = sizeof(GLuint); 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *buffer = (void *) srb->Buffer; 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the color buffer associated with an OSMesa context. 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input: c - the OSMesa context 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output: width, height - size of buffer in pixels 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format - the pixel format (OSMESA_FORMAT) 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer - pointer to color buffer values 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return: GL_TRUE or GL_FALSE to indicate success or failure. 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI GLboolean GLAPIENTRY 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaGetColorBuffer( OSMesaContext osmesa, GLint *width, 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *height, GLint *format, void **buffer ) 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (osmesa->srb && osmesa->srb->Buffer) { 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = osmesa->srb->Base.Width; 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = osmesa->srb->Base.Height; 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *format = osmesa->format; 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *buffer = (void *) osmesa->srb->Buffer; 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = 0; 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = 0; 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *format = 0; 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *buffer = 0; 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct name_function 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *Name; 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OSMESAproc Function; 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct name_function functions[] = { 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaCreateContext", (OSMESAproc) OSMesaCreateContext }, 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaCreateContextExt", (OSMESAproc) OSMesaCreateContextExt }, 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext }, 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent }, 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext }, 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaPixelsStore", (OSMESAproc) OSMesaPixelStore }, 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaGetIntegerv", (OSMESAproc) OSMesaGetIntegerv }, 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaGetDepthBuffer", (OSMESAproc) OSMesaGetDepthBuffer }, 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer }, 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaGetProcAddress", (OSMESAproc) OSMesaGetProcAddress }, 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { "OSMesaColorClamp", (OSMESAproc) OSMesaColorClamp }, 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { NULL, NULL } 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI OSMESAproc GLAPIENTRY 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaGetProcAddress( const char *funcName ) 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; functions[i].Name; i++) { 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (strcmp(functions[i].Name, funcName) == 0) 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return functions[i].Function; 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _glapi_get_proc_address(funcName); 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLAPI void GLAPIENTRY 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOSMesaColorClamp(GLboolean enable) 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OSMesaContext osmesa = OSMesaGetCurrentContext(); 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (enable == GL_TRUE) { 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->mesa.Color.ClampFragmentColor = GL_TRUE; 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org osmesa->mesa.Color.ClampFragmentColor = GL_FIXED_ONLY_ARB; 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When GLX_INDIRECT_RENDERING is defined, some symbols are missing in 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * libglapi.a. We need to define them here. 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef GLX_INDIRECT_RENDERING 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GL_GLEXT_PROTOTYPES 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "GL/gl.h" 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glapi/glapi.h" 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glapi/glapitable.h" 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(USE_MGL_NAMESPACE) 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME(func) mgl##func 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME(func) gl##func 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DISPATCH(FUNC, ARGS, MESSAGE) \ 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_DISPATCH()->FUNC ARGS 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) \ 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GET_DISPATCH()->FUNC ARGS 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* skip normal ones */ 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _GLAPI_SKIP_NORMAL_ENTRY_POINTS 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glapi/glapitemp.h" 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* GLX_INDIRECT_RENDERING */ 1159