Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 16. listopad 2009, 03:48:51 Předmět: OpenGL - Qt a problem s vlákny |
|
|
Dobrý den,
Začal jsem pracovat s OpenGL ve vláknech, hlavní vlákno pro vykreslování, a jedno vlákno pro načítání dat, kde taky používám gl funkce, třeba pro vytváření textůr, a zjistil jsem že mi každá gl funkce selže v tom načítacím vlákně.
Takže jsem hledal kde může být problém, a dočetl jsem se že pouze jeden gl kontext může být aktivní, a že je aktivní pro to vlákno ve kterém byl vytvořen, v mojem případě hlavní vlákno, takže musím pro každé vlákno zavolat makeCurrent abych udělal ten kontext aktivní pro to vlákno.
Jenže když zavolám QGLWidget::makeCurrent nebo QGLContext::makeCurrent tak ta funkce vždycky selže, glGetError vrátí chybu 1282, a Qt vypíše do debugu chybu "QGLContext::makeCurrent() : wglMakeCurrent failed: The requested resource is in use."
Věděl by někdo o jakou chybu se to jedná? nechápu totiž proč makeCurrent selže...
PS: Jinak jsem se taky koukal přímo na návod pro OpenGL ve vláknech, a tam volají makeCurrent uplně normálně přímo ve vlákně, viz:http://doc.trolltech.com/qq/qq06-glimpsing.html#creatingacustomqglcontext |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 16. listopad 2009, 04:09:18 Předmět: |
|
|
Nejdřív musíš kontext z jednoho vlákna odvázat, např. wglMakeCurrent(0, 0), pak ten kontext můžeš použít v jiném vlákně.
Druhá možnost je vytvořit v každém vlákně zvlášť kontext a sdílet si objekty pomocí wglShareLists (najdi si v Qt ekvivalentní funkci).
Třetí a nejlepší možnost je používat buffery v OpenGL 2.1, tj.
- vytvořit si prázdný buffer o potřebné velikosti
- zavolat glMapBuffer() pro získání pointeru do OpenGL bufferu
- tento pointer předat do načítacího vlákna a tam načíst texturu
- po skončení načítání zavolat glUnmapBuffer() z hlavního vlákna
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer); nastaví buffer pro čtení ve funkcích, které berou pixely
- glTexImage2D(..... , NULL); nulový pointer na data určuje, že se čte z OpenGL bufferu
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); // vrátí standardní chování OpenGL _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 16. listopad 2009, 04:30:22 Předmět: |
|
|
Jak tak koukám tak neponocuju sám díky za odpověd, hned si to vyzkouším. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 16. listopad 2009, 23:19:32 Předmět: |
|
|
V GL+Qt som pisal bakalarku, pockaj, hned sa na to pozriem a tento post doplnim. Podla mna sa jedna presne o problem zdielania kontextov.
Ok, takze v Qt 4.0 je viacero QGLWidget::QGLWidget() konstruktorov.
Jednym z parametrov je QGLWidget* shareWidget, do ktoreho ty narves uz existujucu instanciu QGLWidget (proste tu PRVU, ktoru si vobec vytvoril - pri jej konstrukcii to bude null). Toto spravis pre 2., 3., 4., ... widget a mas sharovanie kontextov.
Druha moznost je dalsi z konstruktorov, ktory chce priamo instanciu QGLContext. Takze si mozes najskor vytvorit vlastny kontext a potom ho pri vytvarani predat kazdemu z tvojich widgetov.
Bacha, presne ako pisu v prirucke, kontexty (a tym padom QGLWidgets) musia mat vzdy zhodny format, inak ti sharovat nebudu, no to je bezna vec.
Teraz si nie som isty, ale aby fungovalo to, co pise Eosie ako najlepsiu moznost, tak musis aj tak Qt widgets donutit, aby sharovali contexty. Manual je trochu nejednoznacny, pretoze primarne hovori o sharovani display listov, ale na inom mieste hovori o sharovani kontextov _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 16. listopad 2009, 23:52:42 Předmět: |
|
|
pcmaster napsal: |
Teraz si nie som isty, ale aby fungovalo to, co pise Eosie ako najlepsiu moznost, tak musis aj tak Qt widgets donutit, aby sharovali contexty. |
Sorry, asi jsem se nevyjádřil přesně. Druhý kontext v tomto případě nevytváří. V prvním vlákně namapuje buffer (glMapBuffer), pointer na něj pošle do druhého vlákna a až s ním v druhém vlákně skončí, tak ho v prvním vlákně zas odmapuje (glUnmapBuffer). Žádná gymnastika s více kontextama.
pcmaster napsal: |
Manual je trochu nejednoznacny, pretoze primarne hovori o sharovani display listov, ale na inom mieste hovori o sharovani kontextov |
wglShareLists je blbě pojmenovaný, sdílí všechny objekty, ne jenom display listy. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 16. listopad 2009, 23:56:16 Předmět: |
|
|
Vidis, tiez som si neprecital presne, co si napisal
A myslel som Qt manual pre QGLWidget, ale vidim, ze ma presne ten isty problem (tie nazvy).
Teraz, ked som si aj precital, co si napisal, tak sa mi to paci!
Problem je, ze ak by chcel mat viacero Qt GL widgetov (pripadne okien), kazde musi mat defaultne vlastny kontext a da sa to vyriesit ako som napisal ja a manual. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
|