.[ ČeskéHry.cz ].
Vlákna a synchronizace OpenGL

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



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 2. srpen 2010, 19:48:03    Předmět: Vlákna a synchronizace OpenGL Odpovědět s citátem

Zdravím,

mám více-vláknovou aplikaci, kde jsou dvě vlákna pro práci s grafikou. Jedno vlákno se stará o vykreslování a druhé vlákno o načítání dat do GPU. Komunikaci s OpenGL mám řešenou přes sdílení zdrojů, tj. dva contexty a spojení přes wglShareLists. Teď k otázce: musím volání OpenGL synchronizovat, když mám dva contexty? Tj. můžu najednou v prvním vlákně vykreslovat a opravdu paralelně v druhém vláknu nahrávat třeba geometrii do GPU? Nebo musí jedno vlákno vykreslit a v mezičase druhé vlákno nahrávat data?

Díky za odpověďSmile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



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

PříspěvekZaslal: 2. srpen 2010, 20:09:30    Předmět: Odpovědět s citátem

Ja si myslim, ze je to fakt paralelne. A to tak, ze si driver sam potrebne veci serializuje Very Happy Samozrejme pristup k sharovanym objektom si musis serializovat sam.

Ak sa tu ukaze Eosie, mohol by nam k tomu nieco povedat, isto bude vediet.
_________________
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
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 2. srpen 2010, 20:14:36    Předmět: Odpovědět s citátem

pcmaster napsal:
Ja si myslim, ze je to fakt paralelne. A to tak, ze si driver sam potrebne veci serializuje Very Happy Samozrejme pristup k sharovanym objektom si musis serializovat sam.


Já si to myslím také, nebo spíš to ukazuje pár testů, co jsem si zatím udělal, ale výsledek může být dílem náhody, proto se potřebuji ujistit.

pcmaster napsal:
Ak sa tu ukaze Eosie, mohol by nam k tomu nieco povedat, isto bude vediet.

To by bylo skvělé Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 3. srpen 2010, 08:14:19    Předmět: Odpovědět s citátem

dalsu moznostou je vytvorit v renderovacom vlakne buffer ten namapovat a tento pointer poslat do nahravacieho vlakna. v nom sa nacita dany obsah do namapovanej pamete. na to sa zase v rendrovacom vlakne odmapuje. takto mas len jedno vlakno ktore pristupuje k opengl.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 3. srpen 2010, 08:27:20    Předmět: Odpovědět s citátem

nou napsal:
dalsu moznostou je vytvorit v renderovacom vlakne buffer ten namapovat a tento pointer poslat do nahravacieho vlakna. v nom sa nacita dany obsah do namapovanej pamete. na to sa zase v rendrovacom vlakne odmapuje. takto mas len jedno vlakno ktore pristupuje k opengl.


Jj, tento přístup znám, ale naprosto se mi nehodí do architektury. Potřebuju mít oba přístupy maximálně nezávislé.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 5. srpen 2010, 14:18:19    Předmět: Odpovědět s citátem

Tak možná budu muset architekturu přehodnotit Sad Na NVidii, na všech testovaných kartách běží aplikace v pořádku, ale na žádné z testovaných ATI karet ne. ATI nějak nemůže rozdýchat to druhé vlákno. Aplikace běží, ale data nahraná v druhém vlákně do paměti nelze v prvním použít, jak kdyby korektně nefungoval wglShareLists.

Nesetkal se někdo s tímto problémem?

Strejda google mi také moc neporadil, většinou je otázka nezodpovězena, viz. např: http://forums.amd.com/devforum/messageview.cfm?FTVAR_FORUMVIEWTMP=Single&catid=347&threadid=114853
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 5. srpen 2010, 15:34:00    Předmět: Odpovědět s citátem

#klapauciusk - zkus zavolat glGetLastError po wglShareLists, jestli vrátí error code 170, tak se může jednat o tohle - žádný z kontextů zavolaných v wglShareLists nesmí být zrovna současný (wglMakeCurrent) na jiném vlákně, než z kterého je wglShareLists zavolaný.
Otázka je pak, proč to běží na NVidii (možná jde skutečně o driver bug, ale na NVidii - případně se nejedná o tohle, jen mě to napadlo).

Ještě jedna věc, nemůžeš zavolat wglMakeCurrent na jednom vlákně tak, abys jej "ukradl" druhému ... tedy musíš prvně na vlákně, na kterém zrovna běží kontext jej vypnout a poté na tom, na kterém ho chceš spustit zapnout.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
klapauciusk



Založen: 08. 08. 2007
Příspěvky: 76

PříspěvekZaslal: 5. srpen 2010, 21:09:59    Předmět: Odpovědět s citátem

Vilem Otte napsal:
#klapauciusk - zkus zavolat glGetLastError po wglShareLists, jestli vrátí error code 170, tak se může jednat o tohle - žádný z kontextů zavolaných v wglShareLists nesmí být zrovna současný (wglMakeCurrent) na jiném vlákně, než z kterého je wglShareLists zavolaný.
Otázka je pak, proč to běží na NVidii (možná jde skutečně o driver bug, ale na NVidii - případně se nejedná o tohle, jen mě to napadlo).

Ještě jedna věc, nemůžeš zavolat wglMakeCurrent na jednom vlákně tak, abys jej "ukradl" druhému ... tedy musíš prvně na vlákně, na kterém zrovna běží kontext jej vypnout a poté na tom, na kterém ho chceš spustit zapnout.


S tím problém nebude, vše je v pořádku. Error code je 0 a kontexty si nekradu.

gDEBuger mi hlásí
"Detected error: The debugged process asked for an extension function pointer (glActiveTexture) from one render context, but called this function pointer in another render context (context #1)"
stejně mi to pak řve pro glBindBuffer, glEnableVertexAttribArray, glVertexAttribPointer, glClientActiveTexture, glDisableVertexAttribArray. Nejsem si ale jist že to s chybou přímo souvisí :/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 7. srpen 2010, 14:18:39    Předmět: Odpovědět s citátem

Takže by mohlo jít o toto - na jednom vlákně máš v kontextu aktivovanou jistou texturovací jednotku připojený jistý buffer (VBO/TBO/...), zkus buffer vypnout na prvním vlákně předtím než ho na druhém zapneš (myslím že glBindBuffer(GL_..., 0) by to mělo udělat, u glActiveTexture zkus dát do parametru 0 nebo NULL - teď si nevzpomenu jak přesně se to dělá) a vše vypnout přes glDisable(...)

Nevím jestli se tohle musí, ale driver může řvát.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
nou



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

PříspěvekZaslal: 7. srpen 2010, 23:55:30    Předmět: Odpovědět s citátem

dalsie odporucanie je vytvorit tie dva kontexty hned po sebe aby este nic neobsahovali.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
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 -> 3D API / 3D Enginy Č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