Gönderen Konu: gp2x rlyeh's minimal lib  (Okunma sayısı 22335 defa)

gp2x rlyeh's minimal lib

« : 12.03.2007 17:40:37 »
Hızlı düğmeleri aç

jimqode

İleti: 215

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://
şu alette hardware'e biraz daha yakınlaşmanın vakti geldi gibi. Bu minimal library'yi kullanan varsa forumda kullandığınız versiyon nedir? rlyeh'in forumda byi çıkarttım diyor ama download linki bulamadım. Nerden indirelebilir.
/*
Planet Retro - Retrocomputing News and Blogs
*/

gp2x rlyeh's minimal lib

« Yanıtla #1 : 12.03.2007 23:22:48 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
stable:
http://www.emulnation.info/retrodev/forum/files/rlyeh's-minimal-library-v0.A.zip
preview:
 http://www.emulnation.info/retrodev/forum/files/rlyeh's-minimal-library-v0.B-preview.zip

7d6'da 0.c'nin betasini rlyeh'in bilgisi dahilinde isteyenlere vermistim, ama su anki betayi rlyeh'den istedigin takdirde gonderecektir.

bu arada, YUV sorunlari var 0.c'nin ancak rlyeh (ve ben) bir suredir yogun olmamizdan dolayi 2-3 aydir source uzerinde bir degisiklik olmadi..

gp2x rlyeh's minimal lib

« Yanıtla #2 : 13.03.2007 01:14:01 »
Hızlı düğmeleri aç

jimqode

İleti: 215

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://
Bir de mod calabilen bir kutuphane bilen var mi? Ben bulamadim da. Bendeki sdl "bilmiyorum bu formati" diyor.

Bu arada partiden beri ugrastigim gp2x portunun ilk oynanabilir halini caktirmadan bu threadin altina gizliyorum. Ahanda bunun icin lazim mod calmak. ;) Bu oyunu amigadan hatirlayanlar da olacaktir eminim. Grafik hatalarini simdilik gormezden gelin. Bir gecede o kadar cok grafigi yari boyuna kucultup piksel piksel uzerinden duzeltmem gerekti ki beynim hosafa dondu. Bi de 8 bite indirmek varki ooof of. Arkaplanin durumu hala cok kotu.

Sag tetik spinnerlari ceviriyor. ABXY butonlari ilgili pozisyondaki topu saliyor. Deneyenler kontroller hakkinda ne dusundugunu belirtebilirlerse cok sevinirim. Cunku bu oyunun orjinali mouse ile oynaniyor.

ahanda link:
http://www.symbolengine.com/download-manager.php?id=6
/*
Planet Retro - Retrocomputing News and Blogs
*/

gp2x rlyeh's minimal lib

« Yanıtla #3 : 13.03.2007 01:39:17 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
mikmod :)
guyfawkes'in ve ragnor'un konuyla ilgili dokuman/ornegi vardi diye hatirliyorum.

Alıntı yapılan: jimqode;13016
Bir de mod calabilen bir kutuphane bilen var mi? Ben bulamadim da. Bendeki sdl "bilmiyorum bu formati" diyor.

gp2x rlyeh's minimal lib

« Yanıtla #4 : 13.03.2007 01:41:04 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
bu arada konuyla alakali olarak bir aciklama (bu paketlerin icinden cikmiyor)

how does minilib handle memory
Alıntı
GP2X memory is 64 Mb (0x0000000-0x3FFFFFF)

Linux uses the first 32MB, and the upper 32MB is up to you.
However, not all the memory in the upper 32MB is free to use. Some parts are used as followed:

0x03000000 Video decoding firmware (currently 342812 bytes, but may change in size with various firmware releases)
0x03101000 Primary frame buffer (153600 bytes)
0x03381000 Secondary frame buffer (153600 bytes)
0x03600000 Sound buffer, atleast in SDL. Size depents on multiple factors. 16384 bytes should always be enough.
0x03D00000 ~ 0x03FFFFFF is reserved for internal buffers of MPEG H/W decoder.

It's insane trying to respect these protected areas at middle of the upper memory.
Minimal library does not support these reserved areas and sets a more efficent memory handling,
which gives you about 31 Mb of free RAM in a single block.

The new memory mapping follows:

