diff --git a/programs/system/drivers/ati2d/accel_2d.h b/programs/system/drivers/ati2d/accel_2d.h index ec3c68a2af..7c64b1324e 100644 --- a/programs/system/drivers/ati2d/accel_2d.h +++ b/programs/system/drivers/ati2d/accel_2d.h @@ -6,20 +6,26 @@ #define COMPIZ 5 #define PIXMAP 6 #define PIXBLIT 7 +#define PIXLOCK 8 + typedef unsigned int color_t; typedef struct { - int x; - int y; - int w; - int h; - u32 color; + pixmap_t *dstpix; + + int x; + int y; + u32_t w; + u32_t h; + color_t color; }draw_t; typedef struct { + pixmap_t *dstpix; + int x; int y; int w; @@ -53,24 +59,26 @@ typedef struct typedef struct { - u32_t pixmap; - u32_t format; - u32_t width; - u32_t height; - u32_t pitch; -}new_pixmap_t; + pixmap_t *pixmap; + void *usermap; + u32_t format; + u32_t pitch; + + u32_t width; + u32_t height; +}userpixmap_t; typedef struct { pixmap_t *dstpix; - int dst_x; - int dst_y; + int dst_x; + int dst_y; pixmap_t *srcpix; - int src_x; - int src_y; - int w; - int h; + int src_x; + int src_y; + int w; + int h; }pixblit_t; @@ -86,10 +94,12 @@ int Blit(blit_t *blit); int RadeonComposite( blit_t *blit); -int CreatePixmap(new_pixmap_t *io); +int CreatePixmap(userpixmap_t *io); int PixBlit(pixblit_t* blit); +int LockPixmap(userpixmap_t *io); + # define RADEON_GMC_SRC_PITCH_OFFSET_CNTL (1 << 0) # define RADEON_GMC_DST_PITCH_OFFSET_CNTL (1 << 1) # define RADEON_GMC_BRUSH_SOLID_COLOR (13 << 4) diff --git a/programs/system/drivers/ati2d/accel_2d.inc b/programs/system/drivers/ati2d/accel_2d.inc index ebdb18a508..a04b4a838b 100644 --- a/programs/system/drivers/ati2d/accel_2d.inc +++ b/programs/system/drivers/ati2d/accel_2d.inc @@ -6,6 +6,10 @@ int DrawRect(draw_t* draw) { int x0, y0, x1, y1; + pixmap_t *dstpixmap; + + dstpixmap = (draw->dstpix == (void*)-1) ? &scr_pixmap : draw->dstpix ; + x0 = draw->x; y0 = draw->y; @@ -38,25 +42,24 @@ int DrawRect(draw_t* draw) OUTREG(R5XX_DP_BRUSH_FRGD_CLR, draw->color); OUTREG(R5XX_DP_WRITE_MASK, 0xFFFFFFFF); OUTREG(R5XX_DP_CNTL, R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); - OUTREG(R5XX_DST_PITCH_OFFSET, rhd.dst_pitch_offset); + OUTREG(R5XX_DST_PITCH_OFFSET, dstpixmap->pitch_offset); OUTREG(R5XX_DST_Y_X,(y0<<16)|x0); - OUTREG( R5XX_DST_WIDTH_HEIGHT,(w<<16)|h); + OUTREG(R5XX_DST_WIDTH_HEIGHT,(w<<16)|h); #else BEGIN_RING(); OUT_RING(CP_PACKET3(RADEON_CNTL_PAINT_MULTI, 4)); - OUT_RING(RADEON_GMC_DST_PITCH_OFFSET_CNTL | RADEON_GMC_BRUSH_SOLID_COLOR | RADEON_GMC_DST_32BPP | RADEON_GMC_SRC_DATATYPE_COLOR | (1 << 28)+(1 << 30) | R5XX_ROP3_P); - OUT_RING(rhd.dst_pitch_offset); + OUT_RING(dstpixmap->pitch_offset); OUT_RING(draw->color); - OUT_RING((y0<<16)|x0); + OUT_RING((x0<<16)|y0); OUT_RING((w<<16)|h); COMMIT_RING(); @@ -64,13 +67,16 @@ int DrawRect(draw_t* draw) safe_sti(ifl); } ; - return 0; + return ERR_OK; } int FillRect(fill_t *fill) { + pixmap_t *dstpixmap; int x0, y0, x1, y1; + dstpixmap = (fill->dstpix == (void*)-1) ? &scr_pixmap : fill->dstpix ; + x0 = fill->x; y0 = fill->y; @@ -99,7 +105,7 @@ int FillRect(fill_t *fill) RADEON_GMC_SRC_DATATYPE_COLOR | (1 << 28)+(1 << 30) | R5XX_ROP3_P); - OUT_RING(rhd.dst_pitch_offset); + OUT_RING(dstpixmap->pitch_offset); OUT_RING(fill->bkcolor); OUT_RING(fill->fcolor); @@ -114,7 +120,7 @@ int FillRect(fill_t *fill) safe_sti(ifl); }; - return 0; + return ERR_OK; } int Blit(blit_t *blit) @@ -167,7 +173,7 @@ int Blit(blit_t *blit) safe_sti(ifl); } ; - return 0; + return ERR_OK; } int Line2P(line2p_t *draw) @@ -225,11 +231,11 @@ int Line2P(line2p_t *draw) safe_sti(ifl); }; - return 0; + return ERR_OK; } -int CreatePixmap(new_pixmap_t *io) +int CreatePixmap(userpixmap_t *io) { pixmap_t *pixmap; @@ -241,7 +247,7 @@ int CreatePixmap(new_pixmap_t *io) (io->height == 0)|| (io->height > 2048)) { dbgprintf("Invalid pixmap size w:%d h:%d\n", io->width,io->height); - return 0; + return ERR_PARAM; }; @@ -252,37 +258,71 @@ int CreatePixmap(new_pixmap_t *io) if (! raw) { dbgprintf("Not enough memory for pixmap\n"); - return 0; + return ERR_PARAM; }; pixmap = malloc(sizeof(pixmap_t)); if(!pixmap) { rhd_mem_free(&rhd, RHD_MEM_FB,raw); - return 0; + return ERR_PARAM; } else { - io->pixmap = (u32_t)pixmap; - io->format = PICT_a8r8g8b8; - io->pitch = pitch; + io->pixmap = pixmap; + io->usermap = NULL; + io->format = PICT_a8r8g8b8; + io->pitch = 0; - pixmap->width = io->width; - pixmap->height = io->height; - pixmap->format = PICT_a8r8g8b8; - pixmap->pitch = pitch; - pixmap->offset = (u32_t)raw-rhd.FbBase+rhd.FbIntAddress; + pixmap->width = io->width; + pixmap->height = io->height; + pixmap->format = PICT_a8r8g8b8; + pixmap->flags = 0; + pixmap->pitch = pitch; + pixmap->offset = (u32_t)raw+rhd.FbIntAddress; pixmap->pitch_offset = ((pitch/64)<<22)| (pixmap->offset>>10); - pixmap->raw = raw; + pixmap->raw = raw; + pixmap->usermap = NULL; dbgprintf("pixmap.pitch_offset: %x\n", pixmap->pitch_offset); dbgprintf("width: %d height: %d\n",pixmap->width,pixmap->height ); dbgprintf("pixmap.offset: %x\n", pixmap->offset); } - return 1; + return ERR_OK; } +int LockPixmap(userpixmap_t *io) +{ + pixmap_t *pixmap; + size_t size; + void *usermap; + + dbgprintf("Lock pixmap %x\n", io->pixmap); + + if(io->pixmap == (pixmap_t*)-1) + return ERR_PARAM; + else + pixmap = io->pixmap; + + if(pixmap->flags & 1 == 1 ) + return ERR_PARAM; + + size = pixmap->pitch*pixmap->width; + if (usermap = UserAlloc(size)) + { + CommitPages(usermap, ((u32_t)pixmap->raw+rhd.PhisBase)|7|(1<<9), size); + pixmap->flags |= 1; + pixmap->usermap = usermap; + io->usermap = usermap; + io->pitch = pixmap->pitch; + dbgprintf("map at %x\n", io->usermap); + + return ERR_OK; + } + else + return ERR_PARAM; +}; int PixBlit(pixblit_t *blit) @@ -296,17 +336,17 @@ int PixBlit(pixblit_t *blit) pixmap_t *srcpixmap; pixmap_t *dstpixmap; - dbgprintf("Pixblit src: %x dst: %x\n",blit->srcpix, blit->dstpix); + //dbgprintf("Pixblit src: %x dst: %x\n",blit->srcpix, blit->dstpix); dstpixmap = (blit->dstpix == (void*)-1) ? &scr_pixmap : blit->dstpix ; srcpixmap = (blit->srcpix == (void*)-1) ? &scr_pixmap : blit->srcpix ; - dbgprintf("srcpixmap: %x dstpixmap: %x\n",srcpixmap, dstpixmap); + //dbgprintf("srcpixmap: %x dstpixmap: %x\n",srcpixmap, dstpixmap); - dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height); - dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); - dbgprintf("srcpitch: %x dstpitch: %x\n", - srcpixmap->pitch_offset,dstpixmap->pitch_offset); + //dbgprintf("dst.width: %d dst.height: %d\n", dstpixmap->width,dstpixmap->height); + //dbgprintf("src.width: %d src.height: %d\n", srcpixmap->width,srcpixmap->height); + //dbgprintf("srcpitch: %x dstpitch: %x\n", + // srcpixmap->pitch_offset,dstpixmap->pitch_offset); ifl = safe_cli(); @@ -325,16 +365,11 @@ int PixBlit(pixblit_t *blit) OUT_RING(srcpixmap->pitch_offset); OUT_RING(dstpixmap->pitch_offset); - // x0 = blit->src_x; - // y0 = blit->src_y; - // w = blit->w; - // h = blit->h; - OUT_RING((blit->src_x<<16)|blit->src_y); OUT_RING((blit->dst_x<<16)|blit->dst_y); OUT_RING((blit->w<<16)|blit->h); COMMIT_RING(); safe_sti(ifl); - return 0; + return ERR_OK; } diff --git a/programs/system/drivers/ati2d/ati2d.c b/programs/system/drivers/ati2d/ati2d.c index cf11f75283..265c8b4529 100644 --- a/programs/system/drivers/ati2d/ati2d.c +++ b/programs/system/drivers/ati2d/ati2d.c @@ -86,8 +86,6 @@ u32 __stdcall drvEntry(int action) }; -#define ERR_PARAM -1 - #pragma pack (push,1) #pragma pack (pop) @@ -140,12 +138,12 @@ int _stdcall srv_2d(ioctl_t *io) break; case DRAW_RECT: - if(io->inp_size==5) + if(io->inp_size==6) return DrawRect((draw_t*)inp); break; case FILL_RECT: - if(io->inp_size==8) + if(io->inp_size==9) return FillRect((fill_t*)inp); break; @@ -165,8 +163,8 @@ int _stdcall srv_2d(ioctl_t *io) break; case PIXMAP: - if(io->inp_size==5) - return CreatePixmap((new_pixmap_t*)inp); + if(io->inp_size==6) + return CreatePixmap((userpixmap_t*)inp); break; case PIXBLIT: @@ -174,6 +172,11 @@ int _stdcall srv_2d(ioctl_t *io) return PixBlit((pixblit_t*)inp); break; + case PIXLOCK: + if(io->inp_size==6) + return LockPixmap((userpixmap_t*)inp); + break; + default: return ERR_PARAM; }; @@ -184,7 +187,7 @@ int _stdcall srv_2d(ioctl_t *io) #include "init.c" #include "pci.c" #include "ati_mem.c" -#include "cursor.inc" +//#include "cursor.inc" #include "r500.inc" #include "accel_2d.inc" diff --git a/programs/system/drivers/ati2d/ati2d.h b/programs/system/drivers/ati2d/ati2d.h index 7f2d2aed9e..2db84affcc 100644 --- a/programs/system/drivers/ati2d/ati2d.h +++ b/programs/system/drivers/ati2d/ati2d.h @@ -109,7 +109,7 @@ typedef struct RHDRec CARD32 MMIOMapSize; CARD32 videoRam; - CARD32 FbBase; /* map base of fb */ +// CARD32 FbBase; /* map base of fb */ CARD32 PhisBase; CARD32 FbIntAddress; /* card internal address of FB */ CARD32 FbMapSize; @@ -178,13 +178,15 @@ typedef struct typedef struct { - u32_t width; - u32_t height; - u32_t format; - u32_t pitch; - u32_t offset; - u32_t pitch_offset; - u32_t *raw; + u32_t width; + u32_t height; + u32_t format; + u32_t flags; + u32_t pitch_offset; + u32_t pitch; + u32_t offset; + void* raw; + void* usermap; }pixmap_t; diff --git a/programs/system/drivers/ati2d/ati_mem.c b/programs/system/drivers/ati2d/ati_mem.c index 004348df30..addc2c60e8 100644 --- a/programs/system/drivers/ati2d/ati_mem.c +++ b/programs/system/drivers/ati2d/ati_mem.c @@ -162,7 +162,7 @@ static void free_block(struct mem_block *p) int rhdInitHeap(RHDPtr rhdPtr) { - int base = rhdPtr->FbBase + rhdPtr->FbFreeStart; + int base = rhdPtr->FbFreeStart; return init_heap(&rhdPtr->fb_heap, base, rhdPtr->FbFreeSize); }; diff --git a/programs/system/drivers/ati2d/common.h b/programs/system/drivers/ati2d/common.h index a598417fb8..c3133cf6d6 100644 --- a/programs/system/drivers/ati2d/common.h +++ b/programs/system/drivers/ati2d/common.h @@ -25,6 +25,7 @@ typedef unsigned int size_t; typedef struct { float hi, lo; } range; + typedef struct { unsigned handle; @@ -37,7 +38,11 @@ typedef struct typedef int (_stdcall *srv_proc_t)(ioctl_t *); -u32 __stdcall drvEntry(int)__asm__("_drvEntry"); +#define ERR_OK 0 +#define ERR_PARAM -1 + + +u32_t __stdcall drvEntry(int)__asm__("_drvEntry"); /////////////////////////////////////////////////////////////////////////////// @@ -49,8 +54,10 @@ u32 __stdcall drvEntry(int)__asm__("_drvEntry"); #define PG_SW 0x003 #define PG_NOCACHE 0x018 -CARD32 STDCALL AllocKernelSpace(unsigned size)__asm__("AllocKernelSpace"); -void* STDCALL KernelAlloc(unsigned size)__asm__("KernelAlloc"); +void* STDCALL AllocKernelSpace(size_t size)__asm__("AllocKernelSpace"); +void* STDCALL KernelAlloc(size_t size)__asm__("KernelAlloc"); +void* STDCALL UserAlloc(size_t size)__asm__("UserAlloc"); + int KernelFree(void *); void* STDCALL CreateRingBuffer(size_t size, u32 map)__asm__("CreateRingBuffer"); @@ -62,9 +69,9 @@ u32 STDCALL RegService(char *name, srv_proc_t proc)__asm__("RegService"); CARD32 STDCALL MapIoMem(CARD32 Base,CARD32 size,CARD32 flags)__asm__("MapIoMem"); -static inline u32 GetPgAddr(void *mem) +static inline u32_t GetPgAddr(void *mem) { - u32 retval; + u32_t retval; asm volatile ( "call *__imp__GetPgAddr \n\t" @@ -74,6 +81,28 @@ static inline u32 GetPgAddr(void *mem) return retval; } +static inline void CommitPages(void *mem, u32_t page, u32_t size) +{ + size = (size+4095) & ~4095; + asm volatile ( + "call *__imp__CommitPages" + : + :"a" (page), "b"(mem),"c"(size>>12) + :"edx" + ); + + +} +static inline void UnmapPages(void *mem, size_t size) +{ + size = (size+4095) & ~4095; + asm volatile ( + "call *__imp__UnmapPages" + : + :"a" (mem), "c"(size>>12) + :"eax","ecx", "edx" + ); +} /////////////////////////////////////////////////////////////////////////////// u32 PciApi(int cmd); diff --git a/programs/system/drivers/ati2d/init.c b/programs/system/drivers/ati2d/init.c index 2b8a59adc9..5affa409f7 100644 --- a/programs/system/drivers/ati2d/init.c +++ b/programs/system/drivers/ati2d/init.c @@ -60,10 +60,10 @@ rhdMapFB(RHDPtr rhdPtr) rhdPtr->FbMapSize = 1 << rhdPtr->memsize[RHD_FB_BAR]; rhdPtr->PhisBase = rhdPtr->memBase[RHD_FB_BAR]; - rhdPtr->FbBase = MapIoMem(rhdPtr->PhisBase, rhdPtr->FbMapSize,PG_SW+PG_NOCACHE); + // rhdPtr->FbBase = MapIoMem(rhdPtr->PhisBase, rhdPtr->FbMapSize,PG_SW+PG_NOCACHE); - if (!rhdPtr->FbBase) - return FALSE; + // if (!rhdPtr->FbBase) + // return FALSE; /* These devices have an internal address reference, which some other * address registers in there also use. This can be different from the @@ -80,7 +80,7 @@ rhdMapFB(RHDPtr rhdPtr) dbgprintf("PCI FB Address (BAR) is at " "0x%08X while card Internal Address is 0x%08X\n", (unsigned int) rhdPtr->PhisBase,rhdPtr->FbIntAddress); - dbgprintf("Mapped FB at %p (size 0x%08X)\n",rhdPtr->FbBase, rhdPtr->FbMapSize); + // dbgprintf("Mapped FB at %p (size 0x%08X)\n",rhdPtr->FbBase, rhdPtr->FbMapSize); return TRUE; } @@ -108,8 +108,8 @@ Bool RHDPreInit() rhd.FbScanoutStart = 0; rhd.FbScanoutSize = 8*1024*1024; - rhd.FbFreeStart = 8*1024*1024; - rhd.FbFreeSize = rhd.FbMapSize - 8*1024*1024; + rhd.FbFreeStart = 10*1024*1024; + rhd.FbFreeSize = rhd.FbMapSize - 10*1024*1024; rhdInitHeap(&rhd); return TRUE; diff --git a/programs/system/drivers/ati2d/r500.inc b/programs/system/drivers/ati2d/r500.inc index 5fcbdfd092..f00b9bb369 100644 --- a/programs/system/drivers/ati2d/r500.inc +++ b/programs/system/drivers/ati2d/r500.inc @@ -388,10 +388,10 @@ void R5xx2DInit() scr_pixmap.width = rhd.displayWidth; scr_pixmap.height = rhd.displayHeight; scr_pixmap.format = PICT_a8r8g8b8; - scr_pixmap.pitch = rhd.displayWidth * 4; + scr_pixmap.pitch = rhd.displayWidth * 4; scr_pixmap.offset = rhd.FbIntAddress; scr_pixmap.pitch_offset = rhd.dst_pitch_offset; - scr_pixmap.raw = (void*)rhd.FbBase; + scr_pixmap.raw = (void*)0; MASKREG(R5XX_GB_TILE_CONFIG, 0, R5XX_ENABLE_TILING);