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

📄 dmesa.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 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 + -