X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fosmesa%2Fosmesa.c;h=74cbb5a2bd79909730f51d23ee65fe0f36dea13e;hb=bf3389ec49a158e0b66db8e038d801eacabd20f1;hp=37dc35cbedd72676839467bca7a39af1b4bbb768;hpb=cd6a31cd4a9ea6deef4778c2eaef2d47240c3a6e;p=mesa.git diff --git a/src/mesa/drivers/osmesa/osmesa.c b/src/mesa/drivers/osmesa/osmesa.c index 37dc35cbedd..74cbb5a2bd7 100644 --- a/src/mesa/drivers/osmesa/osmesa.c +++ b/src/mesa/drivers/osmesa/osmesa.c @@ -1,6 +1,5 @@ /* * Mesa 3-D graphics library - * Version: 6.5.3 * * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * @@ -17,9 +16,10 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. */ @@ -35,17 +35,23 @@ #include "main/glheader.h" #include "GL/osmesa.h" +#include "main/api_exec.h" #include "main/context.h" #include "main/extensions.h" #include "main/formats.h" #include "main/framebuffer.h" #include "main/imports.h" +#include "main/macros.h" +#include "main/mipmap.h" #include "main/mtypes.h" #include "main/renderbuffer.h" +#include "main/version.h" +#include "main/vtxfmt.h" #include "swrast/swrast.h" #include "swrast_setup/swrast_setup.h" #include "swrast/s_context.h" #include "swrast/s_lines.h" +#include "swrast/s_renderbuffer.h" #include "swrast/s_triangle.h" #include "tnl/tnl.h" #include "tnl/t_context.h" @@ -55,6 +61,8 @@ #include "vbo/vbo.h" +#define OSMESA_RENDERBUFFER_CLASS 0x053 + /** * OSMesa rendering context, derived from core Mesa struct gl_context. @@ -63,18 +71,19 @@ struct osmesa_context { struct gl_context mesa; /*< Base class - this must be first */ struct gl_config *gl_visual; /*< Describes the buffers */ - struct gl_renderbuffer *rb; /*< The user's colorbuffer */ + struct swrast_renderbuffer *srb; /*< The user's colorbuffer */ struct gl_framebuffer *gl_buffer; /*< The framebuffer, containing user's rb */ GLenum format; /*< User-specified context format */ GLint userRowLength; /*< user-specified number of pixels per row */ GLint rInd, gInd, bInd, aInd;/*< index offsets for RGBA formats */ - GLvoid *rowaddr[MAX_HEIGHT]; /*< address of first pixel in each image row */ + GLvoid *rowaddr[SWRAST_MAX_HEIGHT]; /*< address of first pixel in each image row */ GLboolean yup; /*< TRUE -> Y increases upward */ /*< FALSE -> Y increases downward */ + GLenum DataType; }; -static INLINE OSMesaContext +static inline OSMesaContext OSMESA_CONTEXT(struct gl_context *ctx) { /* Just cast, since we're using structure containment */ @@ -118,372 +127,6 @@ osmesa_update_state( struct gl_context *ctx, GLuint new_state ) -/**********************************************************************/ -/***** Read/write spans/arrays of pixels *****/ -/**********************************************************************/ - -/* 8-bit RGBA */ -#define NAME(PREFIX) PREFIX##_RGBA8 -#define RB_TYPE GLubyte -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X) -#define INC_PIXEL_PTR(P) P += 4 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[0] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[2] = VALUE[BCOMP]; \ - DST[3] = VALUE[ACOMP] -#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ - DST[0] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[2] = VALUE[BCOMP]; \ - DST[3] = 255 -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[0]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[2]; \ - DST[ACOMP] = SRC[3] -#include "swrast/s_spantemp.h" - -/* 16-bit RGBA */ -#define NAME(PREFIX) PREFIX##_RGBA16 -#define RB_TYPE GLushort -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X) -#define INC_PIXEL_PTR(P) P += 4 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[0] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[2] = VALUE[BCOMP]; \ - DST[3] = VALUE[ACOMP] -#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ - DST[0] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[2] = VALUE[BCOMP]; \ - DST[3] = 65535 -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[0]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[2]; \ - DST[ACOMP] = SRC[3] -#include "swrast/s_spantemp.h" - -/* 32-bit RGBA */ -#define NAME(PREFIX) PREFIX##_RGBA32 -#define RB_TYPE GLfloat -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X) -#define INC_PIXEL_PTR(P) P += 4 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \ - DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \ - DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \ - DST[3] = CLAMP((VALUE[ACOMP]), 0.0F, 1.0F) -#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ - DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \ - DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \ - DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \ - DST[3] = 1.0F -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[0]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[2]; \ - DST[ACOMP] = SRC[3] -#include "swrast/s_spantemp.h" - - -/* 8-bit BGRA */ -#define NAME(PREFIX) PREFIX##_BGRA8 -#define RB_TYPE GLubyte -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X) -#define INC_PIXEL_PTR(P) P += 4 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[2] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[0] = VALUE[BCOMP]; \ - DST[3] = VALUE[ACOMP] -#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ - DST[2] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[0] = VALUE[BCOMP]; \ - DST[3] = 255 -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[2]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[0]; \ - DST[ACOMP] = SRC[3] -#include "swrast/s_spantemp.h" - -/* 16-bit BGRA */ -#define NAME(PREFIX) PREFIX##_BGRA16 -#define RB_TYPE GLushort -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X) -#define INC_PIXEL_PTR(P) P += 4 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[2] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[0] = VALUE[BCOMP]; \ - DST[3] = VALUE[ACOMP] -#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ - DST[2] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[0] = VALUE[BCOMP]; \ - DST[3] = 65535 -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[2]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[0]; \ - DST[ACOMP] = SRC[3] -#include "swrast/s_spantemp.h" - -/* 32-bit BGRA */ -#define NAME(PREFIX) PREFIX##_BGRA32 -#define RB_TYPE GLfloat -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X) -#define INC_PIXEL_PTR(P) P += 4 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[2] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[0] = VALUE[BCOMP]; \ - DST[3] = VALUE[ACOMP] -#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ - DST[2] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[0] = VALUE[BCOMP]; \ - DST[3] = 1.0F -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[2]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[0]; \ - DST[ACOMP] = SRC[3] -#include "swrast/s_spantemp.h" - - -/* 8-bit ARGB */ -#define NAME(PREFIX) PREFIX##_ARGB8 -#define RB_TYPE GLubyte -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X) -#define INC_PIXEL_PTR(P) P += 4 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[1] = VALUE[RCOMP]; \ - DST[2] = VALUE[GCOMP]; \ - DST[3] = VALUE[BCOMP]; \ - DST[0] = VALUE[ACOMP] -#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ - DST[1] = VALUE[RCOMP]; \ - DST[2] = VALUE[GCOMP]; \ - DST[3] = VALUE[BCOMP]; \ - DST[0] = 255 -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[1]; \ - DST[GCOMP] = SRC[2]; \ - DST[BCOMP] = SRC[3]; \ - DST[ACOMP] = SRC[0] -#include "swrast/s_spantemp.h" - -/* 16-bit ARGB */ -#define NAME(PREFIX) PREFIX##_ARGB16 -#define RB_TYPE GLushort -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X) -#define INC_PIXEL_PTR(P) P += 4 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[1] = VALUE[RCOMP]; \ - DST[2] = VALUE[GCOMP]; \ - DST[3] = VALUE[BCOMP]; \ - DST[0] = VALUE[ACOMP] -#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ - DST[1] = VALUE[RCOMP]; \ - DST[2] = VALUE[GCOMP]; \ - DST[3] = VALUE[BCOMP]; \ - DST[0] = 65535 -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[1]; \ - DST[GCOMP] = SRC[2]; \ - DST[BCOMP] = SRC[3]; \ - DST[ACOMP] = SRC[0] -#include "swrast/s_spantemp.h" - -/* 32-bit ARGB */ -#define NAME(PREFIX) PREFIX##_ARGB32 -#define RB_TYPE GLfloat -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X) -#define INC_PIXEL_PTR(P) P += 4 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[1] = VALUE[RCOMP]; \ - DST[2] = VALUE[GCOMP]; \ - DST[3] = VALUE[BCOMP]; \ - DST[0] = VALUE[ACOMP] -#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ - DST[1] = VALUE[RCOMP]; \ - DST[2] = VALUE[GCOMP]; \ - DST[3] = VALUE[BCOMP]; \ - DST[0] = 1.0F -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[1]; \ - DST[GCOMP] = SRC[2]; \ - DST[BCOMP] = SRC[3]; \ - DST[ACOMP] = SRC[0] -#include "swrast/s_spantemp.h" - - -/* 8-bit RGB */ -#define NAME(PREFIX) PREFIX##_RGB8 -#define RB_TYPE GLubyte -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 3 * (X) -#define INC_PIXEL_PTR(P) P += 3 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[0] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[2] = VALUE[BCOMP] -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[0]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[2]; \ - DST[ACOMP] = 255 -#include "swrast/s_spantemp.h" - -/* 16-bit RGB */ -#define NAME(PREFIX) PREFIX##_RGB16 -#define RB_TYPE GLushort -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 3 * (X) -#define INC_PIXEL_PTR(P) P += 3 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[0] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[2] = VALUE[BCOMP] -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[0]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[2]; \ - DST[ACOMP] = 65535U -#include "swrast/s_spantemp.h" - -/* 32-bit RGB */ -#define NAME(PREFIX) PREFIX##_RGB32 -#define RB_TYPE GLfloat -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 3 * (X) -#define INC_PIXEL_PTR(P) P += 3 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[0] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[2] = VALUE[BCOMP] -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[0]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[2]; \ - DST[ACOMP] = 1.0F -#include "swrast/s_spantemp.h" - - -/* 8-bit BGR */ -#define NAME(PREFIX) PREFIX##_BGR8 -#define RB_TYPE GLubyte -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 3 * (X) -#define INC_PIXEL_PTR(P) P += 3 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[2] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[0] = VALUE[BCOMP] -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[2]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[0]; \ - DST[ACOMP] = 255 -#include "swrast/s_spantemp.h" - -/* 16-bit BGR */ -#define NAME(PREFIX) PREFIX##_BGR16 -#define RB_TYPE GLushort -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 3 * (X) -#define INC_PIXEL_PTR(P) P += 3 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[2] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[0] = VALUE[BCOMP] -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[2]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[0]; \ - DST[ACOMP] = 65535 -#include "swrast/s_spantemp.h" - -/* 32-bit BGR */ -#define NAME(PREFIX) PREFIX##_BGR32 -#define RB_TYPE GLfloat -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 3 * (X) -#define INC_PIXEL_PTR(P) P += 3 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - DST[2] = VALUE[RCOMP]; \ - DST[1] = VALUE[GCOMP]; \ - DST[0] = VALUE[BCOMP] -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = SRC[2]; \ - DST[GCOMP] = SRC[1]; \ - DST[BCOMP] = SRC[0]; \ - DST[ACOMP] = 1.0F -#include "swrast/s_spantemp.h" - - -/* 16-bit 5/6/5 RGB */ -#define NAME(PREFIX) PREFIX##_RGB_565 -#define RB_TYPE GLubyte -#define SPAN_VARS \ - const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); -#define INIT_PIXEL_PTR(P, X, Y) \ - GLushort *P = (GLushort *) osmesa->rowaddr[Y] + (X) -#define INC_PIXEL_PTR(P) P += 1 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - *DST = ( (((VALUE[RCOMP]) & 0xf8) << 8) | (((VALUE[GCOMP]) & 0xfc) << 3) | ((VALUE[BCOMP]) >> 3) ) -#define FETCH_PIXEL(DST, SRC) \ - DST[RCOMP] = ( (((*SRC) >> 8) & 0xf8) | (((*SRC) >> 11) & 0x7) ); \ - DST[GCOMP] = ( (((*SRC) >> 3) & 0xfc) | (((*SRC) >> 5) & 0x3) ); \ - DST[BCOMP] = ( (((*SRC) << 3) & 0xf8) | (((*SRC) ) & 0x7) ); \ - DST[ACOMP] = CHAN_MAX -#include "swrast/s_spantemp.h" - - /** * Macros for optimized line/triangle rendering. * Only for 8-bit channel, RGBA, BGRA, ARGB formats. @@ -515,11 +158,7 @@ do { \ PACK_RGBA(p, color[0], color[1], color[2], color[3]); \ } while (0) -#ifdef WIN32 -#include "..\swrast\s_linetemp.h" -#else #include "swrast/s_linetemp.h" -#endif @@ -544,11 +183,7 @@ do { \ } \ } while (0) -#ifdef WIN32 -#include "..\swrast\s_linetemp.h" -#else #include "swrast/s_linetemp.h" -#endif @@ -562,29 +197,39 @@ osmesa_choose_line_function( struct gl_context *ctx ) const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); const SWcontext *swrast = SWRAST_CONTEXT(ctx); - if (osmesa->rb->DataType != GL_UNSIGNED_BYTE) + if (ctx->DrawBuffer && + ctx->DrawBuffer->Visual.redBits == 32) { + /* the special-case line functions in this file don't work + * for float color channels. + */ + return NULL; + } + + if (ctx->RenderMode != GL_RENDER || + ctx->Line.SmoothFlag || + ctx->Texture._MaxEnabledTexImageUnit == -1 || + ctx->Light.ShadeModel != GL_FLAT || + ctx->Line.Width != 1.0F || + ctx->Line.StippleFlag || + ctx->Line.SmoothFlag) { return NULL; + } - if (ctx->RenderMode != GL_RENDER) return NULL; - if (ctx->Line.SmoothFlag) return NULL; - if (ctx->Texture._EnabledUnits) return NULL; - if (ctx->Light.ShadeModel != GL_FLAT) return NULL; - if (ctx->Line.Width != 1.0F) return NULL; - if (ctx->Line.StippleFlag) return NULL; - if (ctx->Line.SmoothFlag) return NULL; if (osmesa->format != OSMESA_RGBA && osmesa->format != OSMESA_BGRA && - osmesa->format != OSMESA_ARGB) return NULL; + osmesa->format != OSMESA_ARGB) { + return NULL; + } - if (swrast->_RasterMask==DEPTH_BIT - && ctx->Depth.Func==GL_LESS - && ctx->Depth.Mask==GL_TRUE + if (swrast->_RasterMask == DEPTH_BIT + && ctx->Depth.Func == GL_LESS + && ctx->Depth.Mask == GL_TRUE && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { - return (swrast_line_func) flat_rgba_z_line; + return flat_rgba_z_line; } if (swrast->_RasterMask == 0) { - return (swrast_line_func) flat_rgba_line; + return flat_rgba_line; } return (swrast_line_func) NULL; @@ -624,11 +269,7 @@ osmesa_choose_line_function( struct gl_context *ctx ) span.z += span.zStep; \ } \ } -#ifdef WIN32 -#include "..\swrast\s_tritemp.h" -#else #include "swrast/s_tritemp.h" -#endif @@ -656,11 +297,8 @@ osmesa_choose_line_function( struct gl_context *ctx ) span.z += span.zStep; \ } \ } -#ifdef WIN32 -#include "..\swrast\s_tritemp.h" -#else + #include "swrast/s_tritemp.h" -#endif @@ -673,32 +311,45 @@ osmesa_choose_triangle_function( struct gl_context *ctx ) const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); const SWcontext *swrast = SWRAST_CONTEXT(ctx); - if (osmesa->rb->DataType != GL_UNSIGNED_BYTE) - return (swrast_tri_func) NULL; + if (ctx->DrawBuffer && + ctx->DrawBuffer->Visual.redBits == 32) { + /* the special-case triangle functions in this file don't work + * for float color channels. + */ + return NULL; + } + + if (ctx->RenderMode != GL_RENDER || + ctx->Polygon.SmoothFlag || + ctx->Polygon.StippleFlag || + ctx->Texture._MaxEnabledTexImageUnit != -1) { + return NULL; + } - if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL; - if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL; - if (ctx->Polygon.StippleFlag) return (swrast_tri_func) NULL; - if (ctx->Texture._EnabledUnits) return (swrast_tri_func) NULL; if (osmesa->format != OSMESA_RGBA && osmesa->format != OSMESA_BGRA && - osmesa->format != OSMESA_ARGB) return (swrast_tri_func) NULL; - if (ctx->Polygon.CullFlag && - ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) - return (swrast_tri_func) NULL; + osmesa->format != OSMESA_ARGB) { + return NULL; + } + + if (ctx->Polygon.CullFlag && + ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) { + return NULL; + } if (swrast->_RasterMask == DEPTH_BIT && ctx->Depth.Func == GL_LESS && ctx->Depth.Mask == GL_TRUE && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { if (ctx->Light.ShadeModel == GL_SMOOTH) { - return (swrast_tri_func) smooth_rgba_z_triangle; + return smooth_rgba_z_triangle; } else { - return (swrast_tri_func) flat_rgba_z_triangle; + return flat_rgba_z_triangle; } } - return (swrast_tri_func) NULL; + + return NULL; } @@ -735,43 +386,17 @@ osmesa_choose_line( struct gl_context *ctx ) static void compute_row_addresses( OSMesaContext osmesa ) { - GLint bytesPerPixel, bytesPerRow, i; - GLubyte *origin = (GLubyte *) osmesa->rb->Data; - GLint bpc; /* bytes per channel */ + GLint bytesPerRow, i; + GLubyte *origin = (GLubyte *) osmesa->srb->Buffer; GLint rowlength; /* in pixels */ - GLint height = osmesa->rb->Height; + GLint height = osmesa->srb->Base.Height; if (osmesa->userRowLength) rowlength = osmesa->userRowLength; else - rowlength = osmesa->rb->Width; - - if (osmesa->rb->DataType == GL_UNSIGNED_BYTE) - bpc = 1; - else if (osmesa->rb->DataType == GL_UNSIGNED_SHORT) - bpc = 2; - else if (osmesa->rb->DataType == GL_FLOAT) - bpc = 4; - else { - _mesa_problem(&osmesa->mesa, - "Unexpected datatype in osmesa::compute_row_addresses"); - return; - } + rowlength = osmesa->srb->Base.Width; - if ((osmesa->format == OSMESA_RGB) || (osmesa->format == OSMESA_BGR)) { - /* RGB mode */ - bytesPerPixel = 3 * bpc; - } - else if (osmesa->format == OSMESA_RGB_565) { - /* 5/6/5 RGB pixel in 16 bits */ - bytesPerPixel = 2; - } - else { - /* RGBA mode */ - bytesPerPixel = 4 * bpc; - } - - bytesPerRow = rowlength * bytesPerPixel; + bytesPerRow = rowlength * _mesa_get_format_bytes(osmesa->srb->Base.Format); if (osmesa->yup) { /* Y=0 is bottom line of window */ @@ -791,12 +416,12 @@ compute_row_addresses( OSMesaContext osmesa ) /** - * Don't use _mesa_delete_renderbuffer since we can't free rb->Data. + * Don't use _mesa_delete_renderbuffer since we can't free rb->Buffer. */ static void -osmesa_delete_renderbuffer(struct gl_renderbuffer *rb) +osmesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) { - free(rb); + _mesa_delete_renderbuffer(ctx, rb); } @@ -810,172 +435,92 @@ osmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb, GLenum internalFormat, GLuint width, GLuint height) { const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); - GLint bpc; /* bits per channel */ - - if (rb->DataType == GL_UNSIGNED_BYTE) - bpc = 8; - else if (rb->DataType == GL_UNSIGNED_SHORT) - bpc = 16; - else - bpc = 32; /* Note: we can ignoring internalFormat for "window-system" renderbuffers */ (void) internalFormat; + /* Given the user-provided format and type, figure out which MESA_FORMAT_x + * to use. + * XXX There aren't Mesa formats for all the possible combinations here! + * XXX Specifically, there's only RGBA-order 16-bit/channel and float + * XXX formats. + * XXX The 8-bit/channel formats should all be OK. + */ if (osmesa->format == OSMESA_RGBA) { - if (rb->DataType == GL_UNSIGNED_BYTE) { - rb->GetRow = get_row_RGBA8; - rb->GetValues = get_values_RGBA8; - rb->PutRow = put_row_RGBA8; - rb->PutRowRGB = put_row_rgb_RGBA8; - rb->PutMonoRow = put_mono_row_RGBA8; - rb->PutValues = put_values_RGBA8; - rb->PutMonoValues = put_mono_values_RGBA8; + if (osmesa->DataType == GL_UNSIGNED_BYTE) { + if (_mesa_little_endian()) + rb->Format = MESA_FORMAT_R8G8B8A8_UNORM; + else + rb->Format = MESA_FORMAT_A8B8G8R8_UNORM; } - else if (rb->DataType == GL_UNSIGNED_SHORT) { - rb->GetRow = get_row_RGBA16; - rb->GetValues = get_values_RGBA16; - rb->PutRow = put_row_RGBA16; - rb->PutRowRGB = put_row_rgb_RGBA16; - rb->PutMonoRow = put_mono_row_RGBA16; - rb->PutValues = put_values_RGBA16; - rb->PutMonoValues = put_mono_values_RGBA16; + else if (osmesa->DataType == GL_UNSIGNED_SHORT) { + rb->Format = MESA_FORMAT_RGBA_UNORM16; } else { - rb->GetRow = get_row_RGBA32; - rb->GetValues = get_values_RGBA32; - rb->PutRow = put_row_RGBA32; - rb->PutRowRGB = put_row_rgb_RGBA32; - rb->PutMonoRow = put_mono_row_RGBA32; - rb->PutValues = put_values_RGBA32; - rb->PutMonoValues = put_mono_values_RGBA32; + rb->Format = MESA_FORMAT_RGBA_FLOAT32; } } else if (osmesa->format == OSMESA_BGRA) { - if (rb->DataType == GL_UNSIGNED_BYTE) { - rb->GetRow = get_row_BGRA8; - rb->GetValues = get_values_BGRA8; - rb->PutRow = put_row_BGRA8; - rb->PutRowRGB = put_row_rgb_BGRA8; - rb->PutMonoRow = put_mono_row_BGRA8; - rb->PutValues = put_values_BGRA8; - rb->PutMonoValues = put_mono_values_BGRA8; + if (osmesa->DataType == GL_UNSIGNED_BYTE) { + if (_mesa_little_endian()) + rb->Format = MESA_FORMAT_B8G8R8A8_UNORM; + else + rb->Format = MESA_FORMAT_A8R8G8B8_UNORM; } - else if (rb->DataType == GL_UNSIGNED_SHORT) { - rb->GetRow = get_row_BGRA16; - rb->GetValues = get_values_BGRA16; - rb->PutRow = put_row_BGRA16; - rb->PutRowRGB = put_row_rgb_BGRA16; - rb->PutMonoRow = put_mono_row_BGRA16; - rb->PutValues = put_values_BGRA16; - rb->PutMonoValues = put_mono_values_BGRA16; + else if (osmesa->DataType == GL_UNSIGNED_SHORT) { + _mesa_warning(ctx, "Unsupported OSMesa format BGRA/GLushort"); + rb->Format = MESA_FORMAT_RGBA_UNORM16; /* not exactly right */ } else { - rb->GetRow = get_row_BGRA32; - rb->GetValues = get_values_BGRA32; - rb->PutRow = put_row_BGRA32; - rb->PutRowRGB = put_row_rgb_BGRA32; - rb->PutMonoRow = put_mono_row_BGRA32; - rb->PutValues = put_values_BGRA32; - rb->PutMonoValues = put_mono_values_BGRA32; + _mesa_warning(ctx, "Unsupported OSMesa format BGRA/GLfloat"); + rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */ } } else if (osmesa->format == OSMESA_ARGB) { - if (rb->DataType == GL_UNSIGNED_BYTE) { - rb->GetRow = get_row_ARGB8; - rb->GetValues = get_values_ARGB8; - rb->PutRow = put_row_ARGB8; - rb->PutRowRGB = put_row_rgb_ARGB8; - rb->PutMonoRow = put_mono_row_ARGB8; - rb->PutValues = put_values_ARGB8; - rb->PutMonoValues = put_mono_values_ARGB8; + if (osmesa->DataType == GL_UNSIGNED_BYTE) { + if (_mesa_little_endian()) + rb->Format = MESA_FORMAT_A8R8G8B8_UNORM; + else + rb->Format = MESA_FORMAT_B8G8R8A8_UNORM; } - else if (rb->DataType == GL_UNSIGNED_SHORT) { - rb->GetRow = get_row_ARGB16; - rb->GetValues = get_values_ARGB16; - rb->PutRow = put_row_ARGB16; - rb->PutRowRGB = put_row_rgb_ARGB16; - rb->PutMonoRow = put_mono_row_ARGB16; - rb->PutValues = put_values_ARGB16; - rb->PutMonoValues = put_mono_values_ARGB16; + else if (osmesa->DataType == GL_UNSIGNED_SHORT) { + _mesa_warning(ctx, "Unsupported OSMesa format ARGB/GLushort"); + rb->Format = MESA_FORMAT_RGBA_UNORM16; /* not exactly right */ } else { - rb->GetRow = get_row_ARGB32; - rb->GetValues = get_values_ARGB32; - rb->PutRow = put_row_ARGB32; - rb->PutRowRGB = put_row_rgb_ARGB32; - rb->PutMonoRow = put_mono_row_ARGB32; - rb->PutValues = put_values_ARGB32; - rb->PutMonoValues = put_mono_values_ARGB32; + _mesa_warning(ctx, "Unsupported OSMesa format ARGB/GLfloat"); + rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */ } } else if (osmesa->format == OSMESA_RGB) { - if (rb->DataType == GL_UNSIGNED_BYTE) { - rb->GetRow = get_row_RGB8; - rb->GetValues = get_values_RGB8; - rb->PutRow = put_row_RGB8; - rb->PutRowRGB = put_row_rgb_RGB8; - rb->PutMonoRow = put_mono_row_RGB8; - rb->PutValues = put_values_RGB8; - rb->PutMonoValues = put_mono_values_RGB8; + if (osmesa->DataType == GL_UNSIGNED_BYTE) { + rb->Format = MESA_FORMAT_BGR_UNORM8; } - else if (rb->DataType == GL_UNSIGNED_SHORT) { - rb->GetRow = get_row_RGB16; - rb->GetValues = get_values_RGB16; - rb->PutRow = put_row_RGB16; - rb->PutRowRGB = put_row_rgb_RGB16; - rb->PutMonoRow = put_mono_row_RGB16; - rb->PutValues = put_values_RGB16; - rb->PutMonoValues = put_mono_values_RGB16; + else if (osmesa->DataType == GL_UNSIGNED_SHORT) { + _mesa_warning(ctx, "Unsupported OSMesa format RGB/GLushort"); + rb->Format = MESA_FORMAT_RGBA_UNORM16; /* not exactly right */ } else { - rb->GetRow = get_row_RGB32; - rb->GetValues = get_values_RGB32; - rb->PutRow = put_row_RGB32; - rb->PutRowRGB = put_row_rgb_RGB32; - rb->PutMonoRow = put_mono_row_RGB32; - rb->PutValues = put_values_RGB32; - rb->PutMonoValues = put_mono_values_RGB32; + _mesa_warning(ctx, "Unsupported OSMesa format RGB/GLfloat"); + rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */ } } else if (osmesa->format == OSMESA_BGR) { - if (rb->DataType == GL_UNSIGNED_BYTE) { - rb->GetRow = get_row_BGR8; - rb->GetValues = get_values_BGR8; - rb->PutRow = put_row_BGR8; - rb->PutRowRGB = put_row_rgb_BGR8; - rb->PutMonoRow = put_mono_row_BGR8; - rb->PutValues = put_values_BGR8; - rb->PutMonoValues = put_mono_values_BGR8; + if (osmesa->DataType == GL_UNSIGNED_BYTE) { + rb->Format = MESA_FORMAT_RGB_UNORM8; } - else if (rb->DataType == GL_UNSIGNED_SHORT) { - rb->GetRow = get_row_BGR16; - rb->GetValues = get_values_BGR16; - rb->PutRow = put_row_BGR16; - rb->PutRowRGB = put_row_rgb_BGR16; - rb->PutMonoRow = put_mono_row_BGR16; - rb->PutValues = put_values_BGR16; - rb->PutMonoValues = put_mono_values_BGR16; + else if (osmesa->DataType == GL_UNSIGNED_SHORT) { + _mesa_warning(ctx, "Unsupported OSMesa format BGR/GLushort"); + rb->Format = MESA_FORMAT_RGBA_UNORM16; /* not exactly right */ } else { - rb->GetRow = get_row_BGR32; - rb->GetValues = get_values_BGR32; - rb->PutRow = put_row_BGR32; - rb->PutRowRGB = put_row_rgb_BGR32; - rb->PutMonoRow = put_mono_row_BGR32; - rb->PutValues = put_values_BGR32; - rb->PutMonoValues = put_mono_values_BGR32; + _mesa_warning(ctx, "Unsupported OSMesa format BGR/GLfloat"); + rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */ } } else if (osmesa->format == OSMESA_RGB_565) { - ASSERT(rb->DataType == GL_UNSIGNED_BYTE); - rb->GetRow = get_row_RGB_565; - rb->GetValues = get_values_RGB_565; - rb->PutRow = put_row_RGB_565; - rb->PutRowRGB = put_row_rgb_RGB_565; - rb->PutMonoRow = put_mono_row_RGB_565; - rb->PutValues = put_values_RGB_565; - rb->PutMonoValues = put_mono_values_RGB_565; + ASSERT(osmesa->DataType == GL_UNSIGNED_BYTE); + rb->Format = MESA_FORMAT_B5G6R5_UNORM; } else { _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage"); @@ -993,35 +538,77 @@ osmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb, /** * Allocate a new renderbuffer to describe the user-provided color buffer. */ -static struct gl_renderbuffer * +static struct swrast_renderbuffer * new_osmesa_renderbuffer(struct gl_context *ctx, GLenum format, GLenum type) { const GLuint name = 0; - struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, name); - if (rb) { - rb->RefCount = 1; - rb->Delete = osmesa_delete_renderbuffer; - rb->AllocStorage = osmesa_renderbuffer_storage; - - rb->InternalFormat = GL_RGBA; - switch (type) { - case GL_UNSIGNED_BYTE: - rb->Format = MESA_FORMAT_RGBA8888; - break; - case GL_UNSIGNED_SHORT: - rb->Format = MESA_FORMAT_RGBA_16; - break; - case GL_FLOAT: - rb->Format = MESA_FORMAT_RGBA_FLOAT32; - break; - default: - assert(0 && "Unexpected type in new_osmesa_renderbuffer()"); - rb->Format = MESA_FORMAT_RGBA8888; + struct swrast_renderbuffer *srb = CALLOC_STRUCT(swrast_renderbuffer); + + if (srb) { + _mesa_init_renderbuffer(&srb->Base, name); + + srb->Base.ClassID = OSMESA_RENDERBUFFER_CLASS; + srb->Base.RefCount = 1; + srb->Base.Delete = osmesa_delete_renderbuffer; + srb->Base.AllocStorage = osmesa_renderbuffer_storage; + + srb->Base.InternalFormat = GL_RGBA; + srb->Base._BaseFormat = GL_RGBA; + + return srb; + } + return NULL; +} + + + +static void +osmesa_MapRenderbuffer(struct gl_context *ctx, + struct gl_renderbuffer *rb, + GLuint x, GLuint y, GLuint w, GLuint h, + GLbitfield mode, + GLubyte **mapOut, GLint *rowStrideOut) +{ + const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); + + if (rb->ClassID == OSMESA_RENDERBUFFER_CLASS) { + /* this is an OSMesa renderbuffer which wraps user memory */ + struct swrast_renderbuffer *srb = swrast_renderbuffer(rb); + const GLuint bpp = _mesa_get_format_bytes(rb->Format); + GLint rowStride; /* in bytes */ + + if (osmesa->userRowLength) + rowStride = osmesa->userRowLength * bpp; + else + rowStride = rb->Width * bpp; + + if (!osmesa->yup) { + /* Y=0 is top line of window */ + y = rb->Height - y - 1; + *rowStrideOut = -rowStride; } - rb->_BaseFormat = GL_RGBA; - rb->DataType = type; + else { + *rowStrideOut = rowStride; + } + + *mapOut = (GLubyte *) srb->Buffer + y * rowStride + x * bpp; + } + else { + _swrast_map_soft_renderbuffer(ctx, rb, x, y, w, h, mode, + mapOut, rowStrideOut); + } +} + + +static void +osmesa_UnmapRenderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) +{ + if (rb->ClassID == OSMESA_RENDERBUFFER_CLASS) { + /* no-op */ + } + else { + _swrast_unmap_soft_renderbuffer(ctx, rb); } - return rb; } @@ -1152,24 +739,19 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, /* override with our functions */ functions.GetString = get_string; functions.UpdateState = osmesa_update_state; - functions.GetBufferSize = NULL; if (!_mesa_initialize_context(&osmesa->mesa, + API_OPENGL_COMPAT, osmesa->gl_visual, sharelist ? &sharelist->mesa : (struct gl_context *) NULL, - &functions, (void *) osmesa)) { + &functions)) { _mesa_destroy_visual( osmesa->gl_visual ); free(osmesa); return NULL; } _mesa_enable_sw_extensions(&(osmesa->mesa)); - _mesa_enable_1_3_extensions(&(osmesa->mesa)); - _mesa_enable_1_4_extensions(&(osmesa->mesa)); - _mesa_enable_1_5_extensions(&(osmesa->mesa)); - _mesa_enable_2_0_extensions(&(osmesa->mesa)); - _mesa_enable_2_1_extensions(&(osmesa->mesa)); osmesa->gl_buffer = _mesa_create_framebuffer(osmesa->gl_visual); if (!osmesa->gl_buffer) { @@ -1182,13 +764,13 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, /* Create depth/stencil/accum buffers. We'll create the color * buffer later in OSMesaMakeCurrent(). */ - _mesa_add_soft_renderbuffers(osmesa->gl_buffer, - GL_FALSE, /* color */ - osmesa->gl_visual->haveDepthBuffer, - osmesa->gl_visual->haveStencilBuffer, - osmesa->gl_visual->haveAccumBuffer, - GL_FALSE, /* alpha */ - GL_FALSE /* aux */ ); + _swrast_add_soft_renderbuffers(osmesa->gl_buffer, + GL_FALSE, /* color */ + osmesa->gl_visual->haveDepthBuffer, + osmesa->gl_visual->haveStencilBuffer, + osmesa->gl_visual->haveAccumBuffer, + GL_FALSE, /* alpha */ + GL_FALSE /* aux */ ); osmesa->format = format; osmesa->userRowLength = 0; @@ -1222,12 +804,23 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, tnl = TNL_CONTEXT(ctx); tnl->Driver.RunPipeline = _tnl_run_pipeline; + ctx->Driver.MapRenderbuffer = osmesa_MapRenderbuffer; + ctx->Driver.UnmapRenderbuffer = osmesa_UnmapRenderbuffer; + + ctx->Driver.GenerateMipmap = _mesa_generate_mipmap; + /* Extend the software rasterizer with our optimized line and triangle * drawing functions. */ swrast = SWRAST_CONTEXT( ctx ); swrast->choose_line = osmesa_choose_line; swrast->choose_triangle = osmesa_choose_triangle; + + _mesa_compute_version(ctx); + + /* Exec table initialization requires the version to be computed */ + _mesa_initialize_dispatch_tables(ctx); + _mesa_initialize_vbo_vtxfmt(ctx); } } return osmesa; @@ -1243,8 +836,8 @@ GLAPI void GLAPIENTRY OSMesaDestroyContext( OSMesaContext osmesa ) { if (osmesa) { - if (osmesa->rb) - _mesa_reference_renderbuffer(&osmesa->rb, NULL); + if (osmesa->srb) + _mesa_reference_renderbuffer((struct gl_renderbuffer **) &osmesa->srb, NULL); _mesa_meta_free( &osmesa->mesa ); @@ -1294,7 +887,7 @@ OSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type, { if (!osmesa || !buffer || width < 1 || height < 1 || - width > MAX_WIDTH || height > MAX_HEIGHT) { + width > SWRAST_MAX_WIDTH || height > SWRAST_MAX_HEIGHT) { return GL_FALSE; } @@ -1327,22 +920,26 @@ OSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type, * that converts rendering from CHAN_BITS to the user-requested channel * size. */ - osmesa->rb = new_osmesa_renderbuffer(&osmesa->mesa, osmesa->format, type); - _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT); - _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb); - assert(osmesa->rb->RefCount == 2); + if (!osmesa->srb) { + osmesa->srb = new_osmesa_renderbuffer(&osmesa->mesa, osmesa->format, type); + _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT); + _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, + &osmesa->srb->Base); + assert(osmesa->srb->Base.RefCount == 2); + } + + osmesa->DataType = type; /* Set renderbuffer fields. Set width/height = 0 to force * osmesa_renderbuffer_storage() being called by _mesa_resize_framebuffer() */ - osmesa->rb->Data = buffer; - osmesa->rb->Width = osmesa->rb->Height = 0; + osmesa->srb->Buffer = buffer; + osmesa->srb->Base.Width = osmesa->srb->Base.Height = 0; /* Set the framebuffer's size. This causes the * osmesa_renderbuffer_storage() function to get called. */ _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height); - osmesa->gl_buffer->Initialized = GL_TRUE; /* XXX TEMPORARY? */ _mesa_make_current( &osmesa->mesa, osmesa->gl_buffer, osmesa->gl_buffer ); @@ -1350,11 +947,12 @@ OSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type, * renderbuffer adaptor/wrapper if needed (for bpp conversion). */ _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT); - _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb); + _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, + &osmesa->srb->Base); /* this updates the visual's red/green/blue/alphaBits fields */ - _mesa_update_framebuffer_visual(osmesa->gl_buffer); + _mesa_update_framebuffer_visual(&osmesa->mesa, osmesa->gl_buffer); /* update the framebuffer size */ _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height); @@ -1425,12 +1023,7 @@ OSMesaGetIntegerv( GLint pname, GLint *value ) return; case OSMESA_TYPE: /* current color buffer's data type */ - if (osmesa->rb) { - *value = osmesa->rb->DataType; - } - else { - *value = 0; - } + *value = osmesa->DataType; return; case OSMESA_ROW_LENGTH: *value = osmesa->userRowLength; @@ -1439,10 +1032,10 @@ OSMesaGetIntegerv( GLint pname, GLint *value ) *value = osmesa->yup; return; case OSMESA_MAX_WIDTH: - *value = MAX_WIDTH; + *value = SWRAST_MAX_WIDTH; return; case OSMESA_MAX_HEIGHT: - *value = MAX_HEIGHT; + *value = SWRAST_MAX_HEIGHT; return; default: _mesa_error(&osmesa->mesa, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)"); @@ -1463,12 +1056,13 @@ GLAPI GLboolean GLAPIENTRY OSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, GLint *bytesPerValue, void **buffer ) { - struct gl_renderbuffer *rb = NULL; + struct swrast_renderbuffer *srb = NULL; if (c->gl_buffer) - rb = c->gl_buffer->Attachment[BUFFER_DEPTH].Renderbuffer; + srb = swrast_renderbuffer(c->gl_buffer-> + Attachment[BUFFER_DEPTH].Renderbuffer); - if (!rb || !rb->Data) { + if (!srb || !srb->Buffer) { *width = 0; *height = 0; *bytesPerValue = 0; @@ -1476,13 +1070,13 @@ OSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, return GL_FALSE; } else { - *width = rb->Width; - *height = rb->Height; + *width = srb->Base.Width; + *height = srb->Base.Height; if (c->gl_visual->depthBits <= 16) *bytesPerValue = sizeof(GLushort); else *bytesPerValue = sizeof(GLuint); - *buffer = rb->Data; + *buffer = (void *) srb->Buffer; return GL_TRUE; } } @@ -1500,11 +1094,11 @@ GLAPI GLboolean GLAPIENTRY OSMesaGetColorBuffer( OSMesaContext osmesa, GLint *width, GLint *height, GLint *format, void **buffer ) { - if (osmesa->rb && osmesa->rb->Data) { - *width = osmesa->rb->Width; - *height = osmesa->rb->Height; + if (osmesa->srb && osmesa->srb->Buffer) { + *width = osmesa->srb->Base.Width; + *height = osmesa->srb->Base.Height; *format = osmesa->format; - *buffer = osmesa->rb->Data; + *buffer = (void *) osmesa->srb->Buffer; return GL_TRUE; } else { @@ -1535,6 +1129,7 @@ static struct name_function functions[] = { { "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer }, { "OSMesaGetProcAddress", (OSMESAproc) OSMesaGetProcAddress }, { "OSMesaColorClamp", (OSMESAproc) OSMesaColorClamp }, + { "OSMesaPostprocess", (OSMESAproc) OSMesaPostprocess }, { NULL, NULL } }; @@ -1565,3 +1160,41 @@ OSMesaColorClamp(GLboolean enable) } +GLAPI void GLAPIENTRY +OSMesaPostprocess(OSMesaContext osmesa, const char *filter, + unsigned enable_value) +{ + fprintf(stderr, + "OSMesaPostProcess() is only available with gallium drivers\n"); +} + + + +/** + * When GLX_INDIRECT_RENDERING is defined, some symbols are missing in + * libglapi.a. We need to define them here. + */ +#ifdef GLX_INDIRECT_RENDERING + +#define GL_GLEXT_PROTOTYPES +#include "GL/gl.h" +#include "glapi/glapi.h" +#include "glapi/glapitable.h" + +#if defined(USE_MGL_NAMESPACE) +#define NAME(func) mgl##func +#else +#define NAME(func) gl##func +#endif + +#define DISPATCH(FUNC, ARGS, MESSAGE) \ + GET_DISPATCH()->FUNC ARGS + +#define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) \ + return GET_DISPATCH()->FUNC ARGS + +/* skip normal ones */ +#define _GLAPI_SKIP_NORMAL_ENTRY_POINTS +#include "glapi/glapitemp.h" + +#endif /* GLX_INDIRECT_RENDERING */