diff options
author | Brian Paul <[email protected]> | 2002-06-10 15:16:44 +0000 |
---|---|---|
committer | Brian Paul <[email protected]> | 2002-06-10 15:16:44 +0000 |
commit | b58c5ad7b0a2c3ed3ecf189f284e23118091fa68 (patch) | |
tree | 65f0df21580a254758afe61094c51d436118ec54 /src/mesa/drivers/ggi/ggimesa.c | |
parent | dd41748f63b819c36c4234a525e5609660ceb395 (diff) |
GGI driver updates (Filip Spacek)
Diffstat (limited to 'src/mesa/drivers/ggi/ggimesa.c')
-rw-r--r-- | src/mesa/drivers/ggi/ggimesa.c | 741 |
1 files changed, 360 insertions, 381 deletions
diff --git a/src/mesa/drivers/ggi/ggimesa.c b/src/mesa/drivers/ggi/ggimesa.c index 2674fee3b15..a4621bb2889 100644 --- a/src/mesa/drivers/ggi/ggimesa.c +++ b/src/mesa/drivers/ggi/ggimesa.c @@ -1,6 +1,7 @@ /* GGI-Driver for MESA * * Copyright (C) 1997-1998 Uwe Maurer - [email protected] + * 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 @@ -33,23 +34,17 @@ #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; @@ -57,48 +52,52 @@ 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; @@ -107,48 +106,60 @@ static void gl_ggiSetClearColor(GLcontext *ctx, const GLchan color[4]) 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 @@ -160,18 +171,27 @@ static GLboolean gl_ggiSetDrawBuffer(GLcontext *ctx, GLenum mode) /* 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; } @@ -187,9 +207,11 @@ static const GLubyte * gl_ggiGetString(GLcontext *ctx, GLenum name) 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) @@ -197,7 +219,8 @@ 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"); } @@ -209,75 +232,95 @@ static void gl_ggiEnable(GLcontext *ctx, GLenum pname, GLboolean state) 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; @@ -300,17 +343,19 @@ int ggiMesaInit() _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) { @@ -323,254 +368,224 @@ int ggiMesaInit() 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 @@ -580,104 +595,68 @@ static void gl_ggiUpdateState(GLcontext *ctx, GLuint new_state) _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); -} |