static int FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color)
{
    int bpp;
    char *dst_base;
    Uint32 format;
    int dstX, dstY;

    /* Don't blit to the display surface when switched away */

    /* Set the destination pixel format */
    dst_base = (char *)((char *)dst->pixels - mapped_mem);
    bpp = dst->format->BitsPerPixel;
    format = dst->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13);

    /* Calculate source and destination base coordinates */
    dstX = rect->x;
    dstY = rect->y;

    /* Execute the fill command */
    tdfx_wait(6);
    tdfx_out32(DSTBASE, (Uint32)dst_base);
    tdfx_out32(DSTFORMAT, format);
    tdfx_out32(COLORFORE, color);
    tdfx_out32(COMMAND_2D, COMMAND_2D_FILLRECT);
    tdfx_out32(DSTSIZE, rect->w | (rect->h << 16));
    tdfx_out32(LAUNCH_2D, dstX | (dstY << 16));

    FB_AddBusySurface(dst);

    return(0);
}
Esempio n. 2
0
static int HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect,
                       SDL_Surface *dst, SDL_Rect *dstrect)
{
    SDL_VideoDevice *this = current_video;
    int srcX, srcY;
    int dstX, dstY;
    int dstW, dstH;
    RivaScreenBlt *Blt = (RivaScreenBlt *)(mapped_io + BLT_OFFSET);

    /* FIXME: For now, only blit to display surface */
    if ( dst->pitch != SDL_VideoSurface->pitch ) {
        return(src->map->sw_blit(src, srcrect, dst, dstrect));
    }

    /* Don't blit to the display surface when switched away */
    if ( switched_away ) {
        return -2; /* no hardware access */
    }
    if ( dst == this->screen ) {
        SDL_mutexP(hw_lock);
    }

    /* Calculate source and destination base coordinates (in pixels) */
    dstW = dstrect->w;
    dstH = dstrect->h;
    FB_dst_to_xy(this, src, &srcX, &srcY);
    FB_dst_to_xy(this, dst, &dstX, &dstY);

    /* Adjust for the current blit rectangles */
    srcX += srcrect->x;
    srcY += srcrect->y;
    dstX += dstrect->x;
    dstY += dstrect->y;

    RIVA_FIFO_FREE(Blt, 3);
    Blt->TopLeftSrc  = (srcY << 16) | srcX;
    Blt->TopLeftDst  = (dstY << 16) | dstX;
    Blt->WidthHeight = (dstH  << 16) | dstW;

    FB_AddBusySurface(src);
    FB_AddBusySurface(dst);

    if ( dst == this->screen ) {
        SDL_mutexV(hw_lock);
    }
    return(0);
}
Esempio n. 3
0
static int HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect,
                       SDL_Surface *dst, SDL_Rect *dstrect)
{
	SDL_VideoDevice *this = current_video;
	int srcX, srcY;
	int dstX, dstY;
	int dstW, dstH;
	RivaScreenBlt *Blt = (RivaScreenBlt *)(mapped_io + BLT_OFFSET);

	
	if ( dst->pitch != SDL_VideoSurface->pitch ) {
		return(src->map->sw_blit(src, srcrect, dst, dstrect));
	}

	
	if ( switched_away ) {
		return -2; 
	}
	if ( dst == this->screen ) {
		SDL_mutexP(hw_lock);
	}

	
	dstW = dstrect->w;
	dstH = dstrect->h;
	FB_dst_to_xy(this, src, &srcX, &srcY);
	FB_dst_to_xy(this, dst, &dstX, &dstY);

	
	srcX += srcrect->x;
	srcY += srcrect->y;
	dstX += dstrect->x;
	dstY += dstrect->y;

	RIVA_FIFO_FREE(Blt, 3);
	Blt->TopLeftSrc  = (srcY << 16) | srcX;
	Blt->TopLeftDst  = (dstY << 16) | dstX;
	Blt->WidthHeight = (dstH  << 16) | dstW;

	FB_AddBusySurface(src);
	FB_AddBusySurface(dst);

	if ( dst == this->screen ) {
		SDL_mutexV(hw_lock);
	}
	return(0);
}
Esempio n. 4
0
static int
FillHWRect(_THIS, SDL_Surface * dst, SDL_Rect * rect, Uint32 color)
{
    int dstX, dstY;
    Uint32 fxbndry;
    Uint32 ydstlen;
    Uint32 fillop;

    /* Don't blit to the display surface when switched away */
    if (switched_away) {
        return -2;              /* no hardware access */
    }
    if (dst == this->screen) {
        SDL_mutexP(hw_lock);
    }

    switch (dst->format->BytesPerPixel) {
    case 1:
        color |= (color << 8);
    case 2:
        color |= (color << 16);
        break;
    }

    /* Set up the X/Y base coordinates */
    FB_dst_to_xy(this, dst, &dstX, &dstY);

    /* Adjust for the current rectangle */
    dstX += rect->x;
    dstY += rect->y;

    /* Set up the X boundaries */
    fxbndry = (dstX | ((dstX + rect->w) << 16));

    /* Set up the Y boundaries */
    ydstlen = (rect->h | (dstY << 16));

    /* Set up for color fill operation */
    fillop = MGADWG_TRAP | MGADWG_SOLID |
        MGADWG_ARZERO | MGADWG_SGNZERO | MGADWG_SHIFTZERO;

    /* Execute the operations! */
    mga_wait(5);
    mga_out32(MGAREG_DWGCTL, fillop | MGADWG_REPLACE);
    mga_out32(MGAREG_FCOL, color);
    mga_out32(MGAREG_FXBNDRY, fxbndry);
    mga_out32(MGAREG_YDSTLEN + MGAREG_EXEC, ydstlen);

    FB_AddBusySurface(dst);

    if (dst == this->screen) {
        SDL_mutexV(hw_lock);
    }
    return (0);
}
Esempio n. 5
0
static int FillHWRect(_THIS, GAL_Surface *dst, GAL_Rect *rect, Uint32 color)
{
	int dstX, dstY;
	Uint32 fxbndry;
	Uint32 ydstlen;
	Uint32 fillop;

	switch (dst->format->BytesPerPixel) {
	    case 1:
		color |= (color<<8);
	    case 2:
		color |= (color<<16);
		break;
	}

	/* Set up the X/Y base coordinates */
	FB_dst_to_xy(this, dst, &dstX, &dstY);

	/* Adjust for the current rectangle */
	dstX += rect->x;
	dstY += rect->y;

	/* Set up the X boundaries */
	fxbndry = (dstX | ((dstX+rect->w) << 16));

	/* Set up the Y boundaries */
	ydstlen = (rect->h | (dstY << 16));

	/* Set up for color fill operation */
	fillop = MGADWG_TRAP | MGADWG_SOLID |
	         MGADWG_ARZERO | MGADWG_SGNZERO | MGADWG_SHIFTZERO;

	/* Execute the operations! */
	mga_wait(5);
	mga_out32(MGAREG_DWGCTL, fillop | MGADWG_REPLACE);
	mga_out32(MGAREG_FCOL, color);
	mga_out32(MGAREG_FXBNDRY, fxbndry);
	mga_out32(MGAREG_YDSTLEN + MGAREG_EXEC, ydstlen);

	FB_AddBusySurface(dst);

	return(0);
}
Esempio n. 6
0
static int FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color)
{
	int bpp;
	Uint32 dst_base;
	Uint32 format;
	int dstX, dstY;

	
	if ( switched_away ) {
		return -2; 
	}
	if ( dst == this->screen ) {
		SDL_mutexP(hw_lock);
	}

	
	dst_base = ((char *)dst->pixels - mapped_mem);
	bpp = dst->format->BitsPerPixel;
	format = dst->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13);

	
	dstX = rect->x;
	dstY = rect->y;

	
	tdfx_wait(6);
	tdfx_out32(DSTBASE, dst_base);
	tdfx_out32(DSTFORMAT, format);
	tdfx_out32(COLORFORE, color);
	tdfx_out32(COMMAND_2D, COMMAND_2D_FILLRECT);
	tdfx_out32(DSTSIZE, rect->w | (rect->h << 16));
	tdfx_out32(LAUNCH_2D, dstX | (dstY << 16));

	FB_AddBusySurface(dst);

	if ( dst == this->screen ) {
		SDL_mutexV(hw_lock);
	}
	return(0);
}
Esempio n. 7
0
static int FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color)
{
    int dstX, dstY;
    int dstW, dstH;
    RivaBitmap *Bitmap = (RivaBitmap *)(mapped_io + BITMAP_OFFSET);

    /* Don't blit to the display surface when switched away */
    if ( switched_away ) {
        return -2; /* no hardware access */
    }
    if ( dst == this->screen ) {
        SDL_mutexP(hw_lock);
    }

    /* Set up the X/Y base coordinates */
    dstW = rect->w;
    dstH = rect->h;
    FB_dst_to_xy(this, dst, &dstX, &dstY);

    /* Adjust for the current rectangle */
    dstX += rect->x;
    dstY += rect->y;

    RIVA_FIFO_FREE(Bitmap, 1);
    Bitmap->Color1A = color;

    RIVA_FIFO_FREE(Bitmap, 2);
    Bitmap->UnclippedRectangle[0].TopLeft     = (dstX << 16) | dstY;
    Bitmap->UnclippedRectangle[0].WidthHeight = (dstW << 16) | dstH;

    FB_AddBusySurface(dst);

    if ( dst == this->screen ) {
        SDL_mutexV(hw_lock);
    }
    return(0);
}
Esempio n. 8
0
static int FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color)
{
	int dstX, dstY;
	int dstW, dstH;
	RivaBitmap *Bitmap = (RivaBitmap *)(mapped_io + BITMAP_OFFSET);

	
	if ( switched_away ) {
		return -2; 
	}
	if ( dst == this->screen ) {
		SDL_mutexP(hw_lock);
	}

	
	dstW = rect->w;
	dstH = rect->h;
	FB_dst_to_xy(this, dst, &dstX, &dstY);

	
	dstX += rect->x;
	dstY += rect->y;

	RIVA_FIFO_FREE(Bitmap, 1);
	Bitmap->Color1A = color;

	RIVA_FIFO_FREE(Bitmap, 2);
	Bitmap->UnclippedRectangle[0].TopLeft     = (dstX << 16) | dstY; 
	Bitmap->UnclippedRectangle[0].WidthHeight = (dstW << 16) | dstH;

	FB_AddBusySurface(dst);

	if ( dst == this->screen ) {
		SDL_mutexV(hw_lock);
	}
	return(0);
}
Esempio n. 9
0
static int HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect,
                       SDL_Surface *dst, SDL_Rect *dstrect)
{
	SDL_VideoDevice *this = current_video;
	int pitch, w, h;
	int srcX, srcY;
	int dstX, dstY;
	Uint32 sign;
	Uint32 start, stop;
	int skip;
	Uint32 blitop;

	/* FIXME: For now, only blit to display surface */
	if ( dst->pitch != SDL_VideoSurface->pitch ) {
		return(src->map->sw_blit(src, srcrect, dst, dstrect));
	}

	/* Don't blit to the display surface when switched away */
	if ( dst == this->screen ) {
		SDL_mutexP(hw_lock);
	}

	/* Calculate source and destination base coordinates (in pixels) */
	w = dstrect->w;
	h = dstrect->h;
	FB_dst_to_xy(this, src, &srcX, &srcY);
	FB_dst_to_xy(this, dst, &dstX, &dstY);

	/* Adjust for the current blit rectangles */
	srcX += srcrect->x;
	srcY += srcrect->y;
	dstX += dstrect->x;
	dstY += dstrect->y;
	pitch = dst->pitch/dst->format->BytesPerPixel;

	/* Set up the blit direction (sign) flags */
	sign = 0;
	if ( srcX < dstX ) {
		sign |= 1;
	}
	if ( srcY < dstY ) {
		sign |= 4;
		srcY += (h - 1);
		dstY += (h - 1);
	}

	/* Set up the blit source row start, end, and skip (in pixels) */
	stop = start = (srcY * pitch) + srcX;
	if ( srcX < dstX ) {
		start += (w - 1);
	} else {
		stop  += (w - 1);
	}
	if ( srcY < dstY ) {
		skip = -pitch;
	} else {
		skip = pitch;
	}

	/* Set up the blit operation */
	if ( (src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY ) {
		Uint32 colorkey;

		blitop = MGADWG_BFCOL | MGADWG_BITBLT |
		         MGADWG_SHIFTZERO | MGADWG_RSTR | (0x0C << 16) |
		         MGADWG_TRANSC;

		colorkey = src->format->colorkey;
		switch (dst->format->BytesPerPixel) {
		    case 1:
			colorkey |= (colorkey<<8);
		    case 2:
			colorkey |= (colorkey<<16);
			break;
		}
		mga_wait(2);
		mga_out32(MGAREG_FCOL, colorkey);
		mga_out32(MGAREG_BCOL, 0xFFFFFFFF);
	} else {
		blitop = MGADWG_BFCOL | MGADWG_BITBLT |
		         MGADWG_SHIFTZERO | MGADWG_RSTR | (0x0C << 16);
	}
	mga_wait(7);
	mga_out32(MGAREG_SGN, sign);
	mga_out32(MGAREG_AR3, start);
	mga_out32(MGAREG_AR0, stop);
	mga_out32(MGAREG_AR5, skip);
	mga_out32(MGAREG_FXBNDRY, (dstX | ((dstX + w-1) << 16)));
	mga_out32(MGAREG_YDSTLEN, (dstY << 16) | h);
	mga_out32(MGAREG_DWGCTL + MGAREG_EXEC, blitop);

	FB_AddBusySurface(src);
	FB_AddBusySurface(dst);

	if ( dst == this->screen ) {
		SDL_mutexV(hw_lock);
	}
	return(0);
}
static int HWAccelBlit(GAL_Surface *src, GAL_Rect *srcrect,
                       GAL_Surface *dst, GAL_Rect *dstrect)
{
    GAL_VideoDevice *this = current_video;
    int bpp;
    Uint32 src_format;
    Uint32 dst_format;
    char *src_base;
    char *dst_base;
    int srcX, srcY;
    int dstX, dstY;
    Uint32 blitop;
    Uint32 use_colorkey;

    /* Don't blit to the display surface when switched away */

    /* Set the source and destination pixel format */
    src_base = (char *)((char *)src->pixels - mapped_mem);
    bpp = src->format->BitsPerPixel;
    src_format = src->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13);
    dst_base = (char *)((char *)dst->pixels - mapped_mem);
    bpp = dst->format->BitsPerPixel;
    dst_format = dst->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13);

    srcX = srcrect->x;
    srcY = srcrect->y;
    dstX = dstrect->x;
    dstY = dstrect->y;

    /* Assemble the blit operation */
    blitop = COMMAND_2D_BITBLT | (0xCC << 24);
    if ( srcX <= dstX ) {
        blitop |= BIT(14);
        srcX += (dstrect->w - 1);
        dstX += (dstrect->w - 1);
    }
    if ( srcY <= dstY ) {
        blitop |= BIT(15);
        srcY += (dstrect->h - 1);
        dstY += (dstrect->h - 1);
    }

    /* Perform the blit! */
    if ( (src->flags & GAL_SRCCOLORKEY) == GAL_SRCCOLORKEY ) {
            tdfx_wait(3);
            tdfx_out32(SRCCOLORKEYMIN, src->format->colorkey);
            tdfx_out32(SRCCOLORKEYMAX, src->format->colorkey);
            tdfx_out32(ROP_2D, 0xAA00);
        use_colorkey = 1;
    } else {
        use_colorkey = 0;
    }
    tdfx_wait(9);
    tdfx_out32(SRCBASE, (Uint32)src_base);
    tdfx_out32(SRCFORMAT, src_format);
    tdfx_out32(DSTBASE, (Uint32)dst_base);
    tdfx_out32(DSTFORMAT, src_format);
    tdfx_out32(COMMAND_2D, blitop);
    tdfx_out32(COMMANDEXTRA_2D, use_colorkey);
    tdfx_out32(DSTSIZE, dstrect->w | (dstrect->h << 16));
    tdfx_out32(DSTXY, dstX | (dstY << 16));
    tdfx_out32(LAUNCH_2D, srcX | (srcY << 16));

    FB_AddBusySurface(src);
    FB_AddBusySurface(dst);

    return(0);
}
Esempio n. 11
0
static int HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect,
                       SDL_Surface *dst, SDL_Rect *dstrect)
{
	SDL_VideoDevice *this = current_video;
	int bpp;
	Uint32 src_format;
	Uint32 src_base;
	Uint32 dst_base;
	int srcX, srcY;
	int dstX, dstY;
	Uint32 blitop;
	Uint32 use_colorkey;

	
	if ( switched_away ) {
		return -2; 
	}
	if ( dst == this->screen ) {
		SDL_mutexP(hw_lock);
	}

	
	src_base = ((char *)src->pixels - mapped_mem);
	bpp = src->format->BitsPerPixel;
	src_format = src->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13);
	dst_base = ((char *)dst->pixels - mapped_mem);
	bpp = dst->format->BitsPerPixel;

	srcX = srcrect->x;
	srcY = srcrect->y;
	dstX = dstrect->x;
	dstY = dstrect->y;

	
	blitop = COMMAND_2D_BITBLT | (0xCC << 24);
	if ( srcX <= dstX ) {
		blitop |= BIT(14);
		srcX += (dstrect->w - 1);
		dstX += (dstrect->w - 1);
	}
	if ( srcY <= dstY ) {
		blitop |= BIT(15);
		srcY += (dstrect->h - 1);
		dstY += (dstrect->h - 1);
	}

	
	if ( (src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY ) {
    		tdfx_wait(3);
    		tdfx_out32(SRCCOLORKEYMIN, src->format->colorkey);
    		tdfx_out32(SRCCOLORKEYMAX, src->format->colorkey);
    		tdfx_out32(ROP_2D, 0xAA00);
		use_colorkey = 1;
	} else {
		use_colorkey = 0;
	}
	tdfx_wait(9);
	tdfx_out32(SRCBASE, (Uint32)src_base);
	tdfx_out32(SRCFORMAT, src_format);
	tdfx_out32(DSTBASE, (Uint32)dst_base);
	tdfx_out32(DSTFORMAT, src_format);
	tdfx_out32(COMMAND_2D, blitop);
	tdfx_out32(COMMANDEXTRA_2D, use_colorkey);
	tdfx_out32(DSTSIZE, dstrect->w | (dstrect->h << 16));
	tdfx_out32(DSTXY, dstX | (dstY << 16));
	tdfx_out32(LAUNCH_2D, srcX | (srcY << 16));

	FB_AddBusySurface(src);
	FB_AddBusySurface(dst);

	if ( dst == this->screen ) {
		SDL_mutexV(hw_lock);
	}
	return(0);
}