Ama başka bir wiki sayfasında dediği üzere
1. FrameBuffer = 0x3101000
2. FrameBuffer = 0x3381000
dogrusu bu..
1- En doğru hardware blit nasıl yapılır? Yukardaki karmaşıklık mmu hack yüzünden mi oluyor? (32 MB'ı bütün gibi ele almak)
2- SDL kullanmak istersek hangi paketi seçmeliyiz.
Ben şu ana kadar Full Devkit 2006/03/06 kullanıyordum. En geçerli olan bu sanıyordum?
1. SDL kullandigin icin, HW_SURFACE (uppermem) kullandigin surece sdl'de blit islemleri mmuhack ile (uppermem cacheleme) hizli olacaktir. (madde 2ye bak)
2. sectigin paket guzel ANCAK bildigim kadari ile o paket icinden cikan SDL lib'leri HW lib destekli degil. bu sebeple, o paketi kurduktan sonra HW blit destekli sdl lib'lerini kullandiginda sorun yasamazsin.
ayrica 2 farkli hw sdl lib'i var.. biri 6, digeri 16mb'lik sanirim.. (framebuffer size alloc size)
---
peki bunlari bir kenara atip, kendimiz hardware blit nasil yapariz?
aslinda olay oldukca kolay, zamaninda konu ile ilgili yapilan ve olayin zormus gibi gozumesine sebep olan tartismalarin ozu sudur ki;
elimizde bir hw blitter oldugunu biliyorduk ama bunun registerlarini set ettigimizde istedigimiz sonuc cikmiyordu.. paeryn sanirim FAST_IO 'yu set etmemiz gerektigini farkedinceye kadar herkes birseyler denedi..
simdii.. bu noktada, mame, noiz2a, SDL lib vs'nin source'larini cekip incelediginizde nasil yapildigini gorme sansiniz var..
ama ben yinede (biraz minilib uyumlu olarak ama tek basina calisabilecek sekilde) adim adim bir anlatayim;
1) once HW registerlara felan ulasmak icin memory device
memfd = open("/dev/mem", O_RDWR);
gp2x_memregl = (unsigned long *)mmap(0, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, memfd, 0xc0000000);
gp2x_memregs = (unsigned short *)gp2x_memregl;
gp2x_2dregs = (unsigned long *)mmap(0, 0x118, PROT_READ|PROT_WRITE, MAP_SHARED, memfd, 0xe0024000);
2) meshur blitter enable olayi
gp2x_memregs[0x90a >> 1] = 0xffff; // Enable all video and sound devices
gp2x_memregs[0x904 >> 1] |= (1 << 10); // Enable FASTIO for the hardware blitter
vee.. ve'si yok bu kadar
ornek bir code:
void hw_blit(unsigned short *src, int xc, int yc, int w, int h) {
unsigned short *dst;
unsigned short offset;
dst = (unsigned short*)[B]0x3101000[/B] + (yc*320) + xc;
offset = (unsigned short)((unsigned long)dst & 2);
gp2x_2dregs[MESGDSTCTRL] = (1 << 5) | (0 << 6) | (offset << 3);
gp2x_2dregs[MESGDSTADDR] = (unsigned long)dst & 0xfffffffc;
gp2x_2dregs[MESGDSTSTRIDE] = 320*2;
gp2x_2dregs[MESGSRCCTRL] = (1 << 8) | (1 << 7) | (1 << 5);
gp2x_2dregs[MESGSRCADDR] = [B]0x3101000[/B];
gp2x_2dregs[MESGSRCSTRIDE] = 64;
gp2x_2dregs[MESGPATCTRL] = 0;
gp2x_2dregs[MESGSIZE] = (h << 16) | (w << 0);
gp2x_2dregs[MESGCTRL] = (0 << 10) | (1 << 9) | (1 << 8) | 0xCC;
gp2x_2dregs[MESGSTATUS] = 0x0;
do {} while (gp2x_2dregs[MESGSTATUS] & 1);
}
bunu hardwaresiz yapmak isteseydi:
fb0 = open("/dev/fb0", O_RDWR);
void sw_blit(unsigned short *src, int xc, int yc, int w, int h) {
unsigned int x, y;
unsigned short *dst;
dst = fb0 + (yc*320) + xc;
for (y=0; y for (x=0; x *dst++ = *src++;
}
dst += 320-w;
}
}