⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osmesa.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 3 页
字号:
       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 + -