Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 2. srpen 2010, 19:48:03 Předmět: Vlákna a synchronizace OpenGL |
|
|
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ěď |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 2. srpen 2010, 20:09:30 Předmět: |
|
|
Ja si myslim, ze je to fakt paralelne. A to tak, ze si driver sam potrebne veci serializuje 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 |
|
 |
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 2. srpen 2010, 20:14:36 Předmět: |
|
|
pcmaster napsal: |
Ja si myslim, ze je to fakt paralelne. A to tak, ze si driver sam potrebne veci serializuje 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é  |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 3. srpen 2010, 08:14:19 Předmět: |
|
|
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 |
|
 |
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 3. srpen 2010, 08:27:20 Předmět: |
|
|
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 |
|
 |
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 5. srpen 2010, 14:18:19 Předmět: |
|
|
Tak možná budu muset architekturu přehodnotit 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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 5. srpen 2010, 15:34:00 Předmět: |
|
|
#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 |
|
 |
klapauciusk
Založen: 08. 08. 2007 Příspěvky: 76
|
Zaslal: 5. srpen 2010, 21:09:59 Předmět: |
|
|
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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 7. srpen 2010, 14:18:39 Předmět: |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 7. srpen 2010, 23:55:30 Předmět: |
|
|
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 |
|
 |
|