RAM, TOP = 64 Mb
,----------------------------------
| 0x4000000 |
|           |   0x008000 (32,768 bytes)
|           |
|           |   reserved for 940t stack
| 0x3FF8000 |
|-----------+----------------------
| 0x3FF7FFF |
|           |   0x001000 (4,096 bytes)
|           |   940t/920t exchange area, non-cached
|           |   reserved for variables exchange (up to 1024 variables, 4 bytes long each).
| 0x3FF7000 |
|-----------+----------------------
| 0x3FF6FFF |
|           |   0x001000 (4,096 bytes)
|           |   dualcore FIFO buffers, non-cached
|           |   reserved for 1000 FIFO commands (4 bytes each long)+96 bytes buffer
| 0x3FF6000 |
|-----------+----------------------
| 0x3FF5FFF |  
|           |   0x006000 (24,576 bytes)
|           |   reserved for further usage, non-cached
| 0x3FF0000 |  
|-----------+----------------------
| 0x3FEFFFF |
|           |   0x004000 (16,384 bytes)
|           |   CURSOR layer, reserved
| 0x3FEC000 |
|-----------+----------------------
| 0x3FEBFFF |
|           |   0x072000 (466,944 bytes)
|           |   RGB layer, reserved
|           |   supports:
|           |   - 3 pages @ 320x240x16bits or,
|           |   - 6 pages @ 320x240x8bits or,
| 0x3F7A000 |
|-----------+----------------------
| 0x3F79FFF |
|           |   0x258000 (2,457,600 bytes) =
|           |   8 YUV layers * 1 YUV layer (0x4B000 bytes/layer)
|           |
|           |   optional YUV area, overwriteable for your own usage when not using YUV functions
| 0x3D22000 |
|-----------+----------------------
| 0x3F79FFF |
|   or...   |
| 0x3D27FFF |
|           |   variable size (depending if you override above YUV area)
|           |   usage: void *gp2x_dualcore_ram;
|           |
|           |   free memory
| 0x2000000 |
|-----------+----------------------
| ......... |
|           |   variable size
|           |
|           |   940t dualcore code (if using any) (optional)
| 0x2000000 |
|-----------+----------------------
| 0x1FFFFFF |
|            |    first 32 mbytes
|            |
|             |    usage: malloc()/free() from linux
| 0x0000000 |
`-----------+------------------------
RAM, BOTTOM = 0 Mb

gp2x rlyeh's minimal lib

« Yanıtla #5 : 13.03.2007 03:58:47 »
Hızlı düğmeleri aç

Ragnor

İleti: 901

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://ozanemirhan.blogspot.com
Sdl_mixer ve gp2x'te derleme ortamı oluşturmak üzerine yazılarım ama ne yazık ki gp2x yazım şu anda windows için geçersiz durumda, yine de gp2xtr.com'un wikisine bakarsan orada bir takım düzeltmeler yaptım, gerçi sen derleme ortamını kurmuşsun. Sdl_mixer yazımı plazma #2 (emin değilm 1'de olabilir) ve blogumda bulabilirsin. Ama sdl kullanmayacaksan tercihin mikmod olsun, yanlış hatırlamıyorsam. Ama yanlış hatırlıyorsam sdl_mixer kullanmış demektir, kodda şu anda elimin altında değil bakamıyorum, indirmeyede üşeniyorum :). Neyse bende pes ettim şu ryleh'in lib'ini bir deneyeceğim.

gp2x rlyeh's minimal lib

« Yanıtla #6 : 14.03.2007 16:05:07 »
Hızlı düğmeleri aç

jimqode

İleti: 215

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://
Çıldırıcam. Minimal library'de aşağıdaki basit kod ekranın aşağı yukarı yarısını boyuyor. ortada karmaşığı geçtim iki tane loop dışında hesap bile yok. Ama hepsi hepsi 29-30 fps alabiliyorum. Birşeyi yanlış mı yapıyorum ağalar beyler?

Kod: [Seç]
#include <stdio.h>

#include &quot;minimal.h&quot;


int
main (int argc, char* argv[])
{
    gp2x_init(1000, 16, 11025,16,0,60,1);
    long ticks=0;
    int x,y,r=0,fps=0;
    while(1)
    {
        for (y=50;y<190;y++) {
            for (x=50;x<270;x++) {
                gp2x_video_RGB[0].screen16[x+(y*320)]=gp2x_video_RGB_color15(255,y,0,0);
            }
        }
        fps++;
        if (ticks<gp2x_timer_read()) {
            printf (&quot;%d fps\n&quot;,fps);
            fps = 0;
            ticks = gp2x_timer_read()+1000;
        }
        gp2x_video_RGB_flip(0);
    }
}


void gp2x_sound_frame(void *blah, void *buff, int samples) {}
/*
Planet Retro - Retrocomputing News and Blogs
*/

gp2x rlyeh's minimal lib

« Yanıtla #7 : 14.03.2007 16:39:16 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
ilginc.. bir de sunu deneyebilirmisin? kafadan yazdim, umarim calisir..

Kod: [Seç]
#include &quot;minimal.h&quot;

int main(int argc, char *argv[]) {
    gp2x_init(1000, 16, 44100,16,1,60, 1);
    gp2x_timer_init(0);

    unsigned int ret = 1;
    unsigned long pad;

    register unsigned int x,y=0;
    unsigned short *ekran = (unsigned short *)gp2x_video_RGB[0].screen;

    while (ret) {
        gp2x_timer_start(0);
        for (y=50;y<190;y++) {
            for (x=50;x<270;x++) {
                ekran[x+y*320] = gp2x_video_RGB_color15(255,y,0,0);
            }
        }
        gp2x_timer_stop(0);

          pad = gp2x_joystick_read(0);
        if (pad & GP2X_START) ret=0;

        gp2x_video_RGB_flip(0);

        printf(&quot;%d %%\n&quot;, gp2x_timer_cpu_usage_per_frame(0));
    }
}

void gp2x_sound_frame(void *blah, void *buff, int samples) { }

ama sanirim ben normal kosullarda soyle bisi yazardim:
Kod: [Seç]
       for (y=190-50;y--;) {
            for (x=270-50;x--;) {
                register unsigned int foo = y+50;
                ekran[(x+50)+(foo*320)] = gp2x_video_RGB_color15(255,foo,0,0);
            }
        }

gp2x rlyeh's minimal lib

« Yanıtla #8 : 14.03.2007 16:53:33 »
Hızlı düğmeleri aç

jimqode

İleti: 215

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://
abi ilk yazdigin koddaki gp2x_timer fonksiyonlari 0.C'de gelmis sanirim. bendeki library 0.B. Bende derlemiyor ne yazik ki.
ilk kodunda facia flicker vardi. Sanirim flipten sonra screen pointer degistigi icin update etmek gerekiyordu. Asagidaki hale getirdim kodu.
Screen pointeri degiskende tutmak bir sey degistirmedi hiz olarak.
foo'yu registerda tutmak kodu biraz hizlandirdi 36 fps aliyorum su anda.
Normal hizi bu mudur? 8 bit mod daha mi hizli olur?
Abi sizin demo nasil bu kadar akici oluyor cildiricam :) (respect respect)
Kod: [Seç]
#include <stdio.h>

#include &quot;minimal.h&quot;


int
main (int argc, char* argv[])
{
    gp2x_init(1000, 16, 11025,16,0,60,1);
    long ticks=0;
    int x,y,r=0,fps=0;
    unsigned short *ekran;
    while(1)
    {
        ekran = (unsigned short *)gp2x_video_RGB[0].screen16;
    for (y=190-50;y--;) {
            for (x=270-50;x--;) {
                register unsigned int foo = y+50;
                ekran[(x+50)+(foo*320)] = gp2x_video_RGB_color15(255,foo,0,0);
            }
        }
        fps++;
        if (ticks<gp2x_timer_read()) {
            printf (&quot;%d fps\n&quot;,fps);
            fps = 0;
            ticks = gp2x_timer_read()+1000;
        }
        gp2x_video_RGB_flip(0);
    }
}


void gp2x_sound_frame(void *blah, void *buff, int samples) {}

/*
Planet Retro - Retrocomputing News and Blogs
*/

gp2x rlyeh's minimal lib

« Yanıtla #9 : 14.03.2007 17:09:07 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
evet, timer fonksiyonlari profiling islemleri icin (ozellikle amiga emulasyonu icin ihtiyacim vardi (gp2x_profile_exec)) eklendi 0.c'de..

daha dogru duzgun ornek code aksam gonderebilirim, su an yanimda mevcut degil.. ve mmuhack + hw blitter kullaninca hersey daha guzel oluyor :)

gp2x rlyeh's minimal lib

« Yanıtla #10 : 14.03.2007 17:13:53 »
Hızlı düğmeleri aç

jimqode

İleti: 215

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://
heyecanla bekliyorum :)
/*
Planet Retro - Retrocomputing News and Blogs
*/

gp2x rlyeh's minimal lib

« Yanıtla #11 : 14.03.2007 20:44:35 »
Hızlı düğmeleri aç

Ragnor

İleti: 901

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://ozanemirhan.blogspot.com
Kod: [Seç]
#include <stdio.h>

#include &quot;minimal.h&quot;


int
main (int argc, char* argv[])
{
    gp2x_init(1000, 16, 11025,16,0,60,1);
    long ticks=0;
    int x,y,r=0,fps=0;
    unsigned short *ekran=(unsigned short *)gp2x_video_RGB[0].screen16;
    while(1)
    {
    for (y=190-50;y--;) {
            for (x=270-50;x--;) {
                register unsigned int foo = y+50;
                ekran[(x+50)+(foo*320)] = gp2x_video_RGB_color16(255,foo,0);
            }
        }
        fps++;
        if (ticks<gp2x_timer_read()) {
            printf (&quot;%d fps\n&quot;,fps);
            fps = 0;
            ticks = gp2x_timer_read()+1000;
        }
        gp2x_video_RGB_flip(0);
    }
}


void gp2x_sound_frame(void *blah, void *buff, int samples) {}


Kodu birde şu şekilde dene istersen, yaptığım değişiklikler ekran pixellerinin pointer'ını while'dan önce tanımladım, birde color15 yerine color16 kullanıyorum. Açıkcası daha önce denemedim ama aklıma gelen yapılabilecek bir iki değişiklik bunlardı, işe yarar umarım.

gp2x rlyeh's minimal lib

« Yanıtla #12 : 14.03.2007 20:52:17 »
Hızlı düğmeleri aç

tesla

İleti: 426

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://
Hmm, hazır alakalı konular dönüyor bende 1-2 soru sıkıştırayım. Ama sadede  gelmeden önce biraz kafa şişircem :rolleyes:

 Wiki hardware blitter 'taki bilgiler ışığında gene aynı sayfada bulunan forum linki yardımı ile hardware blit yapabildik(comrade spritus :) ile). Yalnız linkteki forumda birden bire sanki bu konu ile uğraşan tüm adamları susturmuşlar, bıçak gibi kesilmiş  konuşmalar. :)  .. Neyse forumdaki örnek kodlar hardware blit yapmaya yeterli. Sorun şu ki; wiki sayfaları arasında bir tutarsızlık var.  ılk wiki linkindeki adam  bu kod  2. frame buffer 'ı  1. frame buffer'a kopyalar demiş. Ve
1. FrameBuffer = 0x3101000 ,  
     2. FrameBuffer =0x3101000 + 320*2*240    demiş.

Ama başka bir wiki sayfasında dediği üzere
1. FrameBuffer = 0x3101000
2. FrameBuffer = 0x3381000

Yani  0x3101000 + 320*2*240  ,  0x3381000'e eşit olmuyor.
2. FrameBuffer adreslerinde bir tutarsızlık var.

Biz örnek kodu 2. FrameBuffer 0x3381000 olacak şekilde ayarladık
ve blitter çalıştı. Bu durumu aynı sayfadaki talk kısmında ifade ettim ama bir geri bildirim alamadım kimseden.

Ama sorunlar bitmedi, hız forumda denildiği gibi 10 kat filan artmadı :) , sadece 20fps lik bir artış oldu.

Neyse bu kadar gevezelikten sonra asıl sorularımı sorayım.

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?

gp2x rlyeh's minimal lib

« Yanıtla #13 : 14.03.2007 21:20:36 »
Hızlı düğmeleri aç

GnoStiC


  • Ziyaretçi
@tesla: ok, ornegi hw blitter uzerine kurarim. :)

@ragnor:
buffer flip oldugunda pointer degisecegi icin while disinda olursa sadece tek bufferda islem yapilir. sonucta dolu ekran, siyah ekran gibi gosterilir ve bu sebeple de flicker..
Alıntı yapılan: Ragnor;13101
Kodu birde şu şekilde dene istersen, yaptığım
değişiklikler ekran pixellerinin pointer'ını while'dan önce tanımladım,

gp2x rlyeh's minimal lib

« Yanıtla #14 : 14.03.2007 21:48:13 »
Hızlı düğmeleri aç

jimqode

İleti: 215

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://
Bendeki sorunu cozdum. Sorun benim eşşek olmammış. -O3 ile compile ettim ve 88-90 FPS aldım. Herhalde alınabilecek olan anca budur. :) Yardımlarınız için teşekkürler.
/*
Planet Retro - Retrocomputing News and Blogs
*/