.[ ČeskéHry.cz ].
Přehození vlastního a SDL framebufferu

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 6. listopad 2011, 19:46:25    Předmět: Přehození vlastního a SDL framebufferu Odpovědět s citátem

Zdravím, vykresluji si do vlastního bufferu a řeším problém, jak elegantně a pokud možno rychle prohodit framebuffery. Původně jsem chtěl nějak jednoduše zkopírovat data přes memcpy() - formát pixelu 32 bit RGBA - ale je tu problém, data pixelu jsou v SDL uložené ve struktuře, takže RGBA hodnoty nejsou uložené jako jeden blok paměti. Můžu to přes cykly for "vyseparovat" bod po bodu, ale to mně přijde jako hodně pomalé a neefektivní... Existuje ještě nějaký lepší postup, o kterém nevím? Předem díky za odpovědi, costa
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 6. listopad 2011, 22:54:53    Předmět: Odpovědět s citátem

v akej strukture. SDL ma framebuffer ulozeny sice v struct SDL_Surface ale ta obsahuje void *pixels. takze nevidim problem s memcpy. samozrejme traba pouzit SDL_LockSurface() a potom Unlock
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 6. listopad 2011, 23:50:43    Předmět: Odpovědět s citátem

Takže void *pixels ukazuje na pole pouze RGBA hodnot, pokud nastavím bpp u surface na 32 bit? Nemusím řešit žádné masky jednotlivých složek a pod?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 7. listopad 2011, 01:45:19    Předmět: Odpovědět s citátem

A masky jsou nějaký problém? To ti jenom říká, kde je jaká barva v paměti.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 7. listopad 2011, 07:03:11    Předmět: Odpovědět s citátem

On to chce ale zřejmě zkopírovat jako raw data, bez nutnosti konverze či swapování kanálů u jednotlivých pixelů.

Nevím jak je to u SDL, ale řekl bych že ten interní formát toho surfacu bude BGRA a nebo ABGR, takže jedině to kopírovat po pixelech.

Jestli jsou ty pixel formáty shodné, a chceš to kopírování ještě (až nechutně) urychlit, tak si zapni ve VS podporu pro SIMD SSE2, přes příkaz "/arch: SSE2", a nebo si najdi na webu memcpy pro SSE2. Twisted Evil
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 7. listopad 2011, 09:42:23    Předmět: Odpovědět s citátem

Ještě je tu jedna možnost.... Vytvořím si pomocný SDL buffer pomocí SDL_CreateRGBSurfaceFrom(), a pak prohodím jednoduše 2 SDL buffery...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 9. listopad 2011, 16:30:27    Předmět: Odpovědět s citátem

Zdravím, ještě bych se rád vrátil k tomuto tématu... Když jenom zkopíruju data z mého bufferu do SDL bufferu (oba by měly hodnoty jednotlivých složek RGBA uloženy stejně), tak ve výsledku se zobrazí pouze stupně šedi, tzn od bílé po černou... Nevíte, kde by mohl být problém, resp. nesetkal se někdo s něčím podobným?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 9. listopad 2011, 17:30:36    Předmět: Odpovědět s citátem

kod ako to kopirujes?
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 9. listopad 2011, 18:43:22    Předmět: Odpovědět s citátem

memcpy(surface->pixels, buffer, (width*height*sizeof(int)))
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 11. listopad 2011, 17:08:18    Předmět: Odpovědět s citátem

Tak problém částečně vyřešený, memset() "konvertuje" int na unsigned char, což v důsledku znamená, že z čísla 0x1234abcd najednou vznikne číslo 0xcdcdcdcd, což je ten buffer ve stupních šedi Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1824

PříspěvekZaslal: 11. listopad 2011, 19:30:32    Předmět: Odpovědět s citátem

Pouzi napriklad
kód:
std::fill_n<uint*, size_t, uint>((uint*)pole, (size_t)pocet, (uint)0x12345678);

_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
costa



Založen: 10. 10. 2011
Příspěvky: 29
Bydliště: u hranic s malým 'h'

PříspěvekZaslal: 11. listopad 2011, 20:50:11    Předmět: Odpovědět s citátem

Díky za odpověď, píšu v pure C Smile .. Vyřešil jsem to cyklem for a memcpy, doufám že to nebude na rychlost až tak kritické Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna