-/* $Id: ggimesa.h,v 1.3 2000/02/09 19:03:28 brianp Exp $ */
+/* $Id: ggimesa.h,v 1.4 2002/06/10 15:16:44 brianp Exp $ */
/*
- * Mesa 3-D graphics library
- * Version: 3.3
+ * Mesa 3-D graphics library GGI bindings (GGIGL [giggle])
+ * Version: 4.0
* Copyright (C) 1995-2000 Brian Paul
* Copyright (C) 1998 Uwe Maurer
+ * Copyrigth (C) 2001 Filip Spacek
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
#ifndef GGIMESA_H
#define GGIMESA_H
-
-#define GGIMESA_MAJOR_VERSION 3
-#define GGIMESA_MINOR_VERSION 3
-
+#define GGIMESA_MAJOR_VERSION 4
+#define GGIMESA_MINOR_VERSION 0
#ifdef __cplusplus
extern "C" {
#endif
+#include <ggi/ggi.h>
#include "GL/gl.h"
+
+typedef struct ggi_mesa_context *ggi_mesa_context_t;
+/*
+ * Initialize Mesa GGI extension
+ */
+int ggiMesaInit(void);
+/*
+ * Clean up Mesa GGI exension
+ */
+int ggiMesaExit(void);
-typedef struct ggi_mesa_context *GGIMesaContext;
-
-#include <ggi/ggi.h>
-
-extern GGIMesaContext GGIMesaCreateContext(void);
+/*
+ * Attach Mesa GGI extension to the visual 'vis'
+ */
+int ggiMesaAttach(ggi_visual_t vis);
+/*
+ * Detach Mesa GGI extension from the visual 'vis'
+ */
+int ggiMesaDetach(ggi_visual_t vis);
-extern void GGIMesaDestroyContext(GGIMesaContext ctx);
+int ggiMesaExtendVisual(ggi_visual_t vis, GLboolean alpha_flag,
+ GLboolean stereo_flag, GLint depth_size,
+ GLint stencil_size, GLint accum_red_size,
+ GLint accum_green_size, GLint accum_blue_size,
+ GLint accum_alpha_size, GLint num_samples);
-extern void GGIMesaMakeCurrent(GGIMesaContext ctx);
+/*
+ * Create a new context capable of displaying on the visual vis.
+ */
+ggi_mesa_context_t ggiMesaCreateContext(ggi_visual_t vis);
+/*
+ * Destroy the context 'ctx'
+ */
+void ggiMesaDestroyContext(ggi_mesa_context_t ctx);
-extern GGIMesaContext GGIMesaGetCurrentContext(void);
+/*
+ * Make context 'ctx' the current context and bind it to visual 'vis'.
+ * Note that the context must have been created with respect to that visual.
+ */
+void ggiMesaMakeCurrent(ggi_mesa_context_t ctx, ggi_visual_t vis);
-extern void GGIMesaSwapBuffers(void);
+void ggiMesaSwapBuffers(void);
-extern int GGIMesaSetVisual(GGIMesaContext ctx, ggi_visual_t vis,
- GLboolean rgb_flag, GLboolean db_flag);
#ifdef __cplusplus
}
ggi_visual_t vis;
char text[100];
+int db_flag,vis_x, vis_y, vir_x, vir_y, gt;
/*
* Draw a gear wheel. You'll probably want to call this function when
static void draw( void )
{
+ static int n = 0;
glClearColor(0,0,0,0);
glClearIndex(0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
ggiPuts(vis,0,ggiGetInfo(vis)->mode->visible.y+16,text);
#endif
- GGIMesaSwapBuffers();
+ if(db_flag)
+ ggiMesaSwapBuffers();
count++;
if (count==limit) {
exit(1);
}
+ ++n;
+ /*
+ if (!(n%10)){
+ ggi_color rgb = { 10000, 10000, 10000 };
+ ggiSetSimpleMode(vis,vis_x+(n/10),vis_y+(n/10),db_flag?2:1, gt);
+ glViewport(0, 0,vis_x+(n/10),vis_y+(n/10));
+ ggiSetGCForeground(vis, ggiMapColor(vis, &rgb));
+ ggiDrawBox(vis, 20, 20, 100, 100);
+ if(db_flag)
+ ggiSetWriteFrame(vis, 1);
+ }
+ */
}
static void idle( void )
{
GLfloat h = (GLfloat) height / (GLfloat) width;
+ if(db_flag)
+ glDrawBuffer(GL_BACK);
+ else
+ glDrawBuffer(GL_FRONT);
glViewport(0, 0, (GLint)width, (GLint)height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
static void init( void )
{
static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0 };
- static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0 };
- static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0 };
+ static GLfloat red[4] = {0.9, 0.9, 0.9, 1.0 };
+ static GLfloat green[4] = {0.0, 0.8, 0.9, 1.0 };
static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0 };
glLightfv( GL_LIGHT0, GL_POSITION, pos );
int main( int argc, char *argv[] )
{
- GGIMesaContext ctx;
- int vis_x,vis_y,vir_x,vir_y,bpp,db_flag,gt;
+ ggi_mesa_context_t ctx;
ggi_mode mode;
+ int bpp;
limit=0;
exit(1);
}
- ctx=GGIMesaCreateContext();
- if (ctx==NULL)
+ if (ggiMesaInit() < 0)
{
- printf("GGIMesaCreateContext() failed\n");
+ printf("ggiMesaInit failed\n");
exit(1);
}
-
+
vis=ggiOpen(NULL);
if (vis==NULL)
{
exit(1);
}
- if (ggiSetGraphMode(vis,vis_x,vis_y,vir_x,vir_y,gt)<0)
+ if (ggiSetSimpleMode(vis,vis_x,vis_y,db_flag ? 2 : 1,gt)<0)
{
printf("%s: can't set graphmode (%i %i %i %i) %i BPP\n",
argv[0],vis_x,vis_y,vir_x,vir_y,bpp);
exit(1);
}
- if (GGIMesaSetVisual(ctx,vis,GL_TRUE,db_flag)<0)
+ if (ggiMesaAttach(vis) < 0)
+ {
+ printf("ggiMesaAttach failed\n");
+ exit(1);
+ }
+ if (ggiMesaExtendVisual(vis, GL_FALSE, GL_FALSE, 16,
+ 0, 0, 0, 0, 0, 1) < 0)
{
printf ("GGIMesaSetVisual() failed\n");
exit(1);
}
- GGIMesaMakeCurrent(ctx);
+ ctx = ggiMesaCreateContext(vis);
+ if (ctx==NULL)
+ {
+ printf("GGIMesaCreateContext() failed\n");
+ exit(1);
+ }
+
+ ggiMesaMakeCurrent(ctx, vis);
ggiGetMode(vis,&mode);
reshape(mode.visible.x,mode.visible.y);
init();
- while (!ggiKbhit(vis)) idle();
+ while (!ggiKbhit(vis)) { /*sleep(1);*/ idle(); }
- GGIMesaDestroyContext(ctx);
+ ggiMesaDestroyContext(ctx);
ggiClose(vis);
printf("%s\n",text);
gt = (rgb) ? __glut_gt_rgb : __glut_gt_index;
- __glut_ctx = GGIMesaCreateContext();
-
- if (__glut_ctx == NULL)
- ggiPanic("Can't create mesa-context\n");
-
__glut_vis = ggiOpen(NULL);
if (__glut_vis == NULL)
{
/* return GL_FALSE; */
}
- ggiGetMode(__glut_vis, &mode);
-
- if (GGIMesaSetVisual(__glut_ctx, __glut_vis, rgb, frames > 1) < 0)
+ if (ggiMesaExtendVisual(__glut_vis, GL_FALSE, GL_FALSE,
+ 16, 0, 0, 0, 0, 0, 1) < 0)
{
ggiPanic("GGIMesaSetVisual failed!\n");
}
+ __glut_ctx = ggiMesaCreateContext(__glut_vis);
+
+ if (__glut_ctx == NULL)
+ ggiPanic("Can't create mesa-context\n");
+
+ ggiGetMode(__glut_vis, &mode);
+
+
__glut_width = mode.visible.x;
__glut_height = mode.visible.y;
mousex = mode.visible.x / 2;
mousey = mode.visible.y / 2;
- GGIMesaMakeCurrent(__glut_ctx);
+ ggiMesaMakeCurrent(__glut_ctx, __glut_vis);
if (__glut_reshape)
__glut_reshape(__glut_width, __glut_height);
#include <ggi/mesa/ggimesa.h>
#include <ggi/mesa/ggimesa_int.h>
+#include <ggi/mesa/debug.h>
+#include "swrast/swrast.h"
#define RMASK ((1<<R)-1)
#define GMASK ((1<<G)-1)
#define GS (8-G)
#define BS (8-B)
+#define PACK(color) (((color[RCOMP]>>RS) << (G+B)) | \
+ ((color[GCOMP]>>GS) << B) | \
+ ((color[BCOMP]>>BS)))
+
+#define FLIP(coord) (LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y-(coord) - 1)
+
/**********************************************************************/
/***** Write spans of pixels *****/
/**********************************************************************/
-void GGIwrite_ci32_span(const GLcontext *ctx,
- GLuint n, GLint x, GLint y,
- const GLuint ci[],
- const GLubyte mask[])
+void GGIwrite_ci32_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLuint ci[], const GLubyte mask[])
{
- FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ FB_TYPE *fb;
+ fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+ FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
if (mask)
{
while (n--) {
- if (*mask++) *fb=*ci;
+ if (*mask++)
+ *fb = *ci;
fb++;
ci++;
}
}
}
-void GGIwrite_ci8_span(const GLcontext *ctx,
- GLuint n, GLint x, GLint y,
- const GLubyte ci[],
- const GLubyte mask[] )
+void GGIwrite_ci8_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLubyte ci[], const GLubyte mask[])
{
- FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ FB_TYPE *fb;
+ fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+ FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
if (mask)
{
while (n--) {
- if (*mask++) *fb=*ci;
+ if (*mask++)
+ *fb = *ci;
fb++;
ci++;
}
}
-void GGIwrite_rgba_span(const GLcontext *ctx,
- GLuint n, GLint x, GLint y,
- const GLubyte rgba[][4],
- const GLubyte mask[])
+void GGIwrite_rgba_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLchan rgba[][4], const GLubyte mask[])
{
- FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ FB_TYPE *fb;
+ fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+ FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
if (mask)
{
while (n--) {
- if (*mask++) {
- *fb= ((rgba[0][RCOMP]>>RS) << (G+B)) |
- ((rgba[0][GCOMP]>>GS) << B) |
- ((rgba[0][BCOMP]>>BS));
- }
+ if (*mask++)
+ *fb = PACK(rgba[0]);
fb++;
rgba++;
}
else
{
while (n--) {
- *fb++= ((rgba[0][RCOMP]>>RS) << (G+B)) |
- ((rgba[0][GCOMP]>>GS) << B)|
- ((rgba[0][BCOMP]>>BS));
+ *fb++ = PACK(rgba[0]);
rgba++;
}
}
}
-void GGIwrite_rgb_span( const GLcontext *ctx,
- GLuint n, GLint x, GLint y,
- const GLubyte rgba[][3],
- const GLubyte mask[] )
+void GGIwrite_rgb_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLchan rgba[][3], const GLubyte mask[])
{
- FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ FB_TYPE *fb;
+ fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+ FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
if (mask)
{
while (n--) {
- if (*mask++) {
- *fb= ((rgba[0][RCOMP]>>RS) << (G+B)) |
- ((rgba[0][GCOMP]>>GS) << B) |
- ((rgba[0][BCOMP]>>BS));
- }
+ if (*mask++)
+ *fb = PACK(rgba[0]);
fb++;
rgba++;
}
else
{
while (n--) {
- *fb++= ((rgba[0][RCOMP]>>RS) << (G+B)) |
- ((rgba[0][GCOMP]>>GS) << B) |
- ((rgba[0][BCOMP]>>BS));
+ *fb++ = PACK(rgba[0]);
rgba++;
}
}
}
-void GGIwrite_mono_span( const GLcontext *ctx,
- GLuint n, GLint x, GLint y,
- const GLubyte mask[])
+void GGIwrite_mono_rgba_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLchan color[4], const GLubyte mask[])
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
FB_TYPE *fb;
- FB_TYPE color;
+ fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+ FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
+ if (mask){
+ while (n--){
+ if (*mask++)
+ *fb = PACK(color);
+ ++fb;
+ }
+ }
+ else {
+ while (n--)
+ *fb++ = PACK(color);
- if (mask)
- {
- fb=LFB(FB_TYPE,x,FLIP(y));
- color=(FB_TYPE) GGICTX->color;
+ /* Alternatively we could write a potentialy faster HLine
+ ggiSetGCForeground(ggi_ctx->ggi_visual, color);
+ ggiDrawHLine(ggi_ctx->ggi_visual,x,FLIP(y),n);
+ */
+ }
+}
- while (n--)
- {
- if (*mask++) *fb=color;
- fb++;
+void GGIwrite_mono_ci_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLuint ci, const GLubyte mask[])
+{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ FB_TYPE *fb;
+ fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+ FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
+ if (mask){
+ while (n--){
+ if (*mask++)
+ *fb = ci;
+ ++fb;
}
}
- else
- {
- ggiDrawHLine(VIS,x,FLIP(y),n);
+ else {
+ while (n--)
+ *fb++ = ci;
+
+ /* Alternatively we could write a potentialy faster HLine
+ ggiSetGCForeground(ggi_ctx->ggi_visual, ci);
+ ggiDrawHLine(ggi_ctx->ggi_visual, x, FLIP(y), n);
+ */
}
}
void GGIread_ci32_span(const GLcontext *ctx,
- GLuint n, GLint x, GLint y, GLuint ci[])
+ GLuint n, GLint x, GLint y, GLuint ci[])
{
- FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ FB_TYPE *fb;
+ fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+ FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
while (n--)
- *ci++=(GLuint)*fb++;
+ *ci++ = (GLuint)*fb++;
}
void GGIread_rgba_span(const GLcontext *ctx,
- GLuint n, GLint x, GLint y,
- GLubyte rgba[][4])
+ GLuint n, GLint x, GLint y, GLchan rgba[][4])
{
- FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
FB_TYPE color;
-
+ FB_TYPE *fb;
+ fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+ FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
while (n--)
{
- color=*fb++;
+ color = *fb++;
rgba[0][RCOMP] = (GLubyte) (color>>(G+B))<<RS;
rgba[0][GCOMP] = (GLubyte) ((color>>B)& ((1<<G)-1))<<GS;
rgba[0][BCOMP] = (GLubyte) (color & ((1<<B)-1))<<BS;
- rgba[0][ACOMP] =0;
+ rgba[0][ACOMP] = 0;
rgba++;
}
}
/**********************************************************************/
void GGIwrite_ci32_pixels(const GLcontext *ctx,
- GLuint n, const GLint x[], const GLint y[],
- const GLuint ci[], const GLubyte mask[] )
+ GLuint n, const GLint x[], const GLint y[],
+ const GLuint ci[], const GLubyte mask[])
{
- FB_TYPE *fb=LFB(FB_TYPE,0,0);
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+ void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
while (n--) {
- if (*mask++) *(fb+ *x + FLIP(*y)*GGICTX->width)=*ci;
+ if (*mask++){
+ FB_TYPE *dst = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+ *dst = *ci;
+ }
ci++;
x++;
y++;
}
}
-void GGIwrite_mono_pixels(const GLcontext *ctx,
- GLuint n,
- const GLint x[], const GLint y[],
- const GLubyte mask[] )
+void GGIwrite_mono_ci_pixels(const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ GLuint ci, const GLubyte mask[])
{
- FB_TYPE *fb=LFB(FB_TYPE,0,0);
- FB_TYPE color=(FB_TYPE) GGICTX->color;
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+ void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
while (n--) {
- if (*mask++) *(fb+ *x + FLIP(*y)*GGICTX->width)=color;
+ if (*mask++){
+ FB_TYPE *dst = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+ *dst = ci;
+ }
x++;
y++;
}
}
void GGIwrite_rgba_pixels(const GLcontext *ctx,
- GLuint n, const GLint x[], const GLint y[],
- const GLubyte rgba[][4],
- const GLubyte mask[] )
+ GLuint n, const GLint x[], const GLint y[],
+ const GLchan rgba[][4], const GLubyte mask[])
{
- FB_TYPE *fb=LFB(FB_TYPE,0,0);
- FB_TYPE color;
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+ void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
while (n--) {
- if (*mask++) {
- color= ((rgba[0][RCOMP]>>RS) << (G+B)) |
- ((rgba[0][GCOMP]>>GS) << B) |
- ((rgba[0][BCOMP]>>BS));
- *(fb+ *x + FLIP(*y)*GGICTX->width)=color;
+ if (*mask++){
+ FB_TYPE *dst = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+ *dst = PACK(rgba[0]);
}
- x++;y++;
+ x++;
+ y++;
rgba++;
}
}
+void GGIwrite_mono_rgba_pixels(const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ const GLchan rgba[4], const GLubyte mask[])
+{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+ void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
+
+ while (n--) {
+ if (*mask++){
+ FB_TYPE *dst = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+ *dst = PACK(rgba);
+ }
+
+ x++;
+ y++;
+ }
+}
/**********************************************************************/
/***** Read arrays of pixels *****/
/**********************************************************************/
void GGIread_ci32_pixels(const GLcontext *ctx,
- GLuint n, const GLint x[], const GLint y[],
- GLuint ci[], const GLubyte mask[])
+ GLuint n, const GLint x[], const GLint y[],
+ GLuint ci[], const GLubyte mask[])
{
- FB_TYPE *fb=LFB(FB_TYPE,0,0);
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+ void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
while (n--) {
- if (*mask++)
- *ci=*(fb+ *x + FLIP(*y)*GGICTX->width);
+ if (*mask++){
+ FB_TYPE *src = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+ *ci = *src;
+ }
ci++;
x++;
y++;
}
void GGIread_rgba_pixels(const GLcontext *ctx,
- GLuint n, const GLint x[], const GLint y[],
- GLubyte rgba[][4],
- const GLubyte mask[] )
+ GLuint n, const GLint x[], const GLint y[],
+ GLubyte rgba[][4], const GLubyte mask[])
{
- FB_TYPE *fb=LFB(FB_TYPE,0,0);
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+ void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
FB_TYPE color;
while (n--)
{
if (*mask++)
- {
- color=*(fb+ *x + FLIP(*y)*GGICTX->width);
- rgba[0][RCOMP] =(GLubyte)(color>>(G+B))<<RS;
- rgba[0][GCOMP] =(GLubyte)((color>>B)& ((1<<G)-1))<<GS;
- rgba[0][BCOMP] =(GLubyte) (color & ((1<<B)-1))<<BS;
- rgba[0][ACOMP] =0;
+ {
+ FB_TYPE *src = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+ color = *src;
+
+ rgba[0][RCOMP] = (GLubyte)(color>>(G+B))<<RS;
+ rgba[0][GCOMP] = (GLubyte)((color>>B)& ((1<<G)-1))<<GS;
+ rgba[0][BCOMP] = (GLubyte) (color & ((1<<B)-1))<<BS;
+ rgba[0][ACOMP] = 0;
}
- x++; y++;
+ x++;
+ y++;
rgba++;
}
}
-int GGIsetup_driver(GGIMesaContext ggictx, struct ggi_mesa_info *info)
+void GGIset_read_buffer(GLcontext *ctx, GLframebuffer *buffer, GLenum mode)
{
- GLcontext *ctx = ggictx->gl_ctx;
-
- ctx->Driver.WriteRGBASpan = GGIwrite_rgba_span;
- ctx->Driver.WriteRGBSpan = GGIwrite_rgb_span;
-// ctx->Driver.WriteMonoRGBASpan = GGIwrite_mono_span;
- ctx->Driver.WriteRGBAPixels = GGIwrite_rgba_pixels;
-// ctx->Driver.WriteMonoRGBAPixels = GGIwrite_mono_pixels;
-
- ctx->Driver.WriteCI32Span = GGIwrite_ci32_span;
- ctx->Driver.WriteCI8Span = GGIwrite_ci8_span;
-// ctx->Driver.WriteMonoCISpan = GGIwrite_mono_span;
- ctx->Driver.WriteCI32Pixels = GGIwrite_ci32_pixels;
-// ctx->Driver.WriteMonoCIPixels = GGIwrite_mono_pixels;
-
- ctx->Driver.ReadCI32Span = GGIread_ci32_span;
- ctx->Driver.ReadRGBASpan = GGIread_rgba_span;
- ctx->Driver.ReadCI32Pixels = GGIread_ci32_pixels;
- ctx->Driver.ReadRGBAPixels = GGIread_rgba_pixels;
+}
- info->red_bits = R;
- info->green_bits =G;
- info->blue_bits = B;
+int GGIsetup_driver(ggi_mesa_context_t ggi_ctx)
+{
+ struct swrast_device_driver *swdd =
+ _swrast_GetDeviceDriverReference(ggi_ctx->gl_ctx);
+
+ GGIMESADPRINT_LIBS("linear_%d: GGIsetup_driver\n", sizeof(FB_TYPE)*8);
+
+ swdd->WriteRGBASpan = GGIwrite_rgba_span;
+ swdd->WriteRGBSpan = GGIwrite_rgb_span;
+ swdd->WriteMonoRGBASpan = GGIwrite_mono_rgba_span;
+ swdd->WriteRGBAPixels = GGIwrite_rgba_pixels;
+ swdd->WriteMonoRGBAPixels = GGIwrite_mono_rgba_pixels;
+
+ swdd->WriteCI32Span = GGIwrite_ci32_span;
+ swdd->WriteCI8Span = GGIwrite_ci8_span;
+ swdd->WriteMonoCISpan = GGIwrite_mono_ci_span;
+ swdd->WriteCI32Pixels = GGIwrite_ci32_pixels;
+ swdd->WriteMonoCIPixels = GGIwrite_mono_ci_pixels;
+
+ swdd->ReadCI32Span = GGIread_ci32_span;
+ swdd->ReadRGBASpan = GGIread_rgba_span;
+ swdd->ReadCI32Pixels = GGIread_ci32_pixels;
+ swdd->ReadRGBAPixels = GGIread_rgba_pixels;
+
+ swdd->SetReadBuffer = GGIset_read_buffer;
return 0;
}
static int GGIopen(ggi_visual_t vis,struct ggi_dlhandle *dlh,
- const char *args,void *argptr, uint32 *dlret)
-{
- LIBGGI_MESAEXT(vis)->setup_driver=GGIsetup_driver;
+ const char *args,void *argptr, uint32 *dlret)
+{
+ GGIMESADPRINT_CORE("linear_%d: GGIOpen\n", sizeof(FB_TYPE)*8);
+ LIBGGI_MESAEXT(vis)->setup_driver = GGIsetup_driver;
*dlret = GGI_DL_OPDRAW;
return 0;
int DLOPENFUNC(int func, void **funcptr)
{
switch (func) {
- case GGIFUNC_open:
- *funcptr = GGIopen;
- return 0;
- case GGIFUNC_exit:
- case GGIFUNC_close:
- *funcptr = NULL;
- return 0;
- default:
- *funcptr = NULL;
+ case GGIFUNC_open:
+ *funcptr = GGIopen;
+ return 0;
+ case GGIFUNC_exit:
+ case GGIFUNC_close:
+ *funcptr = NULL;
+ return 0;
+ default:
+ *funcptr = NULL;
}
return GGI_ENOTFOUND;
}
#include <ggi/internal/ggi-dl.h>
#include <ggi/mesa/ggimesa_int.h>
+#include <ggi/mesa/debug.h>
#include "mmath.h"
#include "swrast/swrast.h"
-#include "swrast_setup/swrast_setup.h"
-#include "swrast/s_context.h"
-#include "swrast/s_depth.h"
-#include "swrast/s_triangle.h"
+//#include "swrast_setup/swrast_setup.h"
+//#include "swrast/s_context.h"
+//#include "swrast/s_depth.h"
+//#include "swrast/s_triangle.h"
+
+#define FLIP(coord) (LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y-(coord)-1)
/**********************************************************************/
/***** Write spans of pixels *****/
const GLuint ci[],
const GLubyte mask[] )
{
- y=FLIP(y);
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ y = FLIP(y);
if (mask)
{
while (n--) {
- if (*mask++) ggiPutPixel(VIS,x,y,*ci);
+ if (*mask++)
+ ggiPutPixel(ggi_ctx->ggi_visual, x, y, *ci);
x++;
ci++;
}
}
else
{
- while (n--) ggiPutPixel(VIS,x++,y,*ci++);
+ while (n--)
+ ggiPutPixel(ggi_ctx->ggi_visual, x++, y, *ci++);
}
}
const GLubyte ci[],
const GLubyte mask[] )
{
- y=FLIP(y);
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ y = FLIP(y);
if (mask)
{
while (n--) {
- if (*mask++) ggiPutPixel(VIS,x,y,*ci);
+ if (*mask++)
+ ggiPutPixel(ggi_ctx->ggi_visual, x, y, *ci);
x++;
ci++;
}
}
else
{
- while (n--) ggiPutPixel(VIS,x++,y,*ci++);
+ while (n--)
+ ggiPutPixel(ggi_ctx->ggi_visual, x++, y, *ci++);
}
}
-void GGIwrite_mono_span( const GLcontext *ctx,
- GLuint n, GLint x, GLint y,
- const GLubyte mask[] )
+void GGIwrite_mono_ci_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLuint ci, const GLubyte mask[])
{
- y=FLIP(y);
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ y = FLIP(y);
if (mask)
{
while (n--) {
- if (*mask++) ggiDrawPixel(VIS,x,y);
+ if (*mask++)
+ ggiPutPixel(ggi_ctx->ggi_visual, x, y, ci);
x++;
}
}
else
{
- ggiDrawHLine(VIS,x,y,n);
+ while (n--)
+ ggiPutPixel(ggi_ctx->ggi_visual, x++, y, ci);
+ }
+}
+
+void GGIwrite_mono_rgba_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+ const GLchan rgba[4], const GLubyte mask[])
+{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ ggi_color rgb;
+ ggi_pixel col;
+
+ y = FLIP(y);
+
+ rgb.r = (uint16)(rgba[RCOMP]) << SHIFT;
+ rgb.g = (uint16)(rgba[GCOMP]) << SHIFT;
+ rgb.b = (uint16)(rgba[BCOMP]) << SHIFT;
+ col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+
+ if (mask)
+ {
+ while (n--) {
+ if (*mask++)
+ ggiPutPixel(ggi_ctx->ggi_visual, x, y, col);
+ x++;
+ }
+ }
+ else
+ {
+ ggiDrawHLine(ggi_ctx->ggi_visual, x, y, n);
}
}
const GLubyte rgba[][4],
const GLubyte mask[])
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
ggi_color rgb;
ggi_pixel col;
- y=FLIP(y);
+ y = FLIP(y);
if (mask)
{
while (n--) {
if (*mask++)
{
- rgb.r=(uint16)(rgba[0][RCOMP]) << SHIFT;
- rgb.g=(uint16)(rgba[0][GCOMP]) << SHIFT;
- rgb.b=(uint16)(rgba[0][BCOMP]) << SHIFT;
- col=ggiMapColor(VIS,&rgb);
- ggiPutPixel(VIS,x,y,col);
+ rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;
+ rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;
+ rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;
+ col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+ ggiPutPixel(ggi_ctx->ggi_visual, x, y, col);
}
x++;
rgba++;
{
while (n--)
{
- rgb.r=(uint16)(rgba[0][RCOMP]) << SHIFT;
- rgb.g=(uint16)(rgba[0][GCOMP]) << SHIFT;
- rgb.b=(uint16)(rgba[0][BCOMP]) << SHIFT;
- col=ggiMapColor(VIS,&rgb);
- ggiPutPixel(VIS,x++,y,col);
+ rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;
+ rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;
+ rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;
+ col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+ ggiPutPixel(ggi_ctx->ggi_visual, x++, y, col);
rgba++;
}
}
}
+
void GGIwrite_rgb_span( const GLcontext *ctx,
GLuint n, GLint x, GLint y,
const GLubyte rgba[][3],
const GLubyte mask[] )
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
ggi_color rgb;
ggi_pixel col;
- y=FLIP(y);
+ y = FLIP(y);
if (mask)
{
while (n--) {
if (*mask++)
{
- rgb.r=(uint16)(rgba[0][RCOMP]) << SHIFT;
- rgb.g=(uint16)(rgba[0][GCOMP]) << SHIFT;
- rgb.b=(uint16)(rgba[0][BCOMP]) << SHIFT;
- col=ggiMapColor(VIS,&rgb);
- ggiPutPixel(VIS,x,y,col);
+ rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;
+ rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;
+ rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;
+ col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+ ggiPutPixel(ggi_ctx->ggi_visual, x, y, col);
}
x++;
rgba++;
{
while (n--)
{
- rgb.r=(uint16)(rgba[0][RCOMP]) << SHIFT;
- rgb.g=(uint16)(rgba[0][GCOMP]) << SHIFT;
- rgb.b=(uint16)(rgba[0][BCOMP]) << SHIFT;
- col=ggiMapColor(VIS,&rgb);
- ggiPutPixel(VIS,x++,y,col);
+ rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;
+ rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;
+ rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;
+ col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+ ggiPutPixel(ggi_ctx->ggi_visual, x++, y, col);
rgba++;
}
}
void GGIread_ci32_span( const GLcontext *ctx,
GLuint n, GLint x, GLint y, GLuint ci[])
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
y = FLIP(y);
while (n--)
- ggiGetPixel(VIS, x++, y,ci++);
+ ggiGetPixel(ggi_ctx->ggi_visual, x++, y, ci++);
}
void GGIread_rgba_span( const GLcontext *ctx,
GLuint n, GLint x, GLint y,
GLubyte rgba[][4])
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
ggi_color rgb;
ggi_pixel col;
- y=FLIP(y);
+ y = FLIP(y);
while (n--)
{
- ggiGetPixel(VIS,x++,y,&col);
- ggiUnmapPixel(VIS,col,&rgb);
+ ggiGetPixel(ggi_ctx->ggi_visual, x++, y, &col);
+ ggiUnmapPixel(ggi_ctx->ggi_visual, col, &rgb);
rgba[0][RCOMP] = (GLubyte) (rgb.r >> SHIFT);
rgba[0][GCOMP] = (GLubyte) (rgb.g >> SHIFT);
rgba[0][BCOMP] = (GLubyte) (rgb.b >> SHIFT);
GLuint n, const GLint x[], const GLint y[],
const GLuint ci[], const GLubyte mask[] )
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
while (n--) {
- if (*mask++) ggiPutPixel(VIS,*x, FLIP(*y),*ci);
+ if (*mask++)
+ ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), *ci);
ci++;
x++;
y++;
}
}
-void GGIwrite_mono_pixels( const GLcontext *ctx,
- GLuint n,
- const GLint x[], const GLint y[],
- const GLubyte mask[] )
+void GGIwrite_mono_ci_pixels(const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ GLuint ci, const GLubyte mask[])
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
while (n--) {
- if (*mask++) ggiDrawPixel(VIS,*x,FLIP(*y));
+ if (*mask++)
+ ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), ci);
x++;
y++;
}
const GLubyte rgba[][4],
const GLubyte mask[] )
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
ggi_pixel col;
ggi_color rgb;
while (n--) {
if (*mask++) {
- rgb.r=(uint16)(rgba[0][RCOMP]) << SHIFT;
- rgb.g=(uint16)(rgba[0][GCOMP]) << SHIFT;
- rgb.b=(uint16)(rgba[0][BCOMP]) << SHIFT;
- col=ggiMapColor(VIS,&rgb);
- ggiPutPixel(VIS,*x,FLIP(*y),col);
+ rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;
+ rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;
+ rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;
+ col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+ ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), col);
}
- x++;y++;
+ x++;
+ y++;
rgba++;
}
}
+void GGIwrite_mono_rgba_pixels(const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ const GLchan rgba[4], const GLubyte mask[])
+{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ ggi_color rgb;
+ ggi_pixel col;
+
+ rgb.r = (uint16)(rgba[RCOMP]) << SHIFT;
+ rgb.g = (uint16)(rgba[GCOMP]) << SHIFT;
+ rgb.b = (uint16)(rgba[BCOMP]) << SHIFT;
+ col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+
+ while (n--) {
+ if (*mask++)
+ ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), col);
+ x++;
+ y++;
+ }
+}
/**********************************************************************/
/***** Read arrays of pixels *****/
GLuint n, const GLint x[], const GLint y[],
GLuint ci[], const GLubyte mask[])
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
while (n--) {
if (*mask++)
- ggiGetPixel(VIS, *x, FLIP(*y) ,ci);
+ ggiGetPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), ci);
ci++;
x++;
y++;
GLubyte rgba[][4],
const GLubyte mask[] )
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
ggi_color rgb;
ggi_pixel col;
{
if (*mask++)
{
- ggiGetPixel(VIS,*x,FLIP(*y),&col);
- ggiUnmapPixel(VIS,col,&rgb);
- rgba[0][RCOMP]= rgb.r >> SHIFT;
- rgba[0][GCOMP]= rgb.g >> SHIFT;
- rgba[0][BCOMP]= rgb.b >> SHIFT;
- rgba[0][ACOMP]=0;
+ ggiGetPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), &col);
+ ggiUnmapPixel(ggi_ctx->ggi_visual, col, &rgb);
+ rgba[0][RCOMP] = rgb.r >> SHIFT;
+ rgba[0][GCOMP] = rgb.g >> SHIFT;
+ rgba[0][BCOMP] = rgb.b >> SHIFT;
+ rgba[0][ACOMP] = 0;
}
- x++; y++;
+ x++;
+ y++;
rgba++;
}
}
-
-static swrast_tri_func ggimesa_stubs_get_triangle_func(GLcontext *ctx);
-
-int GGIsetup_driver(GGIMesaContext ggictx, struct ggi_mesa_info *info)
+int GGIextend_visual(ggi_visual_t vis)
{
- GLcontext *ctx = ggictx->gl_ctx;
+ return 0;
+}
- ctx->Driver.WriteRGBASpan = GGIwrite_rgba_span;
- ctx->Driver.WriteRGBSpan = GGIwrite_rgb_span;
- ctx->Driver.WriteRGBAPixels = GGIwrite_rgba_pixels;
+//static swrast_tri_func ggimesa_stubs_get_triangle_func(GLcontext *ctx);
- ctx->Driver.WriteCI32Span = GGIwrite_ci32_span;
- ctx->Driver.WriteCI8Span = GGIwrite_ci8_span;
- ctx->Driver.WriteCI32Pixels = GGIwrite_ci32_pixels;
+int GGIsetup_driver(ggi_mesa_context_t ggi_ctx)
+{
+ struct swrast_device_driver *swdd =
+ _swrast_GetDeviceDriverReference(ggi_ctx->gl_ctx);
- ctx->Driver.ReadCI32Span = GGIread_ci32_span;
- ctx->Driver.ReadRGBASpan = GGIread_rgba_span;
- ctx->Driver.ReadCI32Pixels = GGIread_ci32_pixels;
- ctx->Driver.ReadRGBAPixels = GGIread_rgba_pixels;
+ GGIMESADPRINT_CORE("stubs: setup_driver\n");
+
+ swdd->WriteRGBASpan = GGIwrite_rgba_span;
+ swdd->WriteRGBSpan = GGIwrite_rgb_span;
+ swdd->WriteMonoRGBASpan = GGIwrite_mono_rgba_span;
+ swdd->WriteRGBAPixels = GGIwrite_rgba_pixels;
+ swdd->WriteMonoRGBAPixels = GGIwrite_mono_rgba_pixels;
+
+ swdd->WriteCI32Span = GGIwrite_ci32_span;
+ swdd->WriteCI8Span = GGIwrite_ci8_span;
+ swdd->WriteMonoCISpan = GGIwrite_mono_ci_span;
+ swdd->WriteCI32Pixels = GGIwrite_ci32_pixels;
+ swdd->WriteMonoCIPixels = GGIwrite_mono_ci_pixels;
+
+ swdd->ReadCI32Span = GGIread_ci32_span;
+ swdd->ReadRGBASpan = GGIread_rgba_span;
+ swdd->ReadCI32Pixels = GGIread_ci32_pixels;
+ swdd->ReadRGBAPixels = GGIread_rgba_pixels;
return 0;
}
-void GGIupdate_state(GLcontext *ctx)
+void GGIupdate_state(ggi_mesa_context_t *ctx)
{
- ctx->Driver.TriangleFunc = _swsetup_Triangle;
+ //ctx->Driver.TriangleFunc = _swsetup_Triangle;
}
-
+/*
void GGItriangle_flat(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1, const SWvertex *v2)
{
//#define INTERP_Z 1
return GGItriangle_flat;
}
-
+*/
static int GGIopen(ggi_visual_t vis, struct ggi_dlhandle *dlh,
const char *args, void *argptr, uint32 *dlret)
-{
+{
LIBGGI_MESAEXT(vis)->update_state = GGIupdate_state;
LIBGGI_MESAEXT(vis)->setup_driver = GGIsetup_driver;
int MesaGGIdl_stubs(int func, void **funcptr)
{
switch (func) {
- case GGIFUNC_open:
- *funcptr = GGIopen;
- return 0;
- case GGIFUNC_exit:
- case GGIFUNC_close:
- *funcptr = NULL;
- return 0;
- default:
- *funcptr = NULL;
+ case GGIFUNC_open:
+ *funcptr = GGIopen;
+ return 0;
+ case GGIFUNC_exit:
+ case GGIFUNC_close:
+ *funcptr = NULL;
+ return 0;
+ default:
+ *funcptr = NULL;
}
return GGI_ENOTFOUND;
}
/* GGI-Driver for MESA
*
* Copyright (C) 1997-1998 Uwe Maurer - uwe_maurer@t-online.de
+ * 2002 Filip Spacek
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
#include "swrast/swrast.h"
#include "swrast_setup/swrast_setup.h"
#include "tnl/tnl.h"
-
-#undef VIS
-#undef FLIP
-#define VIS (GGIMesa->ggi_vis)
-#define FLIP(y) (GGIMesa->flip_y-(y))
-
-GGIMesaContext GGIMesa = NULL; /* the current context */
+#include "tnl/t_context.h"
+#include "tnl/t_pipeline.h"
+#include "array_cache/acache.h"
+#include "texformat.h"
+#include "texstore.h"
ggi_extid ggiMesaID = -1;
static int _ggimesaLibIsUp = 0;
static void *_ggimesaConfigHandle;
-/* FIXME: These should really be defined in the make system using -Dxxx */
-#define GGIMESACONFFILE "/usr/local/etc/ggi/ggimesa.conf"
-#define GGIMESATAGLEN 0
-static char ggimesaconfstub[512] = GGIMESACONFFILE;
-static char *ggimesaconffile = ggimesaconfstub + GGIMESATAGLEN;
+static char ggimesaconffile[] = GGIMESACONFFILE;
int _ggimesaDebugSync = 0;
uint32 _ggimesaDebugState = 0;
static void gl_ggiUpdateState(GLcontext *ctx, GLuint new_state);
static int changed(ggi_visual_t vis, int whatchanged);
-static void gl_ggiGetSize(GLcontext *ctx, GLuint *width, GLuint *height)
+
+static int _ggi_error(void)
{
- GGIMESADPRINT_CORE("gl_ggiGetSize() called\n");
+ GGIMESADPRINT_CORE("_ggi_error() called\n");
- *width = GGIMesa->width;
- *height = GGIMesa->height;
+ return -1;
}
-static void gl_ggiSetIndex(GLcontext *ctx, GLuint ci)
+static void gl_ggiGetSize(GLframebuffer *fb, GLuint *width, GLuint *height)
{
- GGIMESADPRINT_CORE("gl_ggiSetIndex() called\n");
+ /* FIXME: this is a hack to work around the new interface */
+ GLcontext *ctx;
+ ggi_mesa_context_t ggi_ctx;
+ ctx = _mesa_get_current_context();
+ ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+
+ GGIMESADPRINT_CORE("gl_ggiGetSize() called\n");
- ggiSetGCForeground(VIS, ci);
- GGICTX->color = (ggi_pixel)ci;
+ *width = LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.x;
+ *height = LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y;
+ printf("returning %d, %d\n", *width, *height);
}
-static void gl_ggiSetClearIndex(GLcontext *ctx, GLuint ci)
+static void gl_ggiSetIndex(GLcontext *ctx, GLuint ci)
{
- GGIMESADPRINT_CORE("gl_ggiSetClearIndex() called\n");
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+
+ GGIMESADPRINT_CORE("gl_ggiSetIndex() called\n");
- ggiSetGCForeground(VIS, ci);
- GGICTX->clearcolor = (ggi_pixel)ci;
+ ggiSetGCForeground(ggi_ctx->ggi_visual, ci);
+ ggi_ctx->color = (ggi_pixel)ci;
}
-static void gl_ggiSetColor(GLcontext *ctx, GLubyte red, GLubyte green,
- GLubyte blue, GLubyte alpha)
-{
- ggi_color rgb;
- ggi_pixel col;
+static void gl_ggiSetClearIndex(GLcontext *ctx, GLuint ci)
+{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
- GGIMESADPRINT_CORE("gl_ggiSetColor() called\n");
+ GGIMESADPRINT_CORE("gl_ggiSetClearIndex() called\n");
- rgb.r = (uint16)red << SHIFT;
- rgb.g = (uint16)green << SHIFT;
- rgb.b = (uint16)blue << SHIFT;
- col = ggiMapColor(VIS, &rgb);
- ggiSetGCForeground(VIS, col);
- GGICTX->color = col;
+ ggiSetGCForeground(ggi_ctx->ggi_visual, ci);
+ ggi_ctx->clearcolor = (ggi_pixel)ci;
}
static void gl_ggiSetClearColor(GLcontext *ctx, const GLchan color[4])
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
ggi_color rgb;
ggi_pixel col;
rgb.r = (uint16)color[0] << SHIFT;
rgb.g = (uint16)color[1] << SHIFT;
rgb.b = (uint16)color[2] << SHIFT;
- col = ggiMapColor(VIS, &rgb);
- ggiSetGCForeground(VIS, col);
- GGICTX->clearcolor = col;
+ col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+ ggiSetGCForeground(ggi_ctx->ggi_visual, col);
+ ggi_ctx->clearcolor = col;
}
-static GLbitfield gl_ggiClear(GLcontext *ctx,GLbitfield mask, GLboolean all,
- GLint x, GLint y, GLint width, GLint height)
+static void gl_ggiClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
+ GLint x, GLint y, GLint width, GLint height)
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+
GGIMESADPRINT_CORE("gl_ggiClear() called\n");
- if (mask & GL_COLOR_BUFFER_BIT)
+ if (mask & (DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT))
{
- ggiSetGCForeground(VIS, GGICTX->clearcolor);
+ ggiSetGCForeground(ggi_ctx->ggi_visual, ggi_ctx->clearcolor);
if (all)
{
- ggiDrawBox(VIS, 0, GGIMesa->origin.y,
- GGIMesa->width, GGIMesa->height);
+ int w, h;
+ w = LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.x;
+ h = LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y;
+ ggiDrawBox(ggi_ctx->ggi_visual, 0, 0, w, h);
}
else
{
- ggiDrawBox(VIS, x, FLIP(y), width, height);
+ ggiDrawBox(ggi_ctx->ggi_visual, x, y, //FLIP(y),
+ width, height);
}
+ ggiSetGCForeground(ggi_ctx->ggi_visual, ggi_ctx->color);
- ggiSetGCForeground(VIS, GGICTX->color);
+ mask &= ~(DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT);
}
- return mask & (~GL_COLOR_BUFFER_BIT);
+ _swrast_Clear(ctx, mask, all, x, y, width, height);
+
}
/* Set the buffer used for drawing */
static GLboolean gl_ggiSetDrawBuffer(GLcontext *ctx, GLenum mode)
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+
+ printf("set draw %d\n", mode);
GGIMESADPRINT_CORE("gl_ggiSetDrawBuffer() called\n");
if (mode == GL_FRONT_LEFT)
{
- GGICTX->active_buffer = 1;
+ ggiSetWriteFrame(ggi_ctx->ggi_visual,
+ ggiGetDisplayFrame(ggi_ctx->ggi_visual));
return GL_TRUE;
}
else if (mode == GL_BACK_LEFT)
{
- GGICTX->active_buffer = 0;
+ ggiSetWriteFrame(ggi_ctx->ggi_visual,
+ ggiGetDisplayFrame(ggi_ctx->ggi_visual)?0 : 1);
return GL_TRUE;
}
else
/* Set the buffer used for reading */
/* XXX support for separate read/draw buffers hasn't been tested */
-static void gl_ggiSetReadBuffer(GLcontext *ctx, GLframebuffer *buffer, GLenum mode)
+static GLboolean gl_ggiSetReadBuffer(GLcontext *ctx, GLframebuffer *buffer, GLenum mode)
{
- GGIMESADPRINT_CORE("gl_ggiSetReadBuffer() called\n");
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+ printf("set read %d\n", mode);
+ GGIMESADPRINT_CORE("gl_ggiSetReadBuffer() called\n");
+
if (mode == GL_FRONT_LEFT)
{
- GGICTX->active_buffer = 1;
+ ggiSetReadFrame(ggi_ctx->ggi_visual,
+ ggiGetDisplayFrame(ggi_ctx->ggi_visual));
+ return GL_TRUE;
}
else if (mode == GL_BACK_LEFT)
{
- GGICTX->active_buffer = 0;
+ ggiSetReadFrame(ggi_ctx->ggi_visual,
+ ggiGetDisplayFrame(ggi_ctx->ggi_visual)?0 : 1);
+ return GL_TRUE;
}
+ else
+ return GL_FALSE;
}
static void gl_ggiFlush(GLcontext *ctx)
{
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+
GGIMESADPRINT_CORE("gl_ggiFlush() called\n");
- ggiFlush(VIS);
+ ggiFlush(ggi_ctx->ggi_visual);
}
static void gl_ggiIndexMask(GLcontext *ctx, GLuint mask)
GGIMESADPRINT_CORE("gl_ggiIndexMask() called\n");
}
-static void gl_ggiColorMask(GLcontext *ctx, GLboolean rmask, GLboolean gmask, GLboolean bmask, GLboolean amask)
+static void gl_ggiColorMask(GLcontext *ctx, GLboolean rmask, GLboolean gmask,
+ GLboolean bmask, GLboolean amask)
{
GGIMESADPRINT_CORE("gl_ggiColorMask() called\n");
}
static void gl_ggiSetupPointers(GLcontext *ctx)
{
+ TNLcontext *tnl;
+
GGIMESADPRINT_CORE("gl_ggiSetupPointers() called\n");
-
- /* Initialize all the pointers in the DD struct. Do this whenever */
- /* a new context is made current or we change buffers via set_buffer! */
+ /* General information */
ctx->Driver.GetString = gl_ggiGetString;
- ctx->Driver.UpdateState = gl_ggiUpdateState;
-
+ ctx->Driver.GetBufferSize = gl_ggiGetSize;
+ ctx->Driver.Finish = gl_ggiFlush;
+ ctx->Driver.Flush = gl_ggiFlush;
+
+ /* Software rasterizer pixel paths */
+ ctx->Driver.Accum = _swrast_Accum;
+ ctx->Driver.Bitmap = _swrast_Bitmap;
+ ctx->Driver.Clear = gl_ggiClear;
+ ctx->Driver.ResizeBuffers = _swrast_alloc_buffers;
+ ctx->Driver.CopyPixels = _swrast_CopyPixels;
+ ctx->Driver.DrawPixels = _swrast_DrawPixels;
+ ctx->Driver.ReadPixels = _swrast_ReadPixels;
+
+ /* Software texturing */
+ ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format;
+ ctx->Driver.TexImage1D = _mesa_store_teximage1d;
+ ctx->Driver.TexImage2D = _mesa_store_teximage2d;
+ ctx->Driver.TexImage3D = _mesa_store_teximage3d;
+ ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d;
+ ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d;
+ ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d;
+ ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage;
+
+ ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d;
+ ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d;
+ ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d;
+ ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d;
+ ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d;
+
+ ctx->Driver.BaseCompressedTexFormat = _mesa_base_compressed_texformat;
+ ctx->Driver.CompressedTextureSize = _mesa_compressed_texture_size;
+ ctx->Driver.GetCompressedTexImage = _mesa_get_compressed_teximage;
+
+ /* Imaging extensions */
+ ctx->Driver.CopyColorTable = _swrast_CopyColorTable;
+ ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable;
+ ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D;
+ ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D;
+
+ /* State change callbacks */
+ ctx->Driver.SetDrawBuffer = gl_ggiSetDrawBuffer;
ctx->Driver.ClearIndex = gl_ggiSetClearIndex;
ctx->Driver.ClearColor = gl_ggiSetClearColor;
-// ctx->Driver.Clear = gl_ggiClear;
ctx->Driver.IndexMask = gl_ggiIndexMask;
ctx->Driver.ColorMask = gl_ggiColorMask;
ctx->Driver.Enable = gl_ggiEnable;
- ctx->Driver.SetDrawBuffer = gl_ggiSetDrawBuffer;
- ctx->Driver.SetReadBuffer = gl_ggiSetReadBuffer;
-
- ctx->Driver.GetBufferSize = gl_ggiGetSize;
-
- ctx->Driver.Finish = gl_ggiFlush;
- ctx->Driver.Flush = gl_ggiFlush;
+ ctx->Driver.UpdateState = gl_ggiUpdateState;
- ctx->Driver.RenderStart = 0;
- ctx->Driver.RenderFinish = _swrast_flush;
-
- ctx->Driver.PointsFunc = _swsetup_Points;
- ctx->Driver.LineFunc = _swsetup_Line;
- ctx->Driver.TriangleFunc = _swsetup_Triangle;
- ctx->Driver.QuadFunc = _swsetup_Quad;
+ /* Initialize TNL driver interface */
+ tnl = TNL_CONTEXT(ctx);
+ tnl->Driver.RunPipeline = _tnl_run_pipeline;
+ /* Install setup for tnl */
+ _swsetup_Wakeup(ctx);
}
-static int gl_ggiInitInfo(GGIMesaContext ctx, struct ggi_mesa_info *info)
+static void get_mode_info(ggi_visual_t vis, int *r, int *g, int *b,
+ GLboolean *rgb, GLboolean *db, int *ci)
{
- ggi_mode mode;
-
- GGIMESADPRINT_CORE("gl_ggiInitInfo() called\n");
-
- ggiGetMode(ctx->ggi_vis, &mode);
+ int i;
- info->depth_bits = DEFAULT_SOFTWARE_DEPTH_BITS;
- info->stencil_bits = STENCIL_BITS;
- info->accum_bits = ACCUM_BITS;
-
- if (info->rgb_flag)
- {
- info->rgb_flag = GL_TRUE;
- info->alpha_flag = GL_FALSE;
- info->index_bits = 0;
-
- info->red_bits = 8;
- info->green_bits = 8;
- info->blue_bits = 8;
-
- info->alpha_bits = 0;
+ *r = 0;
+ *g = 0;
+ *b = 0;
+
+ for(i = 0; i < sizeof(ggi_pixel)*8; ++i){
+ int mask = 1 << i;
+ if(LIBGGI_PIXFMT(vis)->red_mask & mask)
+ ++(*r);
+ if(LIBGGI_PIXFMT(vis)->green_mask & mask)
+ ++(*g);
+ if(LIBGGI_PIXFMT(vis)->blue_mask & mask)
+ ++(*b);
}
- else
- {
- info->alpha_flag = GL_FALSE;
- info->index_bits = GT_SIZE(mode.graphtype);
- info->red_bits = info->green_bits =
- info->blue_bits = info->alpha_bits = 0;
- }
-
- return 0;
-}
+ *rgb = GT_SCHEME(LIBGGI_MODE(vis)->graphtype) == GT_TRUECOLOR;
+ *db = LIBGGI_MODE(vis)->frames > 1;
+ *ci = GT_SIZE(LIBGGI_MODE(vis)->graphtype);
+ printf("rgb (%d, %d, %d) db %d, rgb %d ci %d\n",*r,*g,*b,*db,*rgb,*ci);
+}
+
int ggiMesaInit()
{
int err;
_ggimesaLibIsUp++;
if (_ggimesaLibIsUp > 1)
- return 0; /* Initialize only at first call */
+ return 0; /* Initialize only at first call */
err = ggLoadConfig(ggimesaconffile, &_ggimesaConfigHandle);
if (err != GGI_OK)
{
- GGIMESADPRINT_CORE("GGIMesa: Couldn't open %s\n", ggimesaconffile);
+ GGIMESADPRINT_CORE("GGIMesa: Couldn't open %s\n",
+ ggimesaconffile);
_ggimesaLibIsUp--;
return err;
}
- ggiMesaID = ggiExtensionRegister("GGIMesa", sizeof(struct mesa_ext), changed);
+ ggiMesaID = ggiExtensionRegister("GGIMesa",
+ sizeof(struct ggi_mesa_ext), changed);
if (ggiMesaID < 0)
{
return 0;
}
-
-GGIMesaContext GGIMesaCreateContext(void)
+int ggiMesaExit(void)
{
- GGIMesaContext ctx;
- char *str;
-
- GGIMESADPRINT_CORE("ggiMesaCreateContext() called\n");
+ int rc;
+
+ GGIMESADPRINT_CORE("ggiMesaExit() called\n");
- if (ggiMesaInit() < 0) /* register extensions*/
+ if (!_ggimesaLibIsUp)
+ return -1;
+
+ if (_ggimesaLibIsUp > 1)
{
- return NULL;
+ /* Exit only at last call */
+ _ggimesaLibIsUp--;
+ return 0;
}
-
- ctx = (GGIMesaContext)calloc(1, sizeof(struct ggi_mesa_context));
- if (!ctx)
- return NULL;
-
- ctx->gl_vis = (GLvisual *)calloc(1, sizeof(GLvisual));
- if (!ctx->gl_vis)
- return NULL;
-
- ctx->viewport_init = GL_FALSE;
-// ctx->gl_vis->DBflag = GL_FALSE;
-
- ctx->gl_ctx = _mesa_create_context(ctx->gl_vis, NULL, (void *)ctx, GL_TRUE);
- if (!ctx->gl_ctx)
- return NULL;
- _mesa_enable_sw_extensions(ctx->gl_ctx);
+ rc = ggiExtensionUnregister(ggiMesaID);
+ ggFreeConfig(_ggimesaConfigHandle);
- _swrast_CreateContext(ctx->gl_ctx);
- _swsetup_CreateContext(ctx->gl_ctx);
- _tnl_CreateContext(ctx->gl_ctx);
+ _ggimesaLibIsUp = 0;
- return ctx;
+ return rc;
}
-void GGIMesaDestroyContext(GGIMesaContext ctx)
+int ggiMesaAttach(ggi_visual_t vis)
{
- GGIMESADPRINT_CORE("ggiMesaDestroyContext() called\n");
+ int rc;
+
+ GGIMESADPRINT_CORE("ggiMesaAttach() called\n");
- if (ctx)
+ rc = ggiExtensionAttach(vis, ggiMesaID);
+ if (rc == 0)
{
- _mesa_destroy_visual(ctx->gl_vis);
- _mesa_destroy_context(ctx->gl_ctx);
- _mesa_destroy_framebuffer(ctx->gl_buffer);
- if (ctx == GGIMesa)
- GGIMesa = NULL;
- if (ctx->ggi_vis)
- ggiExtensionDetach(ctx->ggi_vis, ggiMesaID);
- ggiExtensionUnregister(ggiMesaID);
- free(ctx);
+ int r, g, b, ci;
+ GLboolean rgb, db;
+ GLvisual *gl_visual;
+ GLframebuffer *gl_fb;
+
+ /* We are creating the primary instance */
+ memset(LIBGGI_MESAEXT(vis), 0, sizeof(struct ggi_mesa_ext));
+ LIBGGI_MESAEXT(vis)->update_state = (void *)_ggi_error;
+ LIBGGI_MESAEXT(vis)->setup_driver = (void *)_ggi_error;
+
+ /* Initialize default mesa visual */
+ get_mode_info(vis, &r, &g, &b, &rgb, &db, &ci);
+ gl_visual = &(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual);
+ _mesa_initialize_visual(gl_visual,
+ rgb, db, 0 /* No stereo */,
+ r, g, b, 0 /* No alpha */, ci,
+ 0 /* No depth */, 0 /* No stencil */,
+ 0, 0, 0, 0 /* No accum */, 0);
+
+ /* Now fake an "API change" so the right libs get loaded */
+ changed(vis, GGI_CHG_APILIST);
}
+
+ return rc;
}
-int GGIMesaSetVisual(GGIMesaContext ctx, ggi_visual_t vis,
- GLboolean rgb_flag, GLboolean db_flag)
+int ggiMesaDetach(ggi_visual_t vis)
+{
+ GGIMESADPRINT_CORE("ggiMesaDetach() called\n");
+
+ return ggiExtensionDetach(vis, ggiMesaID);
+}
+
+int ggiMesaExtendVisual(ggi_visual_t vis, GLboolean alpha_flag,
+ GLboolean stereo_flag, GLint depth_size,
+ GLint stencil_size, GLint accum_red_size,
+ GLint accum_green_size, GLint accum_blue_size,
+ GLint accum_alpha_size, GLint num_samples)
{
- struct ggi_mesa_info info;
+ GLvisual *gl_vis = &(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual);
+ int r, g, b, ci;
+ GLboolean db, rgb;
+
+ get_mode_info(vis, &r, &g, &b, &rgb, &db, &ci);
+
+ /* Initialize the visual with the provided information */
+ _mesa_initialize_visual(&(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual),
+ rgb, db, stereo_flag,
+ r, g, b, 0 /* FIXME */, ci,
+ depth_size, stencil_size,
+ accum_red_size, accum_green_size,
+ accum_blue_size, accum_alpha_size, 0);
+
+ /* Now fake an "API change" so the right libs get loaded. After all,
+ extending the visual by all these new buffers could be considered
+ a "mode change" which requires an "API change".
+ */
+ changed(vis, GGI_CHG_APILIST);
+
+ return 0;
+}
+
+
+ggi_mesa_context_t ggiMesaCreateContext(ggi_visual_t vis)
+{
+ ggi_mesa_context_t ctx;
int err;
- uint16 r,g,b;
ggi_color pal[256];
int i;
- void *func;
- ggi_mode mode;
- int num_buf;
- GGIMESADPRINT_CORE("ggiMesaSetVisual() called\n");
+ GGIMESADPRINT_CORE("ggiMesaCreateContext() called\n");
- if (!ctx) return -1;
- if (!vis) return -1;
+ ctx = (ggi_mesa_context_t)malloc(sizeof(struct ggi_mesa_context));
+ if (!ctx)
+ return NULL;
- if (ctx->ggi_vis)
- ggiExtensionDetach(ctx->ggi_vis, ggiMesaID);
-
- ctx->ggi_vis=vis;
+ ctx->ggi_visual = vis;
+ ctx->color = 0;
- err = ggiExtensionAttach(vis, ggiMesaID);
- if (err < 0)
- return -1;
- if (err == 0)
- changed(vis, GGI_CHG_APILIST);
+ ctx->gl_ctx =
+ _mesa_create_context(&(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual),
+ NULL, (void *)ctx, GL_TRUE);
+ if (!ctx->gl_ctx)
+ goto free_context;
+
+ _mesa_enable_sw_extensions(ctx->gl_ctx);
+
+ _swrast_CreateContext(ctx->gl_ctx);
+ _ac_CreateContext(ctx->gl_ctx);
+ _tnl_CreateContext(ctx->gl_ctx);
+ _swsetup_CreateContext(ctx->gl_ctx);
- if (ctx->gl_vis)
- _mesa_destroy_visual(ctx->gl_vis);
-
- if (ctx->gl_buffer)
- _mesa_destroy_framebuffer(ctx->gl_buffer);
-
- info.rgb_flag = rgb_flag;
- info.db_flag = db_flag;
-
- err = gl_ggiInitInfo(ctx, &info);
- if (err)
- return -1;
-
gl_ggiSetupPointers(ctx->gl_ctx);
- func = (void *)LIBGGI_MESAEXT(ctx->ggi_vis)->setup_driver;
-
- if (!func)
- {
+ /* Make sure that an appropriate sublib has been loaded */
+ if (!LIBGGI_MESAEXT(ctx->ggi_visual)->setup_driver){
GGIMESADPRINT_CORE("setup_driver==NULL!\n");
GGIMESADPRINT_CORE("Please check your config files!\n");
- return -1;
+ goto free_context;
}
- err = LIBGGI_MESAEXT(ctx->ggi_vis)->setup_driver(ctx, &info);
- if (err)
- return -1;
-
- ctx->gl_vis = _mesa_create_visual(info.rgb_flag,
- info.db_flag,
- GL_FALSE, /*stereo*/
- info.red_bits, info.green_bits,
- info.blue_bits, info.alpha_bits,
- info.index_bits,
- info.depth_bits,
- info.stencil_bits,
- info.accum_bits,
- info.accum_bits,
- info.accum_bits,
- info.accum_bits,
- 1);
- if (!ctx->gl_vis)
- {
- GGIMESADPRINT_CORE("Can't create gl_visual!\n");
- return -1;
- }
-
- ctx->gl_buffer = _mesa_create_framebuffer(ctx->gl_vis,
-// ctx->gl_vis->DepthBits > 0,
-// ctx->gl_vis->StencilBits > 0,
-// ctx->gl_vis->AccumRedBits > 0,
-// ctx->gl_vis->AlphaBits > 0);
- info.depth_bits > 0,
- info.stencil_bits > 0,
- info.accum_bits > 0,
- info.alpha_bits > 0);
-
-
- if (!ctx->gl_buffer)
- {
- GGIMESADPRINT_CORE("Can't create gl_buffer!\n");
- return -1;
+ /* Set up the sublib driver */
+ err = LIBGGI_MESAEXT(ctx->ggi_visual)->setup_driver(ctx);
+ if (err){
+ GGIMESADPRINT_CORE("setup_driver failed (err = %d)", err);
+ goto free_gl_context;
}
-
- ggiGetMode(ctx->ggi_vis, &mode);
- ctx->width = mode.visible.x;
- ctx->height = mode.visible.y;
- ctx->stride = mode.virt.x;
- ctx->origin.x = 0;
- ctx->origin.y = 0;
- ctx->flip_y = ctx->origin.y + ctx->height - 1;
- ctx->color = 0;
-
- ctx->lfb[0] = ctx->lfb[1] = NULL;
- num_buf = ggiDBGetNumBuffers(ctx->ggi_vis);
-
- for (i = 0; i < num_buf; i++)
- {
- if (ggiDBGetBuffer(ctx->ggi_vis,i)->layout == blPixelLinearBuffer)
- {
- ctx->stride = ggiDBGetBuffer(ctx->ggi_vis, i)->buffer.plb.stride /
- (ggiDBGetBuffer(ctx->ggi_vis, i)->buffer.plb.pixelformat->size / 8);
- ctx->lfb[0] = ggiDBGetBuffer(ctx->ggi_vis, i)->write;
- }
- }
-
- if (ctx->lfb[0] == NULL)
- {
- GGIMESADPRINT_CORE("No linear frame buffer!\n");
- return -1;
- }
+ _mesa_read_config_file(ctx->gl_ctx);
+
+ return ctx;
- /* FIXME: Use separate buffers */
- ctx->lfb[1] = malloc(ctx->stride * ctx->height);
- ctx->bufsize = (ctx->stride * ctx->height);
+free_gl_context:
+ _mesa_destroy_context(ctx->gl_ctx);
+free_context:
+ free(ctx);
- ctx->gl_ctx->Visual = *ctx->gl_vis;
- ctx->gl_ctx->Pixel.ReadBuffer =
- ctx->gl_ctx->Color.DrawBuffer = (db_flag) ? GL_BACK : GL_FRONT;
-
- if (GGIMesa == ctx)
- _mesa_make_current(ctx->gl_ctx, ctx->gl_buffer);
+ return NULL;
+}
- if (rgb_flag && mode.graphtype==GT_8BIT)
- {
- for (i = r = 0; r < 8; r++)
- for (g = 0; g < 8; g++)
- for (b = 0; b < 4; b++, i++)
- {
- pal[i].r = r << (GGI_COLOR_PRECISION - 3);
- pal[i].g = g << (GGI_COLOR_PRECISION - 3);
- pal[i].b = b << (GGI_COLOR_PRECISION - 2);
- }
- ggiSetPalette(ctx->ggi_vis, 0, 256, pal);
- }
+void ggiMesaDestroyContext(ggi_mesa_context_t ctx)
+{
+ GGIMESADPRINT_CORE("ggiMesaDestroyContext() called\n");
+
+ if(!ctx)
+ return;
- return 0;
+ _mesa_destroy_context(ctx->gl_ctx);
+ free(ctx);
}
-void GGIMesaMakeCurrent(GGIMesaContext ctx)
+void ggiMesaMakeCurrent(ggi_mesa_context_t ctx, ggi_visual_t vis)
{
GGIMESADPRINT_CORE("ggiMesaMakeCurrent(ctx = %p) called\n", ctx);
+
+ /* FIXME: clean up where are ggi_vis */
+ if (ctx->ggi_visual != vis) {
+ GGIMESADPRINT_CORE("Cannot migrate GL contexts\n");
+ return;
+ }
- if (!ctx->ggi_vis)
- return;
-
- GGIMesa = ctx;
- _mesa_make_current(ctx->gl_ctx, ctx->gl_buffer);
+ _mesa_make_current(ctx->gl_ctx, &LIBGGI_MESAEXT(vis)->mesa_buffer);
- if (!ctx->viewport_init)
+ if (ctx->gl_ctx->Viewport.Width == 0)
{
- _mesa_set_viewport(ctx->gl_ctx, 0, 0, ctx->width, ctx->height);
- ctx->viewport_init = GL_TRUE;
+ _mesa_Viewport(0, 0,
+ LIBGGI_MODE(vis)->visible.x,
+ LIBGGI_MODE(vis)->visible.y);
+ ctx->gl_ctx->Scissor.Width = LIBGGI_MODE(vis)->visible.x;
+ ctx->gl_ctx->Scissor.Height = LIBGGI_MODE(vis)->visible.y;
}
}
-GGIMesaContext GGIMesaGetCurrentContext(void)
-{
- GGIMESADPRINT_CORE("ggiMesaGetCurrentContext() called\n");
-
- return GGIMesa;
-}
-
/*
* Swap front/back buffers for current context if double buffered.
*/
-void GGIMesaSwapBuffers(void)
+void ggiMesaSwapBuffers(void)
{
- GGIMESADPRINT_CORE("ggiMesaSwapBuffers() called\n");
+ GLcontext *ctx;
+ ggi_mesa_context_t ggi_ctx;
+ ctx = _mesa_get_current_context();
+ ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
- _mesa_swapbuffers( GGIMesa->gl_ctx );
- gl_ggiFlush(GGIMesa->gl_ctx);
+ GGIMESADPRINT_CORE("ggiMesaSwapBuffers() called\n");
-// if (GGIMesa->gl_vis->DBflag)
-// {
- memcpy(GGIMesa->lfb[0], GGIMesa->lfb[1], GGIMesa->bufsize);
-// }
+ _mesa_swapbuffers(ctx);
+ gl_ggiFlush(ctx);
+
+ ggiSetDisplayFrame(ggi_ctx->ggi_visual,
+ !ggiGetDisplayFrame(ggi_ctx->ggi_visual));
+ ggiSetWriteFrame(ggi_ctx->ggi_visual,
+ !ggiGetWriteFrame(ggi_ctx->ggi_visual));
+ ggiSetReadFrame(ggi_ctx->ggi_visual,
+ !ggiGetReadFrame(ggi_ctx->ggi_visual));
+
+ GGIMESADPRINT_CORE("swap disp: %d, write %d\n",
+ ggiGetDisplayFrame(ggi_ctx->ggi_visual),
+ ggiGetWriteFrame(ggi_ctx->ggi_visual));
}
static void gl_ggiUpdateState(GLcontext *ctx, GLuint new_state)
{
- void *func;
-
+ ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+
GGIMESADPRINT_CORE("gl_ggiUpdateState() called\n");
/* Propogate statechange information to swrast and swrast_setup
_swsetup_InvalidateState(ctx, new_state);
_tnl_InvalidateState(ctx, new_state);
- func = (void *)CTX_OPMESA(ctx)->update_state;
-
- if (!func) {
+ if (!LIBGGI_MESAEXT(ggi_ctx->ggi_visual)->update_state) {
GGIMESADPRINT_CORE("update_state == NULL!\n");
GGIMESADPRINT_CORE("Please check your config files!\n");
ggiPanic("");
}
- CTX_OPMESA(ctx)->update_state(ctx);
+ LIBGGI_MESAEXT(ggi_ctx->ggi_visual)->update_state(ggi_ctx);
}
static int changed(ggi_visual_t vis, int whatchanged)
{
+ GLcontext *ctx;
+ ctx = _mesa_get_current_context();
+
GGIMESADPRINT_CORE("changed() called\n");
switch (whatchanged)
{
- case GGI_CHG_APILIST:
+ case GGI_CHG_APILIST:
+ {
+ char api[256];
+ char args[256];
+ int i;
+ const char *fname;
+ ggi_dlhandle *lib;
+ GLvisual *gl_vis=&(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual);
+ GLframebuffer *gl_fb = &(LIBGGI_MESAEXT(vis)->mesa_buffer);
+
+ /* Initialize the framebuffer to provide all necessary
+ buffers in software. The target libraries that are loaded
+ next are free to modify this according to their
+ capabilities.
+ */
+ /* FIXME: if the target changes capabilities we'll leak
+ swrast's memory !!! Need to deallocate first */
+ _mesa_initialize_framebuffer(gl_fb, gl_vis,
+ gl_vis->depthBits > 0,
+ gl_vis->stencilBits > 0,
+ gl_vis->accumRedBits > 0,
+ gl_vis->alphaBits > 0);
+
+ for (i = 0; ggiGetAPI(vis, i, api, args) == 0; i++)
{
- char api[256];
- char args[256];
- int i;
- const char *fname;
- ggi_dlhandle *lib;
-
- for (i = 0; ggiGetAPI(vis, i, api, args) == 0; i++)
+ strcat(api, "-mesa");
+ fname = ggMatchConfig(_ggimesaConfigHandle, api, NULL);
+ if (fname == NULL)
{
- strcat(api, "-mesa");
- fname = ggMatchConfig(_ggimesaConfigHandle, api, NULL);
- if (fname == NULL)
- {
- /* No special implementation for this sublib */
- continue;
- }
- lib = ggiExtensionLoadDL(vis, fname, args, NULL, GGI_SYMNAME_PREFIX);
+ /* No special implementation for this sublib */
+ continue;
}
- }
- break;
- }
- return 0;
-}
-
-
-int ggiMesaExit(void)
-{
- int rc;
-
- GGIMESADPRINT_CORE("ggiMesaExit() called\n");
-
- if (!_ggimesaLibIsUp)
- return -1;
-
- if (_ggimesaLibIsUp > 1)
- {
- /* Exit only at last call */
- _ggimesaLibIsUp--;
- return 0;
- }
-
- rc = ggiExtensionUnregister(ggiMesaID);
- ggFreeConfig(_ggimesaConfigHandle);
-
- _ggimesaLibIsUp = 0;
-
- return rc;
-}
-
-static int _ggi_error(void)
-{
- GGIMESADPRINT_CORE("_ggi_error() called\n");
-
- return -1;
-}
+ lib = ggiExtensionLoadDL(vis, fname, args, NULL,
+ GGI_SYMNAME_PREFIX);
+ }
-int ggiMesaAttach(ggi_visual_t vis)
-{
- int rc;
-
- GGIMESADPRINT_CORE("ggiMesaAttach() called\n");
-
- rc = ggiExtensionAttach(vis, ggiMesaID);
- if (rc == 0)
- {
- /* We are creating the primary instance */
- memset(LIBGGI_MESAEXT(vis), 0, sizeof(mesaext));
- LIBGGI_MESAEXT(vis)->update_state = (void *)_ggi_error;
- LIBGGI_MESAEXT(vis)->setup_driver = (void *)_ggi_error;
+ /* The targets have cleared everything they can do from
+ the framebuffer structure so we provide the rest in sw
+ */
+ _swrast_alloc_buffers(gl_fb);
- /* Now fake an "API change" so the right libs get loaded */
- changed(vis, GGI_CHG_APILIST);
+ break;
+ }
}
-
- return rc;
+ return 0;
}
-int ggiMesaDetach(ggi_visual_t vis)
-{
- GGIMESADPRINT_CORE("ggiMesaDetach() called\n");
-
- return ggiExtensionDetach(vis, ggiMesaID);
-}
#include <ggi/ggi.h>
#include "GL/ggimesa.h"
-struct ggi_mesa_info;
+/*
+ * GGIMesa visual configuration.
+ *
+ * This structure "derives" from Mesa's GLvisual and extends it by
+ * GGI's visual. Combination of these two structures is enough to fully
+ * describe the mode the application is currently running in. GGI
+ * visual provides information about color configuration and buffering
+ * method, GLvisual fills the rest.
+ */
+struct ggi_mesa_visual {
+ GLvisual gl_visual;
+ ggi_visual_t ggi_visual;
+};
+/*
+ * GGIMesa context.
+ *
+ * GGIMesa context expands the Mesa's context (it doesn't actualy derive
+ * from it, but this ability isn't needed, and it is best if GL context
+ * creation is left up to Mesa). It also contains a reference to the GGI
+ * visual it is attached to, which is very useful for all Mesa callbacks.
+ */
struct ggi_mesa_context
{
GLcontext *gl_ctx;
- GLvisual *gl_vis;
- GLframebuffer *gl_buffer;
+ ggi_visual_t ggi_visual;
- ggi_visual_t ggi_vis;
- ggi_coord origin;
- int flip_y;
- int width, height, stride; /* Stride is in pixels */
ggi_pixel color; /* Current color or index*/
ggi_pixel clearcolor;
- void *lfb[2]; /* Linear frame buffers */
- int active_buffer;
- int bufsize;
- int viewport_init;
-};
-
-struct ggi_mesa_info
-{
- GLboolean rgb_flag;
- GLboolean db_flag;
- GLboolean alpha_flag;
- GLint index_bits;
- GLint red_bits, green_bits, blue_bits, alpha_bits;
- GLint depth_bits, stencil_bits, accum_bits;
+
+ void *private;
};
-extern GGIMesaContext GGIMesa; /* The current context */
-
#define SHIFT (GGI_COLOR_PRECISION - 8)
-#define GGICTX ((GGIMesaContext)ctx->DriverCtx)
-#define VIS (GGICTX->ggi_vis)
-#define FLIP(y) (GGICTX->flip_y-(y))
-
-#define LFB(type,x,y) ((type *)GGICTX->lfb[0] + (x) + (y) * GGICTX->stride)
-
-#define CTX_OPMESA(ctx) \
-((struct mesa_ext *)LIBGGI_EXT(((GGIMesaContext)ctx->DriverCtx)->ggi_vis, \
- ggiMesaID))
-
-
#endif
ggifunc_setmode GGIMesa_setmode;
ggifunc_getapi GGIMesa_getapi;
-typedef struct mesa_ext
+typedef struct ggi_mesa_ext
{
- void (*update_state)(GLcontext *ctx);
- int (*setup_driver)(GGIMesaContext ctx, struct ggi_mesa_info *info);
+ /*
+ * How mesa extends this visual; i.e., size of the depth buffer etc.
+ *
+ * By default (upon attaching) this structure is initialized to what
+ * libggi is guaranteed to handle without any help: single buffered
+ * visual without any ancilary buffers.
+ */
+ struct ggi_mesa_visual mesa_visual;
+
+ /*
+ * Mesa framebuffer is a collection of all ancilary buffers required.
+ *
+ * This structure contains the ancilary buffers provided in in
+ * software. On each mode change it is loaded with the list of
+ * required buffers and the target is expected to clear the ones
+ * it can provide in hw. The remaining ones are then provided in sw.
+ *
+ */
+ GLframebuffer mesa_buffer;
+
+ void (*update_state)(ggi_mesa_context_t ctx);
+ int (*setup_driver)(ggi_mesa_context_t ctx);
+
void *private;
-} mesaext;
+} ggi_mesa_ext_t;
-#define LIBGGI_MESAEXT(vis) ((mesaext *)LIBGGI_EXT(vis,ggiMesaID))
+#define LIBGGI_MESAEXT(vis) ((ggi_mesa_ext_t *)LIBGGI_EXT(vis,ggiMesaID))
#define GGIMESA_PRIVATE(vis) ((LIBGGI_MESAEXT(vis)->private))
#endif /* _GGI_MISC_INT_H */