/* simple glx like driver for TinyGL and Nano X */ #include #include #include #include "zgl.h" typedef struct { GLContext *gl_context; int xsize,ysize; GR_DRAW_ID drawable; GR_GC_ID gc; int pixtype; /* pixel type in TinyGL */ } TinyNGLXContext; NGLXContext nglXCreateContext(NGLXContext shareList, int flags) { TinyNGLXContext *ctx; if (shareList != NULL) { gl_fatal_error("No sharing available in TinyGL"); } ctx=gl_malloc(sizeof(TinyNGLXContext)); if (!ctx) return NULL; ctx->gl_context=NULL; return (NGLXContext) ctx; } void glXDestroyContext( NGLXContext ctx1 ) { TinyNGLXContext *ctx = (TinyNGLXContext *) ctx1; if (ctx->gl_context != NULL) { glClose(); } gl_free(ctx); } /* resize the glx viewport : we try to use the xsize and ysize given. We return the effective size which is guaranted to be smaller */ static int glX_resize_viewport(GLContext *c,int *xsize_ptr,int *ysize_ptr) { TinyNGLXContext *ctx; int xsize,ysize; ctx=(TinyNGLXContext *)c->opaque; xsize=*xsize_ptr; ysize=*ysize_ptr; /* we ensure that xsize and ysize are multiples of 2 for the zbuffer. TODO: find a better solution */ xsize&=~3; ysize&=~3; if (xsize == 0 || ysize == 0) return -1; *xsize_ptr=xsize; *ysize_ptr=ysize; ctx->xsize=xsize; ctx->ysize=ysize; /* resize the Z buffer */ ZB_resize(c->zb,NULL,xsize,ysize); return 0; } /* we assume here that drawable is a window */ int nglXMakeCurrent( NGLXDrawable drawable, NGLXContext ctx1) { TinyNGLXContext *ctx = (TinyNGLXContext *) ctx1; int mode, xsize, ysize; ZBuffer *zb; GR_WINDOW_INFO win_info; if (ctx->gl_context == NULL) { /* create the TinyGL context */ GrGetWindowInfo(drawable, &win_info); xsize = win_info.width; ysize = win_info.height; /* currently, we only support 16 bit rendering */ mode = ZB_MODE_5R6G5B; zb=ZB_open(xsize,ysize,mode,0,NULL,NULL,NULL); if (zb == NULL) { fprintf(stderr, "Error while initializing Z buffer\n"); exit(1); } ctx->pixtype = MWPF_TRUECOLOR565; /* create a gc */ ctx->gc = GrNewGC(); /* initialisation of the TinyGL interpreter */ glInit(zb); ctx->gl_context=gl_get_context(); ctx->gl_context->opaque=(void *) ctx; ctx->gl_context->gl_resize_viewport=glX_resize_viewport; /* set the viewport : we force a call to glX_resize_viewport */ ctx->gl_context->viewport.xsize=-1; ctx->gl_context->viewport.ysize=-1; glViewport(0, 0, xsize, ysize); } return 1; } void nglXSwapBuffers( NGLXDrawable drawable ) { GLContext *gl_context; TinyNGLXContext *ctx; /* retrieve the current NGLXContext */ gl_context=gl_get_context(); ctx=(TinyNGLXContext *)gl_context->opaque; GrArea(drawable, ctx->gc, 0, 0, ctx->xsize, ctx->ysize, ctx->gl_context->zb->pbuf, ctx->pixtype); }