129 lines
3.0 KiB
C
129 lines
3.0 KiB
C
/* simple glx like driver for TinyGL and Nano X */
|
|
#include <GL/gl.h>
|
|
#include <GL/nglx.h>
|
|
#include <microwin/nano-X.h>
|
|
#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);
|
|
}
|
|
|
|
|