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

📄 osmesa.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
      }   }}/** * 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);   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;   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;      }      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 {         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->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;      }      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 {         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;      }      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;      }      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 {         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;      }      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;      }      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 {         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;      }      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;      }      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 {         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;      }      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;   }   else {      _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage");   }   rb->Width = width;   rb->Height = height;   compute_row_addresses( osmesa );   return GL_TRUE;}/** * Allocate a new renderbuffer to describe the user-provided color buffer. */static struct gl_renderbuffer *new_osmesa_renderbuffer(GLcontext *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;      }      else {         rb->InternalFormat = GL_RGBA;         rb->_ActualFormat = GL_RGBA;         rb->_BaseFormat = GL_RGBA;         rb->DataType = 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;   GLenum type = CHAN_TYPE;   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,                                               accumBits,                                               accumBits,                                               alphaBits ? accumBits : 0,                                               1            /* num samples */                                               );      if (!osmesa->gl_visual) {         _mesa_free(osmesa);         return NULL;      }      /* Initialize device driver function table */      _mesa_init_driver_functions(&functions);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -