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 | |
---|