.[ ČeskéHry.cz ].
OpenGL - Qt a problem s vlákny

 
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
Crypton



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

PříspěvekZaslal: 16. listopad 2009, 03:48:51    Předmět: OpenGL - Qt a problem s vlákny Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



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

PříspěvekZaslal: 16. listopad 2009, 04:09:18    Předmět: Odpovědět s citátem

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
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: 16. listopad 2009, 04:30:22    Předmět: Odpovědět s citátem

Jak tak koukám tak neponocuju sám Smile díky za odpověd, hned si to vyzkouším.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



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

PříspěvekZaslal: 16. listopad 2009, 23:19:32    Předmět: Odpovědět s citátem

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 Smile
_________________
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
Marek



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

PříspěvekZaslal: 16. listopad 2009, 23:52:42    Předmět: Odpovědět s citátem

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 Smile

wglShareLists je blbě pojmenovaný, sdílí všechny objekty, ne jenom display listy.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



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

PříspěvekZaslal: 16. listopad 2009, 23:56:16    Předmět: Odpovědět s citátem

Vidis, tiez som si neprecital presne, co si napisal Very Happy
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! Smile

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
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