diff --git a/programs/system/drivers/ati2d/accel_2d.h b/programs/system/drivers/ati2d/accel_2d.h index 47f21a3591..12db100804 100644 --- a/programs/system/drivers/ati2d/accel_2d.h +++ b/programs/system/drivers/ati2d/accel_2d.h @@ -2,6 +2,8 @@ #define FILL_RECT 1 #define DRAW_RECT 2 #define LINE_2P 3 +#define BLIT 4 + typedef unsigned int color_t; typedef unsigned int u32_t; @@ -29,6 +31,16 @@ typedef struct u32_t bmp1; }fill_t; +typedef struct +{ + int src_x; + int src_y; + int dst_x; + int dst_y; + int w; + int h; +}blit_t; + typedef struct { int x0; @@ -46,6 +58,7 @@ int FillRect(fill_t * fill); int Line2P(line2p_t *draw); +int Blit(blit_t *blit); # define RADEON_GMC_SRC_PITCH_OFFSET_CNTL (1 << 0) # define RADEON_GMC_DST_PITCH_OFFSET_CNTL (1 << 1) @@ -66,6 +79,8 @@ int Line2P(line2p_t *draw); #define RADEON_CP_PACKET3 0xC0000000 # define RADEON_CNTL_PAINT 0x00009100 +# define RADEON_CNTL_BITBLT 0x00009200 + # define RADEON_CNTL_PAINT_POLYLINE 0x00009500 # define RADEON_CNTL_PAINT_MULTI 0x00009A00 diff --git a/programs/system/drivers/ati2d/accel_2d.inc b/programs/system/drivers/ati2d/accel_2d.inc index fbf83114e6..6e8d11e0ba 100644 --- a/programs/system/drivers/ati2d/accel_2d.inc +++ b/programs/system/drivers/ati2d/accel_2d.inc @@ -100,14 +100,6 @@ int FillRect(fill_t *fill) OUT_RING(fill->bmp0); OUT_RING(fill->bmp1); - // OUT_RING(0xCCCC3333); - // OUT_RING(0xCCCC3333); - // OUT_RING(~0x11884422); - // OUT_RING(~0x11884422); - -// OUT_RING(0x88112244); -// OUT_RING(0x88112244); - OUT_RING((y0<<16)|x0); OUT_RING((y1<<16)|x1); COMMIT_RING(); @@ -117,7 +109,51 @@ int FillRect(fill_t *fill) return 0; } +int Blit(blit_t *blit) +{ + int x0, y0, x1, y1; + x0 = blit->src_x; + y0 = blit->src_y; + + x1 = x0+blit->w-1; + y1 = y0+blit->h-1; + + + if( ! BlockClip( &x0, &y0, &x1, &y1)) + { + u32 *ring, write; + int w, h; + u32 ifl; + + w = x1-x0+1; + h = y1-y0+1; + + ifl = safe_cli(); + + BEGIN_RING(); + OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT, 5)); + + OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL | + RADEON_GMC_DST_PITCH_OFFSET_CNTL | + RADEON_GMC_BRUSH_NONE | + RADEON_GMC_DST_32BPP | + RADEON_GMC_SRC_DATATYPE_COLOR | + RADEON_DP_SRC_SOURCE_MEMORY | + (1 << 28)+(1 << 30) | R5XX_ROP3_S); + + OUT_RING(rhd.dst_pitch_offset); + OUT_RING(rhd.dst_pitch_offset); + + OUT_RING((x0<<16)|y0); + OUT_RING((blit->dst_x<<16)|blit->dst_y); + OUT_RING((w<<16)|h); + COMMIT_RING(); + + safe_sti(ifl); + } ; + return 0; +} int Line2P(line2p_t *draw) { diff --git a/programs/system/drivers/ati2d/ati2d.c b/programs/system/drivers/ati2d/ati2d.c index 5cc2051864..337207ae66 100644 --- a/programs/system/drivers/ati2d/ati2d.c +++ b/programs/system/drivers/ati2d/ati2d.c @@ -138,14 +138,19 @@ int _stdcall srv_2d(ioctl_t *io) return DrawRect((draw_t*)inp); break; + case FILL_RECT: + if(io->inp_size==8) + return FillRect((fill_t*)inp); + break; + case LINE_2P: if(io->inp_size==5) return Line2P((line2p_t*)inp); break; - case FILL_RECT: - if(io->inp_size==8) - return FillRect((fill_t*)inp); + case BLIT: + if(io->inp_size==6) + return Blit((blit_t*)inp); break; default: