📄 dmesa.c
字号:
/* * Mesa 3-D graphics library * Version: 6.3 * * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *//* * DOS/DJGPP device driver for Mesa * * Author: Daniel Borca * Email : dborca@users.sourceforge.net * Web : http://www.geocities.com/dborca */#include "context.h"#include "imports.h"#include "mtypes.h"#include "video.h"#include "GL/osmesa.h"#include "GL/dmesa.h"/* * This has nothing to do with Mesa Visual structure. * We keep this one around for backwards compatibility, * and to store video mode data for DMesaCreateContext. */struct dmesa_visual { GLenum format; /* OSMesa framebuffer format */ GLint depthBits; GLint stencilBits; GLint accumBits;};/* * This has nothing to do with Mesa Buffer structure. * We keep this one around for backwards compatibility, * and to store various data. */struct dmesa_buffer { int xpos, ypos; /* position */ int width, height; /* size in pixels */ GLenum type; void *the_window; /* your window handle, etc */};/* * This has nothing to do with Mesa Context structure. * We keep this one around for backwards compatibility, * and to store real off-screen context. */struct dmesa_context { OSMesaContext osmesa; DMesaBuffer buffer;};static DMesaContext ctx;/**************************************************************************** * DMesa Public API Functions ***************************************************************************//* * The exact arguments to this function will depend on your window system */DMesaVisualDMesaCreateVisual (GLint width, GLint height, GLint colDepth, GLint refresh, GLboolean dbFlag, GLboolean rgbFlag, GLint alphaSize, GLint depthSize, GLint stencilSize, GLint accumSize){ DMesaVisual visual; GLenum format; int fbbits; if (dbFlag) { return NULL; } if (!rgbFlag) { format = OSMESA_COLOR_INDEX; fbbits = 8; } else if (alphaSize) { format = OSMESA_BGRA; fbbits = 32; } else if (colDepth == 15 || colDepth == 16) { format = OSMESA_RGB_565; fbbits = 16; } else { format = OSMESA_BGR; fbbits = 24; } if ((visual = (DMesaVisual)CALLOC_STRUCT(dmesa_visual)) == NULL) { return NULL; } if (vl_video_init(width, height, colDepth, rgbFlag, refresh, fbbits) <= 0) { FREE(visual); return NULL; } visual->format = format; visual->depthBits = depthSize; visual->stencilBits = stencilSize; visual->accumBits = accumSize; return visual;}voidDMesaDestroyVisual (DMesaVisual visual){ vl_video_exit(); FREE(visual);}DMesaBufferDMesaCreateBuffer (DMesaVisual visual, GLint xpos, GLint ypos, GLint width, GLint height){ DMesaBuffer buffer; GLenum type; int bytesPerPixel; switch (visual->format) { case OSMESA_COLOR_INDEX: bytesPerPixel = 1; type = CHAN_TYPE; break; case OSMESA_RGB_565: bytesPerPixel = 2; type = GL_UNSIGNED_SHORT_5_6_5; break; case OSMESA_BGR: bytesPerPixel = 3; type = CHAN_TYPE; break; default: bytesPerPixel = 4; type = CHAN_TYPE; } if ((buffer = (DMesaBuffer)CALLOC_STRUCT(dmesa_buffer)) != NULL) { buffer->xpos = xpos; buffer->ypos = ypos; buffer->width = width; buffer->height = height; buffer->type = type; buffer->the_window = MALLOC(width * height * bytesPerPixel + 1); if (buffer->the_window == NULL) { FREE(buffer); buffer = NULL; } } return buffer;}voidDMesaDestroyBuffer (DMesaBuffer buffer){ FREE(buffer->the_window); FREE(buffer);}DMesaContextDMesaCreateContext (DMesaVisual visual, DMesaContext share){ DMesaContext dmesa; if ((dmesa = (DMesaContext)CALLOC_STRUCT(dmesa_context)) != NULL) { dmesa->osmesa = OSMesaCreateContextExt( visual->format, visual->depthBits, visual->stencilBits, visual->accumBits, (share != NULL) ? share->osmesa : NULL); if (dmesa->osmesa == NULL) { FREE(dmesa); dmesa = NULL; } } return dmesa;}voidDMesaDestroyContext (DMesaContext dmesa){ OSMesaDestroyContext(dmesa->osmesa); FREE(dmesa);}GLbooleanDMesaMoveBuffer (GLint xpos, GLint ypos){ const DMesaContext dmesa = DMesaGetCurrentContext(); DMesaBuffer b = dmesa->buffer; if (vl_sync_buffer(&b->the_window, xpos, ypos, b->width, b->height) == 0) { b->xpos = xpos; b->ypos = ypos; return GL_TRUE; } return GL_FALSE;}GLbooleanDMesaResizeBuffer (GLint width, GLint height){ const DMesaContext dmesa = DMesaGetCurrentContext(); DMesaBuffer b = dmesa->buffer; if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, width, height) == 0) { b->width = width; b->height = height; return GL_TRUE; } return GL_FALSE;}GLbooleanDMesaMakeCurrent (DMesaContext dmesa, DMesaBuffer buffer){ if (dmesa == NULL || buffer == NULL) { ctx = NULL; return GL_TRUE; } if (OSMesaMakeCurrent(dmesa->osmesa, buffer->the_window, buffer->type, buffer->width, buffer->height) && vl_sync_buffer(&buffer->the_window, buffer->xpos, buffer->ypos, buffer->width, buffer->height) == 0) { OSMesaPixelStore(OSMESA_Y_UP, GL_FALSE); dmesa->buffer = buffer; ctx = dmesa; return GL_TRUE; } return GL_FALSE;}voidDMesaSwapBuffers (DMesaBuffer buffer){ /* copy/swap back buffer to front if applicable */ GET_CURRENT_CONTEXT(ctx); _mesa_notifySwapBuffers(ctx); vl_flip(); (void)buffer;}voidDMesaSetCI (int ndx, GLfloat red, GLfloat green, GLfloat blue){ vl_setCI(ndx, red, green, blue);}DMesaContextDMesaGetCurrentContext (void){ return ctx;}DMesaBufferDMesaGetCurrentBuffer (void){ const DMesaContext dmesa = DMesaGetCurrentContext(); if (dmesa != NULL) { return dmesa->buffer; } return NULL;}DMesaProcDMesaGetProcAddress (const char *name){ DMesaProc p = (DMesaProc)_glapi_get_proc_address(name); /* TODO: handle DMesa* namespace if (p == NULL) { } */ return p;}intDMesaGetIntegerv (GLenum pname, GLint *params){ switch (pname) { case DMESA_GET_SCREEN_SIZE: vl_get(VL_GET_SCREEN_SIZE, params); break; case DMESA_GET_DRIVER_CAPS: params[0] = 0; break; case DMESA_GET_VIDEO_MODES: return vl_get(VL_GET_VIDEO_MODES, params); case DMESA_GET_BUFFER_ADDR: { const DMesaContext dmesa = DMesaGetCurrentContext(); if (dmesa != NULL) { DMesaBuffer b = dmesa->buffer; if (b != NULL) { params[0] = (GLint)b->the_window; } } break; } default: return -1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -