version 2.8
nglx.c
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