📄 osmesa.c
字号:
osmesa->format != OSMESA_ARGB) return NULL; 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; } if (swrast->_RasterMask == 0) { return (swrast_line_func) flat_rgba_line; } return (swrast_line_func) NULL;}/**********************************************************************//***** Optimized triangle rendering *****//**********************************************************************//* * Smooth-shaded, z-less triangle, RGBA color. */#define NAME smooth_rgba_z_triangle#define INTERP_Z 1#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE#define INTERP_RGB 1#define INTERP_ALPHA 1#define SETUP_CODE \ const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);#define RENDER_SPAN( span ) { \ GLuint i; \ GLchan *img = PIXELADDR4(span.x, span.y); \ for (i = 0; i < span.end; i++, img += 4) { \ const GLuint z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ PACK_RGBA(img, FixedToChan(span.red), \ FixedToChan(span.green), FixedToChan(span.blue), \ FixedToChan(span.alpha)); \ zRow[i] = z; \ } \ span.red += span.redStep; \ span.green += span.greenStep; \ span.blue += span.blueStep; \ span.alpha += span.alphaStep; \ span.z += span.zStep; \ } \}#ifdef WIN32#include "..\swrast\s_tritemp.h"#else#include "swrast/s_tritemp.h"#endif/* * Flat-shaded, z-less triangle, RGBA color. */#define NAME flat_rgba_z_triangle#define INTERP_Z 1#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE#define SETUP_CODE \ const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); \ GLuint pixel; \ PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1], \ v2->color[2], v2->color[3]);#define RENDER_SPAN( span ) { \ GLuint i; \ GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y); \ for (i = 0; i < span.end; i++) { \ const GLuint z = FixedToDepth(span.z); \ if (z < zRow[i]) { \ img[i] = pixel; \ zRow[i] = z; \ } \ span.z += span.zStep; \ } \}#ifdef WIN32#include "..\swrast\s_tritemp.h"#else#include "swrast/s_tritemp.h"#endif/* * Return pointer to an accelerated triangle function if possible. */static swrast_tri_funcosmesa_choose_triangle_function( GLcontext *ctx ){ const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); const SWcontext *swrast = SWRAST_CONTEXT(ctx); if (CHAN_BITS != 8) 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; 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; 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; } else { return (swrast_tri_func) flat_rgba_z_triangle; } } return (swrast_tri_func) NULL;}/* Override for the swrast triangle-selection function. Try to use one * of our internal triangle functions, otherwise fall back to the * standard swrast functions. */static voidosmesa_choose_triangle( GLcontext *ctx ){ SWcontext *swrast = SWRAST_CONTEXT(ctx); swrast->Triangle = osmesa_choose_triangle_function( ctx ); if (!swrast->Triangle) _swrast_choose_triangle( ctx );}static voidosmesa_choose_line( GLcontext *ctx ){ SWcontext *swrast = SWRAST_CONTEXT(ctx); swrast->Line = osmesa_choose_line_function( ctx ); if (!swrast->Line) _swrast_choose_line( ctx );}/** * Don't use _mesa_delete_renderbuffer since we can't free rb->Data. */static voidosmesa_delete_renderbuffer(struct gl_renderbuffer *rb){ _mesa_free(rb);}/** * Allocate renderbuffer storage. We don't actually allocate any storage * since we're using a user-provided buffer. * Just set up all the gl_renderbuffer methods. */static GLbooleanosmesa_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb, GLenum internalFormat, GLuint width, GLuint height){ const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); /* Note: we can ignoring internalFormat for "window-system" renderbuffers */ if (osmesa->format == OSMESA_RGBA) { rb->GetRow = get_row_RGBA; rb->GetValues = get_values_RGBA; rb->PutRow = put_row_RGBA; rb->PutRowRGB = put_row_rgb_RGBA; rb->PutMonoRow = put_mono_row_RGBA; rb->PutValues = put_values_RGBA; rb->PutMonoValues = put_mono_values_RGBA; rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = 8 * sizeof(GLchan); } else if (osmesa->format == OSMESA_BGRA) { rb->GetRow = get_row_BGRA; rb->GetValues = get_values_BGRA; rb->PutRow = put_row_BGRA; rb->PutRowRGB = put_row_rgb_BGRA; rb->PutMonoRow = put_mono_row_BGRA; rb->PutValues = put_values_BGRA; rb->PutMonoValues = put_mono_values_BGRA; rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = 8 * sizeof(GLchan); } else if (osmesa->format == OSMESA_ARGB) { rb->GetRow = get_row_ARGB; rb->GetValues = get_values_ARGB; rb->PutRow = put_row_ARGB; rb->PutRowRGB = put_row_rgb_ARGB; rb->PutMonoRow = put_mono_row_ARGB; rb->PutValues = put_values_ARGB; rb->PutMonoValues = put_mono_values_ARGB; rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = 8 * sizeof(GLchan); } else if (osmesa->format == OSMESA_RGB) { rb->GetRow = get_row_RGB; rb->GetValues = get_values_RGB; rb->PutRow = put_row_RGB; rb->PutRowRGB = put_row_rgb_RGB; rb->PutMonoRow = put_mono_row_RGB; rb->PutValues = put_values_RGB; rb->PutMonoValues = put_mono_values_RGB; rb->RedBits = rb->GreenBits = rb->BlueBits = 8 * sizeof(GLchan); } else if (osmesa->format == OSMESA_BGR) { rb->GetRow = get_row_BGR; rb->GetValues = get_values_BGR; rb->PutRow = put_row_BGR; rb->PutRowRGB = put_row_rgb_BGR; rb->PutMonoRow = put_mono_row_BGR; rb->PutValues = put_values_BGR; rb->PutMonoValues = put_mono_values_BGR; rb->RedBits = rb->GreenBits = rb->BlueBits = 8 * sizeof(GLchan); }#if CHAN_TYPE == GL_UNSIGNED_BYTE else if (osmesa->format == OSMESA_RGB_565) { 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; }#endif 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; } else { _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage"); } return GL_TRUE;}/** * Allocate a new renderbuffer tpo describe the user-provided color buffer. */static struct gl_renderbuffer *new_osmesa_renderbuffer(GLenum format){ struct gl_renderbuffer *rb = CALLOC_STRUCT(gl_renderbuffer); if (rb) { const GLuint name = 0; _mesa_init_renderbuffer(rb, name); rb->Delete = osmesa_delete_renderbuffer; rb->AllocStorage = osmesa_renderbuffer_storage; if (format == OSMESA_COLOR_INDEX) { rb->_BaseFormat = GL_COLOR_INDEX; rb->InternalFormat = GL_COLOR_INDEX; rb->DataType = GL_UNSIGNED_BYTE; } else { rb->_BaseFormat = GL_RGBA; rb->InternalFormat = GL_RGBA; rb->DataType = CHAN_TYPE; } } return rb;}/**********************************************************************//***** Public Functions *****//**********************************************************************//* * 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 * sharelist - specifies another OSMesaContext with which to share * display lists. NULL indicates no sharing. * Return: an OSMesaContext or 0 if error */GLAPI OSMesaContext GLAPIENTRYOSMesaCreateContext( GLenum format, OSMesaContext sharelist ){ const GLint accumBits = (format == OSMESA_COLOR_INDEX) ? 0 : 16; return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS, 8, accumBits, sharelist);}/* * New in Mesa 3.5 * * Create context and specify size of ancillary buffers. */GLAPI OSMesaContext GLAPIENTRYOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, GLint accumBits, OSMesaContext sharelist ){ 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; rind = gind = bind = aind = 0; if (format==OSMESA_COLOR_INDEX) { indexBits = 8; rgbmode = GL_FALSE; } else if (format==OSMESA_RGBA) { indexBits = 0; redBits = CHAN_BITS; greenBits = CHAN_BITS; blueBits = CHAN_BITS; alphaBits = CHAN_BITS; rind = 0; 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; alphaBits = CHAN_BITS; bind = 0; 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; alphaBits = CHAN_BITS; aind = 0; 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; alphaBits = 0; 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; alphaBits = 0; 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; alphaBits = 0; rind = 0; /* not used */ gind = 0; bind = 0; rgbmode = GL_TRUE; }#endif else { return NULL; } osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context); if (osmesa) { osmesa->gl_visual = _mesa_create_visual( rgbmode, GL_FALSE, /* double buffer */ GL_FALSE, /* stereo */ redBits, greenBits, blueBits, alphaBits, indexBits, depthBits, stencilBits, accumBits,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -