📄 glfbdev.c
字号:
} 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 + -