| 1 | /* simple glx like driver for TinyGL and Nano X */ |
|---|
| 2 | #include <GL/gl.h> |
|---|
| 3 | #include <GL/nglx.h> |
|---|
| 4 | #include <microwin/nano-X.h> |
|---|
| 5 | #include "zgl.h" |
|---|
| 6 | |
|---|
| 7 | typedef struct { |
|---|
| 8 | GLContext *gl_context; |
|---|
| 9 | int xsize,ysize; |
|---|
| 10 | GR_DRAW_ID drawable; |
|---|
| 11 | GR_GC_ID gc; |
|---|
| 12 | int pixtype; /* pixel type in TinyGL */ |
|---|
| 13 | } TinyNGLXContext; |
|---|
| 14 | |
|---|
| 15 | NGLXContext nglXCreateContext(NGLXContext shareList, int flags) |
|---|
| 16 | { |
|---|
| 17 | TinyNGLXContext *ctx; |
|---|
| 18 | |
|---|
| 19 | if (shareList != NULL) { |
|---|
| 20 | gl_fatal_error("No sharing available in TinyGL"); |
|---|
| 21 | } |
|---|
| 22 | ctx=gl_malloc(sizeof(TinyNGLXContext)); |
|---|
| 23 | if (!ctx) |
|---|
| 24 | return NULL; |
|---|
| 25 | ctx->gl_context=NULL; |
|---|
| 26 | return (NGLXContext) ctx; |
|---|
| 27 | } |
|---|
| 28 | |
|---|
| 29 | void glXDestroyContext( NGLXContext ctx1 ) |
|---|
| 30 | { |
|---|
| 31 | TinyNGLXContext *ctx = (TinyNGLXContext *) ctx1; |
|---|
| 32 | if (ctx->gl_context != NULL) { |
|---|
| 33 | glClose(); |
|---|
| 34 | } |
|---|
| 35 | gl_free(ctx); |
|---|
| 36 | } |
|---|
| 37 | |
|---|
| 38 | |
|---|
| 39 | /* resize the glx viewport : we try to use the xsize and ysize |
|---|
| 40 | given. We return the effective size which is guaranted to be smaller */ |
|---|
| 41 | |
|---|
| 42 | static int glX_resize_viewport(GLContext *c,int *xsize_ptr,int *ysize_ptr) |
|---|
| 43 | { |
|---|
| 44 | TinyNGLXContext *ctx; |
|---|
| 45 | int xsize,ysize; |
|---|
| 46 | |
|---|
| 47 | ctx=(TinyNGLXContext *)c->opaque; |
|---|
| 48 | |
|---|
| 49 | xsize=*xsize_ptr; |
|---|
| 50 | ysize=*ysize_ptr; |
|---|
| 51 | |
|---|
| 52 | /* we ensure that xsize and ysize are multiples of 2 for the zbuffer. |
|---|
| 53 | TODO: find a better solution */ |
|---|
| 54 | xsize&=~3; |
|---|
| 55 | ysize&=~3; |
|---|
| 56 | |
|---|
| 57 | if (xsize == 0 || ysize == 0) return -1; |
|---|
| 58 | |
|---|
| 59 | *xsize_ptr=xsize; |
|---|
| 60 | *ysize_ptr=ysize; |
|---|
| 61 | |
|---|
| 62 | ctx->xsize=xsize; |
|---|
| 63 | ctx->ysize=ysize; |
|---|
| 64 | |
|---|
| 65 | /* resize the Z buffer */ |
|---|
| 66 | ZB_resize(c->zb,NULL,xsize,ysize); |
|---|
| 67 | return 0; |
|---|
| 68 | } |
|---|
| 69 | |
|---|
| 70 | /* we assume here that drawable is a window */ |
|---|
| 71 | int nglXMakeCurrent( NGLXDrawable drawable, |
|---|
| 72 | NGLXContext ctx1) |
|---|
| 73 | { |
|---|
| 74 | TinyNGLXContext *ctx = (TinyNGLXContext *) ctx1; |
|---|
| 75 | int mode, xsize, ysize; |
|---|
| 76 | ZBuffer *zb; |
|---|
| 77 | GR_WINDOW_INFO win_info; |
|---|
| 78 | |
|---|
| 79 | if (ctx->gl_context == NULL) { |
|---|
| 80 | /* create the TinyGL context */ |
|---|
| 81 | GrGetWindowInfo(drawable, &win_info); |
|---|
| 82 | |
|---|
| 83 | xsize = win_info.width; |
|---|
| 84 | ysize = win_info.height; |
|---|
| 85 | |
|---|
| 86 | /* currently, we only support 16 bit rendering */ |
|---|
| 87 | mode = ZB_MODE_5R6G5B; |
|---|
| 88 | zb=ZB_open(xsize,ysize,mode,0,NULL,NULL,NULL); |
|---|
| 89 | if (zb == NULL) { |
|---|
| 90 | fprintf(stderr, "Error while initializing Z buffer\n"); |
|---|
| 91 | exit(1); |
|---|
| 92 | } |
|---|
| 93 | |
|---|
| 94 | ctx->pixtype = MWPF_TRUECOLOR565; |
|---|
| 95 | |
|---|
| 96 | /* create a gc */ |
|---|
| 97 | ctx->gc = GrNewGC(); |
|---|
| 98 | |
|---|
| 99 | /* initialisation of the TinyGL interpreter */ |
|---|
| 100 | glInit(zb); |
|---|
| 101 | ctx->gl_context=gl_get_context(); |
|---|
| 102 | ctx->gl_context->opaque=(void *) ctx; |
|---|
| 103 | ctx->gl_context->gl_resize_viewport=glX_resize_viewport; |
|---|
| 104 | |
|---|
| 105 | /* set the viewport : we force a call to glX_resize_viewport */ |
|---|
| 106 | ctx->gl_context->viewport.xsize=-1; |
|---|
| 107 | ctx->gl_context->viewport.ysize=-1; |
|---|
| 108 | |
|---|
| 109 | glViewport(0, 0, xsize, ysize); |
|---|
| 110 | } |
|---|
| 111 | |
|---|
| 112 | return 1; |
|---|
| 113 | } |
|---|
| 114 | |
|---|
| 115 | void nglXSwapBuffers( NGLXDrawable drawable ) |
|---|
| 116 | { |
|---|
| 117 | GLContext *gl_context; |
|---|
| 118 | TinyNGLXContext *ctx; |
|---|
| 119 | |
|---|
| 120 | /* retrieve the current NGLXContext */ |
|---|
| 121 | gl_context=gl_get_context(); |
|---|
| 122 | ctx=(TinyNGLXContext *)gl_context->opaque; |
|---|
| 123 | |
|---|
| 124 | GrArea(drawable, ctx->gc, 0, 0, ctx->xsize, |
|---|
| 125 | ctx->ysize, ctx->gl_context->zb->pbuf, ctx->pixtype); |
|---|
| 126 | } |
|---|
| 127 | |
|---|
| 128 | |
|---|