X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fosmesa%2Fosmesa.c;h=e594548a6305436531adcecdebcfc169f1955fa7;hb=99728076ec1a8bd3feb0f23e41198d8d5e56d0c9;hp=692657a5dfd626796240b73098899e159766104c;hpb=9fd7e9ef05955834e3c4de8a1dfa7ea1a868d762;p=mesa.git diff --git a/src/mesa/drivers/osmesa/osmesa.c b/src/mesa/drivers/osmesa/osmesa.c index 692657a5dfd..e594548a630 100644 --- a/src/mesa/drivers/osmesa/osmesa.c +++ b/src/mesa/drivers/osmesa/osmesa.c @@ -37,14 +37,17 @@ #include "GL/osmesa.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/mtypes.h" #include "main/renderbuffer.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" @@ -54,27 +57,30 @@ #include "vbo/vbo.h" +#define OSMESA_RENDERBUFFER_CLASS 0x053 + /** - * OSMesa rendering context, derived from core Mesa GLcontext. + * OSMesa rendering context, derived from core Mesa struct gl_context. */ struct osmesa_context { - GLcontext mesa; /*< Base class - this must be first */ - GLvisual *gl_visual; /*< Describes the buffers */ - struct gl_renderbuffer *rb; /*< The user's colorbuffer */ - GLframebuffer *gl_buffer; /*< The framebuffer, containing user's rb */ + struct gl_context mesa; /*< Base class - this must be first */ + struct gl_config *gl_visual; /*< Describes the buffers */ + 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 -OSMESA_CONTEXT(GLcontext *ctx) +OSMESA_CONTEXT(struct gl_context *ctx) { /* Just cast, since we're using structure containment */ return (OSMesaContext) ctx; @@ -87,7 +93,7 @@ OSMESA_CONTEXT(GLcontext *ctx) static const GLubyte * -get_string( GLcontext *ctx, GLenum name ) +get_string( struct gl_context *ctx, GLenum name ) { (void) ctx; switch (name) { @@ -106,7 +112,7 @@ get_string( GLcontext *ctx, GLenum name ) static void -osmesa_update_state( GLcontext *ctx, GLuint new_state ) +osmesa_update_state( struct gl_context *ctx, GLuint new_state ) { /* easy - just propogate */ _swrast_InvalidateState( ctx, new_state ); @@ -117,390 +123,6 @@ osmesa_update_state( GLcontext *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" - - -/* color index */ -#define NAME(PREFIX) PREFIX##_CI -#define CI_MODE -#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] + (X) -#define INC_PIXEL_PTR(P) P += 1 -#define STORE_PIXEL(DST, X, Y, VALUE) \ - *DST = VALUE[0] -#define FETCH_PIXEL(DST, SRC) \ - DST = SRC[0] -#include "swrast/s_spantemp.h" - - - - /** * Macros for optimized line/triangle rendering. * Only for 8-bit channel, RGBA, BGRA, ARGB formats. @@ -532,11 +154,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 @@ -561,11 +179,7 @@ do { \ } \ } while (0) -#ifdef WIN32 -#include "..\swrast\s_linetemp.h" -#else #include "swrast/s_linetemp.h" -#endif @@ -574,14 +188,11 @@ do { \ * function. Otherwise, return NULL. */ static swrast_line_func -osmesa_choose_line_function( GLcontext *ctx ) +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) - return NULL; - if (ctx->RenderMode != GL_RENDER) return NULL; if (ctx->Line.SmoothFlag) return NULL; if (ctx->Texture._EnabledUnits) return NULL; @@ -641,11 +252,7 @@ osmesa_choose_line_function( GLcontext *ctx ) span.z += span.zStep; \ } \ } -#ifdef WIN32 -#include "..\swrast\s_tritemp.h" -#else #include "swrast/s_tritemp.h" -#endif @@ -673,11 +280,8 @@ osmesa_choose_line_function( GLcontext *ctx ) span.z += span.zStep; \ } \ } -#ifdef WIN32 -#include "..\swrast\s_tritemp.h" -#else + #include "swrast/s_tritemp.h" -#endif @@ -685,14 +289,11 @@ osmesa_choose_line_function( GLcontext *ctx ) * Return pointer to an optimized triangle function if possible. */ static swrast_tri_func -osmesa_choose_triangle_function( GLcontext *ctx ) +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->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; @@ -725,7 +326,7 @@ osmesa_choose_triangle_function( GLcontext *ctx ) * standard swrast functions. */ static void -osmesa_choose_triangle( GLcontext *ctx ) +osmesa_choose_triangle( struct gl_context *ctx ) { SWcontext *swrast = SWRAST_CONTEXT(ctx); @@ -735,7 +336,7 @@ osmesa_choose_triangle( GLcontext *ctx ) } static void -osmesa_choose_line( GLcontext *ctx ) +osmesa_choose_line( struct gl_context *ctx ) { SWcontext *swrast = SWRAST_CONTEXT(ctx); @@ -752,47 +353,17 @@ osmesa_choose_line( GLcontext *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_COLOR_INDEX) { - /* CI mode */ - bytesPerPixel = 1 * sizeof(GLubyte); - } - else 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 */ @@ -812,12 +383,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) { - _mesa_free(rb); + free(rb); } @@ -827,198 +398,96 @@ osmesa_delete_renderbuffer(struct gl_renderbuffer *rb) * Just set up all the gl_renderbuffer methods. */ static GLboolean -osmesa_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb, +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; - - rb->RedBits = - rb->GreenBits = - rb->BlueBits = - rb->AlphaBits = bpc; /* 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_RGBA8888_REV; + else + rb->Format = MESA_FORMAT_RGBA8888; } - 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_16; } 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; } - rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = bpc; } 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_ARGB8888; + else + rb->Format = MESA_FORMAT_ARGB8888_REV; } - 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_16; /* 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 */ } - rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = bpc; } 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_ARGB8888_REV; + else + rb->Format = MESA_FORMAT_ARGB8888; } - 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_16; /* 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 */ } - rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = bpc; } 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_RGB888; } - 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_16; /* 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 */ } - rb->RedBits = rb->GreenBits = rb->BlueBits = bpc; } 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_BGR888; } - 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_16; /* 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 */ } - rb->RedBits = rb->GreenBits = rb->BlueBits = bpc; } 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; - rb->RedBits = 5; - rb->GreenBits = 6; - rb->BlueBits = 5; - } - else if (osmesa->format == OSMESA_COLOR_INDEX) { - rb->GetRow = get_row_CI; - rb->GetValues = get_values_CI; - rb->PutRow = put_row_CI; - rb->PutMonoRow = put_mono_row_CI; - rb->PutValues = put_values_CI; - rb->PutMonoValues = put_mono_values_CI; - rb->IndexBits = 8; + ASSERT(osmesa->DataType == GL_UNSIGNED_BYTE); + rb->Format = MESA_FORMAT_RGB565; } else { _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage"); @@ -1036,30 +505,77 @@ osmesa_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb, /** * Allocate a new renderbuffer to describe the user-provided color buffer. */ -static struct gl_renderbuffer * -new_osmesa_renderbuffer(GLcontext *ctx, GLenum format, GLenum type) +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; - - if (format == OSMESA_COLOR_INDEX) { - rb->InternalFormat = GL_COLOR_INDEX; - rb->_ActualFormat = GL_COLOR_INDEX8_EXT; - rb->_BaseFormat = GL_COLOR_INDEX; - rb->DataType = GL_UNSIGNED_BYTE; + 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; } else { - rb->InternalFormat = GL_RGBA; - rb->_ActualFormat = GL_RGBA; - rb->_BaseFormat = GL_RGBA; - rb->DataType = type; + *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; } @@ -1072,7 +588,7 @@ new_osmesa_renderbuffer(GLcontext *ctx, GLenum format, GLenum type) * Create an Off-Screen Mesa rendering context. The only attribute needed is * an RGBA vs Color-Index mode flag. * - * Input: format - either GL_RGBA or GL_COLOR_INDEX + * Input: format - Must be GL_RGBA * sharelist - specifies another OSMesaContext with which to share * display lists. NULL indicates no sharing. * Return: an OSMesaContext or 0 if error @@ -1080,9 +596,8 @@ new_osmesa_renderbuffer(GLcontext *ctx, GLenum format, GLenum type) GLAPI OSMesaContext GLAPIENTRY OSMesaCreateContext( GLenum format, OSMesaContext sharelist ) { - const GLint accumBits = (format == OSMESA_COLOR_INDEX) ? 0 : 16; return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS, - 8, accumBits, sharelist); + 8, 0, sharelist); } @@ -1099,17 +614,10 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, OSMesaContext osmesa; struct dd_function_table functions; GLint rind, gind, bind, aind; - GLint indexBits = 0, redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0; - GLboolean rgbmode; - GLenum type = CHAN_TYPE; + GLint redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0; rind = gind = bind = aind = 0; - if (format==OSMESA_COLOR_INDEX) { - indexBits = 8; - rgbmode = GL_FALSE; - } - else if (format==OSMESA_RGBA) { - indexBits = 0; + if (format==OSMESA_RGBA) { redBits = CHAN_BITS; greenBits = CHAN_BITS; blueBits = CHAN_BITS; @@ -1118,10 +626,8 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, gind = 1; bind = 2; aind = 3; - rgbmode = GL_TRUE; } else if (format==OSMESA_BGRA) { - indexBits = 0; redBits = CHAN_BITS; greenBits = CHAN_BITS; blueBits = CHAN_BITS; @@ -1130,10 +636,8 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, gind = 1; rind = 2; aind = 3; - rgbmode = GL_TRUE; } else if (format==OSMESA_ARGB) { - indexBits = 0; redBits = CHAN_BITS; greenBits = CHAN_BITS; blueBits = CHAN_BITS; @@ -1142,10 +646,8 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, rind = 1; gind = 2; bind = 3; - rgbmode = GL_TRUE; } else if (format==OSMESA_RGB) { - indexBits = 0; redBits = CHAN_BITS; greenBits = CHAN_BITS; blueBits = CHAN_BITS; @@ -1153,10 +655,8 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, rind = 0; gind = 1; bind = 2; - rgbmode = GL_TRUE; } else if (format==OSMESA_BGR) { - indexBits = 0; redBits = CHAN_BITS; greenBits = CHAN_BITS; blueBits = CHAN_BITS; @@ -1164,11 +664,9 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, rind = 2; gind = 1; bind = 0; - rgbmode = GL_TRUE; } #if CHAN_TYPE == GL_UNSIGNED_BYTE else if (format==OSMESA_RGB_565) { - indexBits = 0; redBits = 5; greenBits = 6; blueBits = 5; @@ -1176,7 +674,6 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, rind = 0; /* not used */ gind = 0; bind = 0; - rgbmode = GL_TRUE; } #endif else { @@ -1185,14 +682,12 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context); if (osmesa) { - osmesa->gl_visual = _mesa_create_visual( rgbmode, - GL_FALSE, /* double buffer */ + osmesa->gl_visual = _mesa_create_visual( GL_FALSE, /* double buffer */ GL_FALSE, /* stereo */ redBits, greenBits, blueBits, alphaBits, - indexBits, depthBits, stencilBits, accumBits, @@ -1202,7 +697,7 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, 1 /* num samples */ ); if (!osmesa->gl_visual) { - _mesa_free(osmesa); + free(osmesa); return NULL; } @@ -1214,12 +709,13 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, functions.GetBufferSize = NULL; if (!_mesa_initialize_context(&osmesa->mesa, + API_OPENGL, osmesa->gl_visual, sharelist ? &sharelist->mesa - : (GLcontext *) NULL, + : (struct gl_context *) NULL, &functions, (void *) osmesa)) { _mesa_destroy_visual( osmesa->gl_visual ); - _mesa_free(osmesa); + free(osmesa); return NULL; } @@ -1234,22 +730,20 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, if (!osmesa->gl_buffer) { _mesa_destroy_visual( osmesa->gl_visual ); _mesa_free_context_data( &osmesa->mesa ); - _mesa_free(osmesa); + free(osmesa); return NULL; } - /* create front color buffer in user-provided memory (no back buffer) */ - osmesa->rb = new_osmesa_renderbuffer(&osmesa->mesa, format, type); - _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb); - assert(osmesa->rb->RefCount == 2); - - _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 */ ); + /* Create depth/stencil/accum buffers. We'll create the color + * buffer later in OSMesaMakeCurrent(). + */ + _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; @@ -1263,7 +757,7 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, /* Initialize the software rasterizer and helper modules. */ { - GLcontext *ctx = &osmesa->mesa; + struct gl_context *ctx = &osmesa->mesa; SWcontext *swrast; TNLcontext *tnl; @@ -1273,7 +767,7 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, !_swsetup_CreateContext( ctx )) { _mesa_destroy_visual(osmesa->gl_visual); _mesa_free_context_data(ctx); - _mesa_free(osmesa); + free(osmesa); return NULL; } @@ -1283,6 +777,9 @@ 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; + /* Extend the software rasterizer with our optimized line and triangle * drawing functions. */ @@ -1304,8 +801,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 ); @@ -1318,7 +815,7 @@ OSMesaDestroyContext( OSMesaContext osmesa ) _mesa_reference_framebuffer( &osmesa->gl_buffer, NULL ); _mesa_free_context_data( &osmesa->mesa ); - _mesa_free( osmesa ); + free( osmesa ); } } @@ -1355,7 +852,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; } @@ -1379,12 +876,30 @@ OSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type, */ _glapi_check_multithread(); + + /* Create a front/left color buffer which wraps the user-provided buffer. + * There is no back color buffer. + * If the user tries to use a 8, 16 or 32-bit/channel buffer that + * doesn't match what Mesa was compiled for (CHAN_BITS) the + * _mesa_add_renderbuffer() function will create a "wrapper" renderbuffer + * that converts rendering from CHAN_BITS to the user-requested channel + * size. + */ + 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->DataType = type; - 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. @@ -1398,11 +913,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); @@ -1415,7 +931,7 @@ OSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type, GLAPI OSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void ) { - GLcontext *ctx = _mesa_get_current_context(); + struct gl_context *ctx = _mesa_get_current_context(); if (ctx) return (OSMesaContext) ctx; else @@ -1473,12 +989,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; @@ -1487,10 +998,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)"); @@ -1511,12 +1022,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; @@ -1524,13 +1036,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; } } @@ -1548,11 +1060,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 { @@ -1592,7 +1104,7 @@ OSMesaGetProcAddress( const char *funcName ) { int i; for (i = 0; functions[i].Name; i++) { - if (_mesa_strcmp(functions[i].Name, funcName) == 0) + if (strcmp(functions[i].Name, funcName) == 0) return functions[i].Function; } return _glapi_get_proc_address(funcName); @@ -1613,3 +1125,31 @@ OSMesaColorClamp(GLboolean enable) } +/** + * 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 */