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

📄 glfbdev.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
   }   else {      indexBits = varInfo->bits_per_pixel;      if ((fixInfo->visual == FB_VISUAL_PSEUDOCOLOR ||           fixInfo->visual == FB_VISUAL_STATIC_PSEUDOCOLOR)          && varInfo->bits_per_pixel == 8) {         vis->pixelFormat = PF_CI8;      }      else {         _mesa_problem(NULL, "Unsupported fbdev CI visual/bitdepth!\n");         _mesa_free(vis);         return NULL;      }   }   if (!_mesa_initialize_visual(&vis->glvisual, rgbFlag, dbFlag, stereoFlag,                                redBits, greenBits, blueBits, alphaBits,                                indexBits, depthBits, stencilBits,                                accumRedBits, accumGreenBits,                                accumBlueBits, accumAlphaBits,                                numSamples)) {      /* something was invalid */      _mesa_free(vis);      return NULL;   }   return vis;}voidglFBDevDestroyVisual( GLFBDevVisualPtr visual ){   if (visual)      _mesa_free(visual);}intglFBDevGetVisualAttrib( const GLFBDevVisualPtr visual, int attrib){   /* XXX unfinished */   (void) visual;   (void) attrib;   return -1;}static voiddelete_renderbuffer(struct gl_renderbuffer *rb){   struct GLFBDevRenderbufferRec *frb = (struct GLFBDevRenderbufferRec *) rb;   if (frb->mallocedBuffer) {      _mesa_free(frb->Base.Data);   }   _mesa_free(frb);}static GLbooleanrenderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb,                     GLenum internalFormat, GLuint width, GLuint height){   /* no-op: the renderbuffer storage is allocated just once when it's    * created.  Never resized or reallocated.    */   return GL_TRUE;}static struct GLFBDevRenderbufferRec *new_glfbdev_renderbuffer(void *bufferStart, const GLFBDevVisualPtr visual){   struct GLFBDevRenderbufferRec *rb = CALLOC_STRUCT(GLFBDevRenderbufferRec);   if (rb) {      GLuint name = 0;      int pixelFormat = visual->pixelFormat;      _mesa_init_renderbuffer(&rb->Base, name);      rb->Base.Delete = delete_renderbuffer;      rb->Base.AllocStorage = renderbuffer_storage;      if (pixelFormat == PF_B8G8R8) {         rb->Base.GetRow = get_row_B8G8R8;         rb->Base.GetValues = get_values_B8G8R8;         rb->Base.PutRow = put_row_B8G8R8;         rb->Base.PutRowRGB = put_row_rgb_B8G8R8;         rb->Base.PutMonoRow = put_mono_row_B8G8R8;         rb->Base.PutValues = put_values_B8G8R8;         rb->Base.PutMonoValues = put_mono_values_B8G8R8;      }      else if (pixelFormat == PF_B8G8R8A8) {         rb->Base.GetRow = get_row_B8G8R8A8;         rb->Base.GetValues = get_values_B8G8R8A8;         rb->Base.PutRow = put_row_B8G8R8A8;         rb->Base.PutRowRGB = put_row_rgb_B8G8R8A8;         rb->Base.PutMonoRow = put_mono_row_B8G8R8A8;         rb->Base.PutValues = put_values_B8G8R8A8;         rb->Base.PutMonoValues = put_mono_values_B8G8R8A8;      }      else if (pixelFormat == PF_B5G6R5) {         rb->Base.GetRow = get_row_B5G6R5;         rb->Base.GetValues = get_values_B5G6R5;         rb->Base.PutRow = put_row_B5G6R5;         rb->Base.PutRowRGB = put_row_rgb_B5G6R5;         rb->Base.PutMonoRow = put_mono_row_B5G6R5;         rb->Base.PutValues = put_values_B5G6R5;         rb->Base.PutMonoValues = put_mono_values_B5G6R5;      }      else if (pixelFormat == PF_B5G5R5) {         rb->Base.GetRow = get_row_B5G5R5;         rb->Base.GetValues = get_values_B5G5R5;         rb->Base.PutRow = put_row_B5G5R5;         rb->Base.PutRowRGB = put_row_rgb_B5G5R5;         rb->Base.PutMonoRow = put_mono_row_B5G5R5;         rb->Base.PutValues = put_values_B5G5R5;         rb->Base.PutMonoValues = put_mono_values_B5G5R5;      }      else if (pixelFormat == PF_CI8) {         rb->Base.GetRow = get_row_CI8;         rb->Base.GetValues = get_values_CI8;         rb->Base.PutRow = put_row_CI8;         rb->Base.PutMonoRow = put_mono_row_CI8;         rb->Base.PutValues = put_values_CI8;         rb->Base.PutMonoValues = put_mono_values_CI8;      }      if (pixelFormat == PF_CI8) {         rb->Base.InternalFormat = GL_COLOR_INDEX8_EXT;         rb->Base._BaseFormat = GL_COLOR_INDEX;      }      else {         rb->Base.InternalFormat = GL_RGBA;         rb->Base._BaseFormat = GL_RGBA;      }      rb->Base.DataType = GL_UNSIGNED_BYTE;      rb->Base.Data = bufferStart;      rb->rowStride = visual->var.xres_virtual * visual->var.bits_per_pixel / 8;      rb->bottom = (GLubyte *) bufferStart                 + (visual->var.yres - 1) * rb->rowStride;      rb->Base.Width = visual->var.xres;      rb->Base.Height = visual->var.yres;      rb->Base.RedBits = visual->var.red.length;      rb->Base.GreenBits = visual->var.green.length;      rb->Base.BlueBits = visual->var.blue.length;      rb->Base.AlphaBits = visual->var.transp.length;      rb->Base.InternalFormat = pixelFormat;   }   return rb;}GLFBDevBufferPtrglFBDevCreateBuffer( const struct fb_fix_screeninfo *fixInfo,                     const struct fb_var_screeninfo *varInfo,                     const GLFBDevVisualPtr visual,                     void *frontBuffer, void *backBuffer, size_t size ){   struct GLFBDevRenderbufferRec *frontrb, *backrb;   GLFBDevBufferPtr buf;   ASSERT(visual);   ASSERT(frontBuffer);   ASSERT(size > 0);   /* this is to update the visual if there was a resize and the      buffer is created again */   visual->var = *varInfo;   visual->fix = *fixInfo;   if (visual->fix.visual != fixInfo->visual ||       visual->fix.type != fixInfo->type ||       visual->var.bits_per_pixel != varInfo->bits_per_pixel ||       visual->var.grayscale != varInfo->grayscale ||       visual->var.red.offset != varInfo->red.offset ||       visual->var.green.offset != varInfo->green.offset ||       visual->var.blue.offset != varInfo->blue.offset ||       visual->var.transp.offset != varInfo->transp.offset) {      /* visual mismatch! */      return NULL;   }   buf = CALLOC_STRUCT(GLFBDevBufferRec);   if (!buf)      return NULL;   /* basic framebuffer setup */   _mesa_initialize_framebuffer(&buf->glframebuffer, &visual->glvisual);   /* add front renderbuffer */   frontrb = new_glfbdev_renderbuffer(frontBuffer, visual);   _mesa_add_renderbuffer(&buf->glframebuffer, BUFFER_FRONT_LEFT,                          &frontrb->Base);   /* add back renderbuffer */   if (visual->glvisual.doubleBufferMode) {      const int malloced = !backBuffer;      if (malloced) {         /* malloc a back buffer */         backBuffer = _mesa_malloc(size);         if (!backBuffer) {            _mesa_free_framebuffer_data(&buf->glframebuffer);            _mesa_free(buf);            return NULL;         }      }      backrb = new_glfbdev_renderbuffer(backBuffer, visual);      if (!backrb) {         /* out of mem */         return NULL;      }      backrb->mallocedBuffer = malloced;      _mesa_add_renderbuffer(&buf->glframebuffer, BUFFER_BACK_LEFT,                             &backrb->Base);   }   /* add software renderbuffers */   _mesa_add_soft_renderbuffers(&buf->glframebuffer,                                GL_FALSE, /* color */                                visual->glvisual.haveDepthBuffer,                                visual->glvisual.haveStencilBuffer,                                visual->glvisual.haveAccumBuffer,                                GL_FALSE, /* alpha */                                GL_FALSE /* aux bufs */);   buf->fix = *fixInfo;   /* struct assignment */   buf->var = *varInfo;   /* struct assignment */   buf->visual = visual;  /* ptr assignment */   buf->size = size;   buf->bytesPerPixel = visual->var.bits_per_pixel / 8;   return buf;}voidglFBDevDestroyBuffer( GLFBDevBufferPtr buffer ){   if (buffer) {      /* check if destroying the current buffer */      GLFBDevBufferPtr curDraw = glFBDevGetCurrentDrawBuffer();      GLFBDevBufferPtr curRead = glFBDevGetCurrentReadBuffer();      if (buffer == curDraw || buffer == curRead) {         glFBDevMakeCurrent( NULL, NULL, NULL);      }      {         struct gl_framebuffer *fb = &buffer->glframebuffer;         _mesa_unreference_framebuffer(&fb);      }   }}intglFBDevGetBufferAttrib( const GLFBDevBufferPtr buffer, int attrib){   (void) buffer;   (void) attrib;   return -1;}GLFBDevBufferPtrglFBDevGetCurrentDrawBuffer( void ){   GLFBDevContextPtr fbdevctx = glFBDevGetCurrentContext();   if (fbdevctx)      return fbdevctx->drawBuffer;   else      return NULL;}GLFBDevBufferPtrglFBDevGetCurrentReadBuffer( void ){   GLFBDevContextPtr fbdevctx = glFBDevGetCurrentContext();   if (fbdevctx)      return fbdevctx->readBuffer;   else      return NULL;}voidglFBDevSwapBuffers( GLFBDevBufferPtr buffer ){   GLFBDevContextPtr fbdevctx = glFBDevGetCurrentContext();   struct GLFBDevRenderbufferRec *frontrb = (struct GLFBDevRenderbufferRec *)      buffer->glframebuffer.Attachment[BUFFER_FRONT_LEFT].Renderbuffer;   struct GLFBDevRenderbufferRec *backrb = (struct GLFBDevRenderbufferRec *)      buffer->glframebuffer.Attachment[BUFFER_BACK_LEFT].Renderbuffer;   if (!buffer || !buffer->visual->glvisual.doubleBufferMode)      return;   /* check if swapping currently bound buffer */   if (fbdevctx->drawBuffer == buffer) {      /* flush pending rendering */      _mesa_notifySwapBuffers(&fbdevctx->glcontext);   }   ASSERT(frontrb->Base.Data);   ASSERT(backrb->Base.Data);   _mesa_memcpy(frontrb->Base.Data, backrb->Base.Data, buffer->size);}GLFBDevContextPtrglFBDevCreateContext( const GLFBDevVisualPtr visual, GLFBDevContextPtr share ){   GLFBDevContextPtr ctx;   GLcontext *glctx;   struct dd_function_table functions;   ASSERT(visual);   ctx = CALLOC_STRUCT(GLFBDevContextRec);   if (!ctx)      return NULL;   /* build table of device driver functions */   _mesa_init_driver_functions(&functions);   functions.GetString = get_string;   functions.UpdateState = update_state;   functions.GetBufferSize = get_buffer_size;   functions.Viewport = viewport;   if (!_mesa_initialize_context(&ctx->glcontext, &visual->glvisual,                                 share ? &share->glcontext : NULL,                                 &functions, (void *) ctx)) {      _mesa_free(ctx);      return NULL;   }   ctx->visual = visual;   /* Create module contexts */   glctx = (GLcontext *) &ctx->glcontext;   _swrast_CreateContext( glctx );   _vbo_CreateContext( glctx );   _tnl_CreateContext( glctx );   _swsetup_CreateContext( glctx );   _swsetup_Wakeup( glctx );   /* use default TCL pipeline */   {      TNLcontext *tnl = TNL_CONTEXT(glctx);      tnl->Driver.RunPipeline = _tnl_run_pipeline;   }   _mesa_enable_sw_extensions(glctx);   _mesa_enable_1_3_extensions(glctx);   _mesa_enable_1_4_extensions(glctx);   _mesa_enable_1_5_extensions(glctx);   _mesa_enable_2_0_extensions(glctx);   _mesa_enable_2_1_extensions(glctx);   return ctx;}voidglFBDevDestroyContext( GLFBDevContextPtr context ){   GLFBDevContextPtr fbdevctx = glFBDevGetCurrentContext();   if (context) {      GLcontext *mesaCtx = &context->glcontext;      _swsetup_DestroyContext( mesaCtx );      _swrast_DestroyContext( mesaCtx );      _tnl_DestroyContext( mesaCtx );      _vbo_DestroyContext( mesaCtx );      if (fbdevctx == context) {         /* destroying current context */         _mesa_make_current(NULL, NULL, NULL);      }      _mesa_free_context_data(&context->glcontext);      _mesa_free(context);   }}intglFBDevGetContextAttrib( const GLFBDevContextPtr context, int attrib){   (void) context;   (void) attrib;   return -1;}GLFBDevContextPtrglFBDevGetCurrentContext( void ){   GET_CURRENT_CONTEXT(ctx);   return (GLFBDevContextPtr) ctx;}intglFBDevMakeCurrent( GLFBDevContextPtr context,                    GLFBDevBufferPtr drawBuffer,                    GLFBDevBufferPtr readBuffer ){   if (context && drawBuffer && readBuffer) {      /* Make sure the context's visual and the buffers' visuals match.       * XXX we might do this by comparing specific fields like bits_per_pixel,       * visual, etc. in the future.       */      if (context->visual != drawBuffer->visual ||          context->visual != readBuffer->visual) {         return 0;      }      _mesa_make_current( &context->glcontext,                          &drawBuffer->glframebuffer,                          &readBuffer->glframebuffer );      context->drawBuffer = drawBuffer;      context->readBuffer = readBuffer;      context->curBuffer = drawBuffer;   }   else {      /* unbind */      _mesa_make_current( NULL, NULL, NULL );   }   return 1;}#endif /* USE_GLFBDEV_DRIVER */

⌨️ 快捷键说明

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