static void get_mode_info(ggi_visual_t vis, int *r, int *g, int *b, GLboolean *rgb, GLboolean *db, int *ci) { unsigned int i; *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); } *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); }
static int do_dbstuff(struct ggi_visual *vis) { ggi_palemu_priv *priv = PALEMU_PRIV(vis); int i; /* allocate memory */ priv->frame_size = LIBGGI_FB_SIZE(LIBGGI_MODE(vis)); priv->fb_size = priv->frame_size * LIBGGI_MODE(vis)->frames; priv->fb_ptr = malloc((size_t)priv->fb_size); DPRINT_MODE("display-palemu: fb=%p size=%d frame=%d\n", priv->fb_ptr, priv->fb_size, priv->frame_size); if (priv->fb_ptr == NULL) { fprintf(stderr, "display-palemu: Out of memory.\n"); return GGI_ENOMEM; } /* clear all frames */ memset(priv->fb_ptr, 0, (size_t)priv->fb_size); /* set up pixel format */ memset(LIBGGI_PIXFMT(vis), 0, sizeof(ggi_pixelformat)); setup_pixfmt(LIBGGI_PIXFMT(vis), LIBGGI_GT(vis)); _ggi_build_pixfmt(LIBGGI_PIXFMT(vis)); /* set up direct buffers */ for (i=0; i < LIBGGI_MODE(vis)->frames; i++) { ggi_directbuffer *buf; _ggi_db_add_buffer(LIBGGI_PRIVLIST(vis), _ggi_db_get_new()); buf = LIBGGI_PRIVBUFS(vis)[i]; buf->frame = i; buf->type = GGI_DB_NORMAL | GGI_DB_SIMPLE_PLB; buf->read = (char *) priv->fb_ptr + i * priv->frame_size; buf->write = buf->read; buf->layout = blPixelLinearBuffer; buf->buffer.plb.stride = GT_ByPPP(LIBGGI_VIRTX(vis), LIBGGI_GT(vis)); buf->buffer.plb.pixelformat = LIBGGI_PIXFMT(vis); } /* Set up palette */ if (LIBGGI_PAL(vis)->clut.data) { free(LIBGGI_PAL(vis)->clut.data); LIBGGI_PAL(vis)->clut.data = NULL; } if (GT_SCHEME(LIBGGI_GT(vis)) == GT_PALETTE) { LIBGGI_PAL(vis)->clut.data = _ggi_malloc((1 << GT_DEPTH(LIBGGI_GT(vis))) * sizeof(ggi_color)); LIBGGI_PAL(vis)->clut.size = 1 << GT_DEPTH(LIBGGI_GT(vis)); } return 0; }
int GGI_palemu_getmode(struct ggi_visual *vis, ggi_mode *mode) { if ((vis == NULL) || (mode == NULL) || (LIBGGI_MODE(vis) == NULL)) { DPRINT_MODE("display-palemu: vis/mode == NULL\n"); return GGI_EARGINVAL; } DPRINT_MODE("display-palemu: getmode.\n"); memcpy(mode, LIBGGI_MODE(vis), sizeof(ggi_mode)); return 0; }
int GGI_trueemu_getmode(struct ggi_visual *vis, ggi_mode *mode) { if ((vis == NULL) || (mode == NULL) || (LIBGGI_MODE(vis) == NULL)) { DPRINT("display-trueemu: vis/mode == NULL\n"); return GGI_ENOSPACE; } DPRINT("display-trueemu: getmode.\n"); memcpy(mode, LIBGGI_MODE(vis), sizeof(ggi_mode)); return 0; }
int GGI_lcd823_setmode(struct ggi_visual *vis, ggi_mode *mode) { int err; if ((err = ggiCheckMode(vis, mode)) != 0) { return err; } if (LIBGGI_PAL(vis)->clut.data) { free(LIBGGI_PAL(vis)->clut.data); LIBGGI_PAL(vis)->clut.data = NULL; } if (LIBGGI_PAL(vis)->priv) { free(LIBGGI_PAL(vis)->priv); LIBGGI_PAL(vis)->priv = NULL; } _GGI_lcd823_free_dbs(vis); memcpy(LIBGGI_MODE(vis), mode, sizeof(ggi_mode)); /* Now actually set the mode */ err = do_setmode(vis); if (err != 0) { return err; } /* Reset panning and frames */ vis->d_frame_num = vis->origin_x = vis->origin_y = 0; return 0; }
int GGI_m2164w_drawbox(struct ggi_visual *vis, int x, int y, int w, int h) { if (w > 0 && h > 0) { /* 0 width is not OK! */ struct m2164w_priv *priv = M2164W_PRIV(vis); volatile uint8_t *mmioaddr = FBDEV_PRIV(vis)->mmioaddr; int yadd = vis->w_frame_num * LIBGGI_VIRTY(vis); y += yadd; mga_gcupdate(mmioaddr, priv, LIBGGI_MODE(vis), LIBGGI_GC(vis), LIBGGI_VIRTX(vis), yadd); if (priv->dwgctl != priv->drawboxcmd) { mga_waitfifo(mmioaddr, 3); mga_setdwgctl(mmioaddr, priv, priv->drawboxcmd); } else { mga_waitfifo(mmioaddr, 2); } mga_out32(mmioaddr, (unsigned)(RS16(x + w) << 16) | RS16(x), FXBNDRY); mga_out32(mmioaddr, (unsigned)(RS16(y) << 16) | RS16(h), YDSTLEN | EXECUTE); vis->accelactive = 1; } return 0; }
int GGI_m2164w_fillscreen(struct ggi_visual *vis) { struct m2164w_priv *priv = M2164W_PRIV(vis); volatile uint8_t *mmioaddr = FBDEV_PRIV(vis)->mmioaddr; int virtx = LIBGGI_VIRTX(vis); int virty = LIBGGI_VIRTY(vis); int yadd = vis->w_frame_num * LIBGGI_VIRTY(vis); mga_gcupdate(mmioaddr, priv, LIBGGI_MODE(vis), LIBGGI_GC(vis), LIBGGI_VIRTX(vis), yadd); if (priv->dwgctl != priv->drawboxcmd) { mga_waitfifo(mmioaddr, 3); mga_setdwgctl(mmioaddr, priv, priv->drawboxcmd); } else { mga_waitfifo(mmioaddr, 2); } mga_out32(mmioaddr, (unsigned)RS16(virtx) << 16, FXBNDRY); mga_out32(mmioaddr, (unsigned)(RS16(yadd) << 16) | RS16(virty + yadd), YDSTLEN | EXECUTE); vis->accelactive = 1; return 0; }
int GGI_directfb_drawbox(ggi_visual *vis, int x, int y, int w, int h) { if (w > 0 && h > 0) { /* 0 width is not OK! */ struct directfb_priv *priv = DIRECTFB_PRIV(vis); int yadd = vis->w_frame_num * LIBGGI_VIRTY(vis); DFBRectangle dfbobj; y += yadd; directfb_gcupdate(vis, priv, LIBGGI_MODE(vis), LIBGGI_GC(vis), LIBGGI_VIRTX(vis), yadd, DFXL_FILLRECTANGLE); dfbobj.x = x; dfbobj.y = y; dfbobj.h = h; dfbobj.w = w; priv->device.funcs.FillRectangle(priv->device.driver_data, priv->device.device_data, &dfbobj); vis->accelactive = 1; } return 0; }
int GGI_3dlabs_pm2_drawhline(struct ggi_visual *vis, int x, int y, int w) { struct _3dlabs_pm2_priv *priv = PM2_PRIV(vis); volatile uint8_t *mmioaddr = FBDEV_PRIV(vis)->mmioaddr; int yadd = vis->w_frame_num * LIBGGI_VIRTY(vis); DPRINT_DRAW("drawhline(%p, %i,%i, %i) entered\n", vis, x,y, w); y += yadd; pm2_gcupdate(mmioaddr, priv, LIBGGI_MODE(vis), LIBGGI_GC(vis), yadd); pm2_waitfifo(mmioaddr, 6); pm2_out32(mmioaddr, x << 16, PM2R_START_X_DOM); pm2_out32(mmioaddr, y << 16, PM2R_START_Y); /* Horizontal */ pm2_out32(mmioaddr, 1 << 16, PM2R_D_X_DOM); pm2_out32(mmioaddr, 0 << 16, PM2R_D_Y); pm2_out32(mmioaddr, w, PM2R_COUNT); pm2_out32(mmioaddr, PM2F_RENDER_LINE | PM2F_RENDER_XPOSITIVE | PM2F_RENDER_YPOSITIVE, PM2R_RENDER); vis->accelactive = 1; return 0; }
int GGIMesa_fbdev_setmode(ggi_visual *vis, ggi_mode *mode) { int err; if ((err = ggiCheckMode(vis, mode)) != 0) { return err; } GGIMESADPRINT_CORE("display-fbdev-mesa: 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)); /* Now actually set the mode */ err = do_setmode(vis); if (err != 0) { return err; } GGIMESADPRINT_CORE("display-fbdev-mesa: setmode success.\n"); return 0; }
int GGI_mga_g400_drawhline(ggi_visual *vis, int x, int y, int w) { struct mga_g400_priv *priv = MGA_G400_PRIV(vis); volatile uint8_t *mmioaddr = FBDEV_PRIV(vis)->mmioaddr; int yadd = vis->w_frame_num * LIBGGI_VIRTY(vis); uint32_t dwgctl; y += yadd; y = RS16(y) << 16; dwgctl = OP_AUTOLINE_CLOSE | SOLID | SHFTZERO | BOP_COPY | BLTMOD_BFCOL; mga_gcupdate(mmioaddr, priv, LIBGGI_MODE(vis), LIBGGI_GC(vis), LIBGGI_VIRTX(vis), yadd); if (priv->dwgctl != dwgctl) { mga_waitfifo(mmioaddr, 3); mga_setdwgctl(mmioaddr, priv, dwgctl); } else { mga_waitfifo(mmioaddr, 2); } /* y has been shifted above */ mga_out32(mmioaddr, (unsigned)RS16(x) | y, XYSTRT); mga_out32(mmioaddr, (unsigned)RS16(x + w-1) | y, XYEND | EXECUTE); vis->accelactive = 1; return 0; }
int GGI_m2164w_drawline(ggi_visual *vis, int x, int y, int x2, int y2) { struct m2164w_priv *priv = M2164W_PRIV(vis); volatile uint8_t *mmioaddr = FBDEV_PRIV(vis)->mmioaddr; int yadd = vis->w_frame_num * LIBGGI_VIRTY(vis); uint32_t dwgctl; if (yadd) { y += yadd; y2 += yadd; } dwgctl = OP_AUTOLINE_CLOSE | SOLID | SHFTZERO | BOP_COPY | BLTMOD_BFCOL; mga_gcupdate(mmioaddr, priv, LIBGGI_MODE(vis), LIBGGI_GC(vis), LIBGGI_VIRTX(vis), yadd); if (priv->dwgctl != dwgctl) { mga_waitfifo(mmioaddr, 3); mga_setdwgctl(mmioaddr, priv, dwgctl); } else { mga_waitfifo(mmioaddr, 2); } mga_out32(mmioaddr, (unsigned)RS16(x) | (RS16(y) << 16), XYSTRT); mga_out32(mmioaddr, (unsigned)RS16(x2) | (RS16(y2) << 16), XYEND | EXECUTE); vis->accelactive = 1; return 0; }
int GGI_sub_getmode(ggi_visual *vis,ggi_mode *tm) { memcpy(tm,LIBGGI_MODE(vis),sizeof(ggi_mode)); tm->visible.x = tm->virt.x; tm->visible.y = tm->virt.y; tm->frames = 1; return 0; }
int GGI_vcsa_getmode(struct ggi_visual *vis, ggi_mode *mode) { DPRINT_MODE("display-vcsa: getmode\n"); memcpy(mode, LIBGGI_MODE(vis), sizeof(ggi_mode)); return 0; }
int GGI_vgl_getmode(ggi_visual *vis,ggi_mode *tm) { DPRINT("In GGIgetmode(%p,%p)\n",vis,tm); if (vis==NULL) return GGI_EARGINVAL; memcpy(tm,LIBGGI_MODE(vis),sizeof(ggi_mode)); 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_svga_setwriteframe(ggi_visual *vis, int num) { if (num < 0 || num >= LIBGGI_MODE(vis)->frames) { return GGI_ENOSPACE; } vis->w_frame_num = num; return 0; }
int GGI_svga_setdisplayframe(ggi_visual *vis, int num) { if (num < 0 || num >= LIBGGI_MODE(vis)->frames) { return GGI_ENOSPACE; } vis->d_frame_num = num; return(ggiSetOrigin(vis, vis->origin_x, vis->origin_y)); }
int GGI_svga_setreadframe(struct ggi_visual *vis, int num) { if (num < 0 || num >= LIBGGI_MODE(vis)->frames) { return GGI_ENOSPACE; } vis->r_frame_num = num; return 0; }
int GGI_vgl_setorigin(ggi_visual *vis,int x,int y) { ggi_mode *mode=LIBGGI_MODE(vis); if ( x<0 || x> mode->virt.x-mode->visible.x || y<0 || y> mode->virt.y-mode->visible.y ) return GGI_ENOSPACE; if (VGLPanScreen(VGLDisplay, x, y)) return -1; return 0; }
int GGI_sub_setmode(ggi_visual *vis,ggi_mode *tm) { ggi_sub_priv *subinfo = SUB_PRIV(vis); subinfo->position.x = tm->visible.x; subinfo->position.y = tm->visible.y; subinfo->botright.x = tm->virt.x + tm->visible.x; subinfo->botright.y = tm->virt.y + tm->visible.y; tm->visible=tm->virt; memcpy(LIBGGI_MODE(vis),tm,sizeof(ggi_mode)); 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; }
static void DDNotifyResize(struct ggi_visual *vis, int xsize, int ysize) { gii_event ev; ggi_cmddata_switchrequest *swreq; directx_priv *priv = GGIDIRECTX_PRIV(vis); DPRINT_DRAW("DDNotifyResize(%p, %dx%d) called\n", vis, xsize, ysize); if (!priv->inp) return; /* This is racy, what if window is resized and * resized back before the app gets to react * to the first resize notification? */ if (!LIBGGI_X(vis) || !LIBGGI_Y(vis)) { DPRINT_DRAW("DDNotifyResize: No old size, ignore\n"); return; } if ((LIBGGI_X(vis) == xsize) && (LIBGGI_Y(vis) == ysize)) { DPRINT_DRAW("DDNotifyResize: Same size, ignore\n"); return; } DPRINT_DRAW("DDNotifyResize: Old size %ux%u\n", LIBGGI_X(vis), LIBGGI_Y(vis)); ev.any.size= sizeof(gii_cmd_nodata_event) + sizeof(ggi_cmddata_switchrequest); ev.any.type= evCommand; ev.cmd.code= GGICMD_REQUEST_SWITCH; swreq = (ggi_cmddata_switchrequest *) ev.cmd.data; swreq->request = GGI_REQSW_MODE; swreq->mode = *LIBGGI_MODE(vis); swreq->mode.visible.x = xsize; swreq->mode.visible.y = ysize; if (swreq->mode.virt.x < xsize) swreq->mode.virt.x = xsize; if (swreq->mode.virt.y < ysize) swreq->mode.virt.y = ysize; swreq->mode.size.x = GGI_AUTO; swreq->mode.size.y = GGI_AUTO; ggControl(priv->inp->channel, GII_CMDCODE_RESIZE, &ev); }
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_mmap(struct ggi_visual *vis) { ggi_lcd823_priv *priv = LCD823_PRIV(vis); ggi_graphtype gt = LIBGGI_GT(vis); int xres_in_bytes = XRES; int i; /* Clear framebuffer */ memset(priv->fb_ptr, 0, priv->fb_size); /* 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); LIBGGI_PIXFMT(vis)->clut_mask = (1 << GT_DEPTH(gt)) - 1; _ggi_build_pixfmt(LIBGGI_PIXFMT(vis)); /* Set up DirectBuffers */ for (i=0; i < LIBGGI_MODE(vis)->frames; i++) { ggi_directbuffer *buf; _ggi_db_add_buffer(LIBGGI_APPLIST(vis), _ggi_db_get_new()); buf = LIBGGI_APPBUFS(vis)[i]; buf->frame = i; buf->type = GGI_DB_NORMAL; buf->read = (uint8_t *) priv->fb_ptr + i * priv->frame_size; buf->write = buf->read; buf->type |= GGI_DB_SIMPLE_PLB; buf->layout = blPixelLinearBuffer; buf->buffer.plb.stride = xres_in_bytes; buf->buffer.plb.pixelformat = LIBGGI_PIXFMT(vis); } return 0; }
int GGI_directfb_drawhline(struct ggi_visual *vis, int x, int y, int w) { struct directfb_priv *priv = DIRECTFB_PRIV(vis); int yadd = vis->w_frame_num * LIBGGI_VIRTY(vis); DFBRectangle dfbobj; y += yadd; directfb_gcupdate(vis, priv, LIBGGI_MODE(vis), LIBGGI_GC(vis), LIBGGI_VIRTX(vis), yadd, DFXL_FILLRECTANGLE); dfbobj.x = x; dfbobj.y = y; dfbobj.w = w; dfbobj.h = 1; priv->device.funcs.FillRectangle(priv->device.driver_data, priv->device.device_data, &dfbobj); vis->accelactive = 1; return 0; }
int GGI_directfb_copybox(struct ggi_visual *vis, int x, int y, int w, int h, int dstx, int dsty) { struct directfb_priv *priv = DIRECTFB_PRIV(vis); int virtx = LIBGGI_VIRTX(vis); int yadd = vis->w_frame_num * LIBGGI_VIRTY(vis); DFBRectangle dfbobj; directfb_gcupdate(vis, priv, LIBGGI_MODE(vis), LIBGGI_GC(vis), LIBGGI_VIRTX(vis), yadd, DFXL_BLIT); dfbobj.x = x; dfbobj.y = y; dfbobj.h = h; dfbobj.w = w; priv->device.funcs.Blit(priv->device.driver_data, priv->device.device_data, &dfbobj, dstx, dsty); vis->accelactive = 1; return 0; }
int GGI_directfb_fillscreen(ggi_visual *vis) { struct directfb_priv *priv = DIRECTFB_PRIV(vis); int virtx = LIBGGI_VIRTX(vis); int virty = LIBGGI_VIRTY(vis); int yadd = vis->w_frame_num * LIBGGI_VIRTY(vis); DFBRectangle dfbobj; directfb_gcupdate(vis, priv, LIBGGI_MODE(vis), LIBGGI_GC(vis), LIBGGI_VIRTX(vis), yadd, DFXL_FILLRECTANGLE); dfbobj.x = 0; dfbobj.y = 0; dfbobj.h = virty; dfbobj.w = virtx; priv->device.funcs.FillRectangle(priv->device.driver_data, priv->device.device_data, &dfbobj); vis->accelactive = 1; return 0; }
int GGI_mga_g400_copybox(ggi_visual *vis, int x, int y, int w, int h, int dstx, int dsty) { struct mga_g400_priv *priv = MGA_G400_PRIV(vis); volatile uint8_t *mmioaddr = FBDEV_PRIV(vis)->mmioaddr; int virtx = LIBGGI_VIRTX(vis); int yadd = vis->w_frame_num * LIBGGI_VIRTY(vis); int32_t ar5 = virtx; int32_t begin, end; uint32_t sgn = 0; uint32_t dwgctl; #define COPY_LEFT 1 #define COPY_UP 4 dsty += yadd; y += vis->r_frame_num*LIBGGI_VIRTY(vis); if (dsty > y) { sgn |= COPY_UP; y += h - 1; dsty += h - 1; ar5 = - ar5; } begin = end = y * virtx + x; w--; if (dstx > x) { sgn |= COPY_LEFT; begin += w; } else { end += w; } dwgctl = BLTMOD_BFCOL | BOP_COPY | SHFTZERO | OP_BITBLT | (sgn ? 0 : SGNZERO); mga_gcupdate(mmioaddr, priv, LIBGGI_MODE(vis), LIBGGI_GC(vis), virtx, yadd); if (priv->dwgctl != dwgctl) { if (sgn) mga_waitfifo(mmioaddr, 7); else mga_waitfifo(mmioaddr, 6); mga_setdwgctl(mmioaddr, priv, dwgctl); } else { if (sgn) mga_waitfifo(mmioaddr, 6); else mga_waitfifo(mmioaddr, 5); } if (sgn) { mga_out32(mmioaddr, sgn, SGN); } #if 0 mga_out32(mmioaddr, RS18(end), AR0); mga_out32(mmioaddr, RS24(begin), AR3); mga_out32(mmioaddr, RS18(ar5), AR5); #else mga_out32(mmioaddr, RS22(end), AR0); mga_out32(mmioaddr, RS24(begin), AR3); mga_out32(mmioaddr, RS22(ar5), AR5); #endif mga_out32(mmioaddr, (unsigned)(RS16(dstx + w) << 16) | RS16(dstx), FXBNDRY); mga_out32(mmioaddr, (unsigned)(RS16(dsty) << 16) | RS16(h), YDSTLEN | EXECUTE); vis->accelactive = 1; return 0; }
static inline void dbblit_32bpp(ggi_visual *src, int sx, int sy, int w, int h, ggi_visual *dst, int dx, int dy, uint32_t srcfmt) { struct m2164w_priv *priv = M2164W_PRIV(dst); volatile uint8_t *mmioaddr = FBDEV_PRIV(dst)->mmioaddr; int yadd = dst->w_frame_num * LIBGGI_VIRTY(dst); volatile uint32_t *dstptr; uint32_t dwgctl, bltmod = BLTMOD_BU32RGB; uint16_t opmode; uint8_t *srcptr; uint32_t *srcptr32; int srcinc; int maxpix; dstptr = priv->dmaaddr; srcinc = LIBGGI_FB_R_STRIDE(src); srcptr = (uint8_t*) LIBGGI_CURWRITE(src) + sy*srcinc + sx*4; srcinc -= w*4; maxpix = priv->dma_len/4; dy += yadd; switch (srcfmt) { #if 0 /* This case is the default. */ case GGI_DB_STD_24a32p8r8g8b8: bltmod = BLTMOD_BU32RGB; break; #endif case GGI_DB_STD_24a32p8b8g8r8: bltmod = BLTMOD_BU32BGR; break; } dwgctl = bltmod | BOP_COPY | SHFTZERO | OP_ILOAD | SGNZERO; #ifdef GGI_BIG_ENDIAN opmode = OPMODE_DMA_BLIT_WRITE | OPMODE_DMA_BE_32BPP; #else opmode = OPMODE_DMA_BLIT_WRITE | OPMODE_DMA_LE; #endif mga_gcupdate(mmioaddr, priv, LIBGGI_MODE(dst), LIBGGI_GC(dst), LIBGGI_VIRTX(dst), yadd); if (priv->curopmode != opmode) { priv->curopmode = opmode; mga_waitidle(mmioaddr); mga_out16(mmioaddr, opmode, OPMODE); } if (priv->dwgctl != dwgctl) { mga_waitfifo(mmioaddr, 6); mga_setdwgctl(mmioaddr, priv, dwgctl); } else { mga_waitfifo(mmioaddr, 5); } mga_out32(mmioaddr, RS18(w-1), AR0); mga_out32(mmioaddr, 0, AR3); mga_out32(mmioaddr, 0, AR5); mga_out32(mmioaddr, (unsigned)(RS16(dx + w - 1) << 16) | RS16(dx), FXBNDRY); mga_out32(mmioaddr, (unsigned)(RS16(dy) << 16) | RS16(h), YDSTLEN | EXECUTE); dst->accelactive = 1; if (w > maxpix) { while (h--) { int tmpw = w; while (tmpw) { int tmpw2 = (tmpw > maxpix ? maxpix : tmpw); tmpw -= tmpw2; while (tmpw2--) { srcptr32 = (uint32_t *)srcptr; *(dstptr++) = *(srcptr32++); srcptr = (uint8_t *)srcptr32; } dstptr = priv->dmaaddr; } srcptr += srcinc; } } else { while (h--) { int tmpw = w; while (tmpw--) { srcptr32 = (uint32_t *)srcptr; *(dstptr++) = *(srcptr32++); srcptr = (uint8_t *)srcptr32; } srcptr += srcinc; dstptr = priv->dmaaddr; } } }