static int do_setmode(ggi_visual *vis) { struct fbdev_priv_mesa *priv = GGIMESA_PRIV(vis); int err, id; char libname[GGI_API_MAXLEN], libargs[GGI_API_MAXLEN]; ggi_graphtype gt; _ggiZapMode(vis, ~GGI_DL_OPDISPLAY); priv->have_accel = 0; for (id = 1; GGIMesa_fbdev_getapi(vis, id, libname, libargs) == 0; id++) { if (_ggiOpenDL(vis, libname, libargs, NULL) == 0) { GGIMESADPRINT_LIBS(stderr, "display-fbdev-mesa: Error opening the " "%s (%s) library.\n", libname, libargs); return GGI_EFATAL; } GGIMESADPRINT_CORE("Success in loading %s (%s)\n", libname, libargs); } if (priv->oldpriv->accel && _ggiOpenDL(vis, priv->accel, NULL, NULL) != 0) { priv->have_accel = 1; } else { priv->have_accel = 0; } vis->accelactive = 0; ggiIndicateChange(vis, GGI_CHG_APILIST); GGIMESADPRINT_CORE("display-fbdev-mesa: do_setmode SUCCESS\n"); return 0; }
int GGI_palemu_setmode(struct ggi_visual *vis, ggi_mode *mode) { ggi_palemu_priv *priv = PALEMU_PRIV(vis); int err; DPRINT_MODE("display-palemu: setmode %dx%d#%dx%dF%d[0x%02x]\n", mode->visible.x, mode->visible.y, mode->virt.x, mode->virt.y, mode->frames, mode->graphtype); MANSYNC_ignore(vis); if ((err = ggiCheckMode(vis->instance.stem, mode)) != 0) { return err; } _ggiZapMode(vis, 0); *LIBGGI_MODE(vis) = *mode; priv->parent_mode.visible = mode->visible; priv->parent_mode.virt = mode->virt; priv->parent_mode.dpp = mode->dpp; priv->parent_mode.size = mode->size; priv->parent_mode.frames = 1; if ((err = do_setmode(vis)) != 0) { DPRINT_MODE("display-palemu: setmode failed (%d).\n", err); return err; } priv->squish.x = mode->visible.x / target_width; priv->squish.y = mode->visible.y / target_height; DPRINT_MODE("display-palemu: Attempting to setmode on parent " "visual...\n"); if (priv->target == PALEMU_TARGET) { err = _ggi_palemu_Open(vis); } else { err = _ggi_monotext_Open(vis); } if (err != 0) { return err; } /* Initialize palette */ ggiSetColorfulPalette(vis->instance.stem); MANSYNC_SETFLAGS(vis, LIBGGI_FLAGS(vis)); MANSYNC_cont(vis); DPRINT_MODE("display-palemu: setmode succeeded.\n"); return 0; }
int GGI_vcsa_setmode(struct ggi_visual *vis, ggi_mode *mode) { char libname[GGI_MAX_APILEN], libargs[GGI_MAX_APILEN]; int err, id; if ((err = ggiCheckMode(vis->instance.stem, mode)) != 0) { return err; } DPRINT_MODE("display-vcsa: setmode %dx%d#%dx%dF%d[0x%02x]\n", mode->visible.x, mode->visible.y, mode->virt.x, mode->virt.y, mode->frames, mode->graphtype); memcpy(LIBGGI_MODE(vis), mode, sizeof(ggi_mode)); _ggiZapMode(vis, 0); /* load API libraries */ for (id=1; GGI_vcsa_getapi(vis, id, libname, libargs) == 0; id++) { err = _ggiOpenDL(vis, libggi->config, libname, libargs, NULL); if (err) { fprintf(stderr,"display-vcsa: Error opening the " "%s (%s) library.\n", libname, libargs); return GGI_EFATAL; } DPRINT_LIBS("Success in loading %s (%s)\n", libname, libargs); } /* setup drawing primitives */ vis->opdraw->putpixel_nc = GGI_vcsa_putpixel_nc; vis->opdraw->getpixel_nc = GGI_vcsa_getpixel_nc; vis->opdraw->putc = GGI_vcsa_putc; vis->opdraw->puts = GGI_vcsa_puts; vis->opdraw->getcharsize = GGI_vcsa_getcharsize; vis->opdraw->drawhline_nc = GGI_vcsa_drawhline_nc; vis->opdraw->puthline = GGI_vcsa_puthline; vis->opdraw->gethline = GGI_vcsa_gethline; vis->opcolor->mapcolor = GGI_vcsa_mapcolor; vis->opcolor->unmappixel = GGI_vcsa_unmappixel; /* indicate API change */ ggiIndicateChange(vis->instance.stem, GGI_CHG_APILIST); DPRINT_MODE("display-vcsa: setmode Success.\n"); return 0; }
int GGI_trueemu_setmode(struct ggi_visual *vis, ggi_mode *mode) { ggi_trueemu_priv *priv = TRUEEMU_PRIV(vis); int err; DPRINT_MODE("display-trueemu: setmode %dx%d#%dx%dF%d[0x%02x]\n", mode->visible.x, mode->visible.y, mode->virt.x, mode->virt.y, mode->frames, mode->graphtype); MANSYNC_ignore(vis); if ((err = ggiCheckMode(vis->instance.stem, mode)) != 0) { return err; } _ggiZapMode(vis, 0); *LIBGGI_MODE(vis) = *mode; priv->mode.visible = mode->visible; priv->mode.virt = mode->virt; priv->mode.dpp = mode->dpp; priv->mode.size = mode->size; priv->mode.frames = 1; if ((err = do_setmode(vis)) != 0) { DPRINT_MODE("display-trueemu: setmode failed (%d).\n", err); return err; } DPRINT_MODE("display-trueemu: Attempting to setmode on parent " "visual...\n"); if ((err = _ggi_trueemu_Open(vis)) != 0) { return err; } MANSYNC_SETFLAGS(vis, LIBGGI_FLAGS(vis)); MANSYNC_cont(vis); DPRINT_MODE("display-trueemu: setmode succeeded.\n"); return 0; }
static int do_setmode(struct ggi_visual *vis) { char libname[GGI_MAX_APILEN], libargs[GGI_MAX_APILEN]; ggi_graphtype gt; int err, id; err = do_mmap(vis); if (err) return err; _ggiZapMode(vis, 0); for (id=1; GGI_lcd823_getapi(vis, id, libname, libargs) == 0; id++) { if (_ggiOpenDL(vis, libggi->config, libname, libargs, NULL) != 0) { fprintf(stderr,"display-lcd823: Error opening the " "%s (%s) library.\n", libname, libargs); return GGI_EFATAL; } DPRINT_LIBS("Success in loading %s (%s)\n", libname, libargs); } /* Set up palette */ gt = LIBGGI_GT(vis); if ((GT_SCHEME(gt) == GT_PALETTE) || (GT_SCHEME(gt) == GT_TEXT)) { int nocols = 1 << GT_DEPTH(gt); LIBGGI_PAL(vis)->clut.size = nocols; LIBGGI_PAL(vis)->clut.data = _ggi_malloc(nocols * sizeof(ggi_color)); LIBGGI_PAL(vis)->priv = _ggi_malloc(256 * sizeof(uint16_t)); LIBGGI_PAL(vis)->setPalette = GGI_lcd823_setPalette; LIBGGI_PAL(vis)->getPrivSize = GGI_lcd823_getPrivSize; /* Initialize palette */ ggiSetColorfulPalette(vis); } ggiIndicateChange(vis, GGI_CHG_APILIST); DPRINT_MODE("display-lcd823: do_setmode SUCCESS\n"); return 0; }
int GGI_vgl_setmode(ggi_visual *vis, ggi_mode *tm) { struct vgl_priv *priv = VGL_PRIV(vis); ggi_graphtype gt = tm->graphtype; video_info_t modeinfo; unsigned long modenum = 0; char sugname[GGI_MAX_APILEN]; char args[GGI_MAX_APILEN]; int err = 0; int id, i; int pixelBytes; err = GGI_vgl_checkmode(vis, tm); if (err) return err; /* reset the modeinfo structure as expected by query_mode */ memset(&modeinfo, 0, sizeof(modeinfo)); switch(gt) { case GT_1BIT : modeinfo.vi_depth = 1; pixelBytes = 1; break; case GT_4BIT : modeinfo.vi_depth = 4; pixelBytes = 1; break; case GT_8BIT : modeinfo.vi_depth = 8; pixelBytes = 1; break; case GT_16BIT: modeinfo.vi_depth = 16; pixelBytes = 2; break; case GT_32BIT: modeinfo.vi_depth = 32; pixelBytes = 4; break; /* Unsupported mode depths */ case GT_15BIT: case GT_24BIT: default: return GGI_ENOMATCH; } modeinfo.vi_width = tm->visible.x; modeinfo.vi_height = tm->visible.y; /* XXX should be added to libvgl */ if (ioctl(0, FBIO_FINDMODE, &modeinfo)) return -1; DPRINT("Setting VGLlib mode %d (0x%x)\n", modeinfo.vi_mode, modeinfo.vi_mode); /* Terminate any current mode before initialising another */ if (priv->vgl_init_done) { priv->vgl_init_done = 0; VGLEnd(); } /* XXX should be in VGL */ if ((modeinfo.vi_mode >= M_B40x25) && (modeinfo.vi_mode <= M_VGA_M90x60)) modenum = _IO('S', modeinfo.vi_mode); if ((modeinfo.vi_mode >= M_TEXT_80x25) && (modeinfo.vi_mode <= M_TEXT_132x60)) modenum = _IO('S', modeinfo.vi_mode); if ((modeinfo.vi_mode >= M_VESA_CG640x400) && (modeinfo.vi_mode <= M_VESA_FULL_1280)) modenum = _IO('V', modeinfo.vi_mode - M_VESA_BASE); if ((err = VGLInit(modenum)) != 0) { DPRINT("display-vgl: setting mode 0x%x failed with error %d\n", modeinfo.vi_mode, err); return GGI_EFATAL; } priv->vgl_init_done = 1; if (priv->vgl_use_db) { _GGI_vgl_freedbs(vis); /* Set up DirectBuffer(s) */ for (i = 0; i<tm->frames; i++) { if (LIBGGI_FB_SIZE(tm) > (unsigned)(VGLDisplay->Xsize*VGLDisplay->Ysize* pixelBytes)) { fprintf(stderr, "display-vgl: framebuffer too large! (%d > %d*%d*%d)\n", LIBGGI_FB_SIZE(tm), VGLDisplay->Xsize, VGLDisplay->Ysize, pixelBytes); return GGI_ENOMEM; } _ggi_db_add_buffer(LIBGGI_APPLIST(vis), _ggi_db_get_new()); LIBGGI_APPBUFS(vis)[i]->frame = i; LIBGGI_APPBUFS(vis)[i]->type = GGI_DB_NORMAL | GGI_DB_SIMPLE_PLB; LIBGGI_APPBUFS(vis)[i]->read = VGLDisplay->Bitmap; LIBGGI_APPBUFS(vis)[i]->write = VGLDisplay->Bitmap; LIBGGI_APPBUFS(vis)[i]->layout = blPixelLinearBuffer; LIBGGI_APPBUFS(vis)[i]->buffer.plb.stride = GT_ByPPP(tm->virt.x, tm->graphtype); } } /* Save mode info returned by the VESA driver */ bcopy(&modeinfo, &priv->modeinfo, sizeof(priv->modeinfo)); /* Palette */ if (vis->palette) { free(vis->palette); vis->palette = NULL; } if (priv->savepalette) { free(priv->savepalette); priv->savepalette = NULL; } if (GT_SCHEME(tm->graphtype) == GT_PALETTE) { int len = 1 << GT_DEPTH(tm->graphtype); vis->palette = malloc(len * sizeof(ggi_color)); if (vis->palette == NULL) return GGI_EFATAL; priv->savepalette = malloc(sizeof(int) * (len*3)); if (priv->savepalette == NULL) return GGI_EFATAL; /* Set an initial palette */ ggiSetColorfulPalette(vis); } /* Set up pixel format */ memset(LIBGGI_PIXFMT(vis), 0, sizeof(ggi_pixelformat)); LIBGGI_PIXFMT(vis)->size = GT_SIZE(gt); LIBGGI_PIXFMT(vis)->depth = GT_DEPTH(gt); switch (GT_SCHEME(gt)) { case GT_PALETTE: case GT_GREYSCALE: LIBGGI_PIXFMT(vis)->clut_mask = (1 << GT_DEPTH(gt)) - 1; break; case GT_TRUECOLOR: DPRINT_MODE("display-vgl: RGB %d:%d:%d offsets %d:%d:%d\n", priv->modeinfo.vi_pixel_fsizes[VGL_RED_INDEX], priv->modeinfo.vi_pixel_fsizes[VGL_GREEN_INDEX], priv->modeinfo.vi_pixel_fsizes[VGL_BLUE_INDEX], priv->modeinfo.vi_pixel_fields[VGL_RED_INDEX], priv->modeinfo.vi_pixel_fields[VGL_GREEN_INDEX], priv->modeinfo.vi_pixel_fields[VGL_BLUE_INDEX]); LIBGGI_PIXFMT(vis)->red_mask = ((1 << priv->modeinfo.vi_pixel_fsizes[VGL_RED_INDEX]) - 1) << priv->modeinfo.vi_pixel_fields[VGL_RED_INDEX]; LIBGGI_PIXFMT(vis)->green_mask = ((1 << priv->modeinfo.vi_pixel_fsizes[VGL_GREEN_INDEX]) - 1) << priv->modeinfo.vi_pixel_fields[VGL_GREEN_INDEX]; LIBGGI_PIXFMT(vis)->blue_mask = ((1 << priv->modeinfo.vi_pixel_fsizes[VGL_BLUE_INDEX]) - 1) << priv->modeinfo.vi_pixel_fields[VGL_BLUE_INDEX]; break; case GT_TEXT: /* Assumes VGA text */ LIBGGI_PIXFMT(vis)->texture_mask = 0x00ff; LIBGGI_PIXFMT(vis)->fg_mask = 0x0f00; LIBGGI_PIXFMT(vis)->bg_mask = 0xf000; break; } _ggi_build_pixfmt(LIBGGI_PIXFMT(vis)); memcpy(LIBGGI_MODE(vis),tm,sizeof(ggi_mode)); _ggiZapMode(vis, 0); for(id = 1; 0 == GGI_vgl_getapi(vis, id, sugname, args); id++) { if (_ggiOpenDL(vis, _ggiGetConfigHandle(), sugname, args, NULL)) { fprintf(stderr,"display-vgl: Can't open the %s (%s) library.\n", sugname, args); return GGI_EFATAL; } else { DPRINT("Success in loading %s (%s)\n", sugname, args); } } if (!priv->vgl_use_db) { vis->opdraw->putpixel = GGI_vgl_putpixel; vis->opdraw->putpixel_nc = GGI_vgl_putpixel_nc; vis->opdraw->getpixel = GGI_vgl_getpixel; vis->opdraw->drawpixel = GGI_vgl_drawpixel; vis->opdraw->drawpixel_nc = GGI_vgl_drawpixel_nc; vis->opdraw->drawhline = GGI_vgl_drawhline; vis->opdraw->drawhline_nc = GGI_vgl_drawhline_nc; vis->opdraw->drawvline = GGI_vgl_drawvline; vis->opdraw->drawvline_nc = GGI_vgl_drawvline_nc; vis->opdraw->drawbox = GGI_vgl_drawbox; vis->opdraw->drawline = GGI_vgl_drawline; vis->opdraw->puthline = GGI_vgl_puthline; vis->opdraw->putbox = GGI_vgl_putbox; } else { vis->opdraw->setorigin = GGI_vgl_setorigin; } if (GT_SCHEME(tm->graphtype) == GT_PALETTE) { vis->opcolor->setpalvec = GGI_vgl_setpalvec; } if(priv->vgl_use_db) { for(i = 0; i<tm->frames; i++) LIBGGI_APPBUFS(vis)[i]->buffer.plb.pixelformat = LIBGGI_PIXFMT(vis); } ggiIndicateChange(vis, GGI_CHG_APILIST); return 0; }