.[ ČeskéHry.cz ].
GLX vs WGL - Tvorba kontextu

 
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: 29. říjen 2011, 04:13:11    Předmět: GLX vs WGL - Tvorba kontextu Odpovědět s citátem

Zdravím ve spolek,

začal jsem portovat svou hru pro Linux, a všimnul jsem si že u GLX je postup pro vytvoření okna aplikace a OpenGL kontextu opačný oproti WGL.

U WGL vytvářím nejprve okno a pak kontext, a když jsem se koukal na příklady pro GLX, tak tam vždy nejprve zjišťuji XVisualInfo pomocí nějaké GLX funkce, pak vytvářejí kontext, a nakonec to okno.

Nechtěl bych ten kód celý překopávat, je toho fakt hodně, proto by mě zajímalo, jestli by ten postup vytváření kontextu u GLX nešel přispůsobit tak, aby byl kompatibilní s postupem pro WGL (tj. jestli bych nemohl vytvořit nejprve okno, a až při vytváření kontextu mu nastavit XVisualInfo).

Rěšili jste to už někdy někdo Question Díky za případné odpovědi. Wink
_________________
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: 29. říjen 2011, 12:42:51    Předmět: Odpovědět s citátem

No tak prostě vytvoříš nejdřív kontext a potom okno. Ten GLX způsob je lepší, protože nepotřebuješ okno k tomu, abys mohl používat GPU.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 29. říjen 2011, 14:35:36    Předmět: Odpovědět s citátem

Takže moje představa o tom, že na linuxech je jeden sdílený rendering kontext, byla předpokládám chybná... Question
_________________
Opravdovost se pojí s trýzní...
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: 29. říjen 2011, 15:00:07    Předmět: Odpovědět s citátem

Proč by tam měl být jen jeden kontext? Jak tě to napadlo?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 29. říjen 2011, 15:24:47    Předmět: Odpovědět s citátem

Z mé hlavy to nepochází...někde jsem to tuším kdysi četl...ale teď když se to pokouším najít, tak to nějak není k nalezení...
Asi nějaký nedůvěryhodný zdroj...
_________________
Opravdovost se pojí s trýzní...
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: 29. říjen 2011, 16:32:24    Předmět: Odpovědět s citátem

No některý GPU mají jen jeden kontext, ale to je asi jako když CPU má jedno jádro... furt tam můžeš běžet neomezeně vláken. Stejný je to s kontextama. Koneckonců, vlákno je taky kontext (je to CPU kontext).
_________________
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: 29. říjen 2011, 18:54:18    Předmět: Odpovědět s citátem

Eosie napsal:
No tak prostě vytvoříš nejdřív kontext a potom okno. Ten GLX způsob je lepší, protože nepotřebuješ okno k tomu, abys mohl používat GPU.


U WGL taky nepotřebuju okno abych vytvořil kontext. Potřebuju jen HWND a HDC, ale nemusí patřit oknu Smile Jak už jsem zjistil... A tím nemyslím kontext pro bitmapu/pixmapu.

Nicméně mi jde o to, že mám vytvořené třídy Window, GraphicsContext a RenderContext. Vše mám od sebe izolované:

Třída CWindow:
Win: HWND
Linux: Display, Window

Třída CGraphicsContext:
Win: HDC
Linux: GraphicsContext

Třída CRenderContext:
Win: HDC, HGLRC
Linux: Display, GLXDrawable, GLXContext

Takže bych to musel celé překopat. Proto se ptám jestli to už někdo neřešil...

P.S. Našel jsem tohle: http://msdn.microsoft.com/en-us/library/dd368991%28v=vs.85%29.aspx
Ale taky tam zmiňují opačný postup... Rolling Eyes
_________________
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: 29. říjen 2011, 21:53:10    Předmět: Odpovědět s citátem

Všechno sluč do jedné třídy.

Je vidět, žes to navrhoval těsně kolem WinAPI. Co když jednou budeš implementovat platformu, která ani okno ani nedejbože GDI mít nebude?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1536
Bydliště: u Prahy

PříspěvekZaslal: 30. říjen 2011, 01:02:36    Předmět: Odpovědět s citátem

Souhlas, do jedné třídy (CRenderWindow). Když něco obaluješ do svých tříd, udělej je trochu high-level. Jinak máš zbytečný problémy při portování, protože API a knihovny často nemaj funkce 1:1.
_________________
Award-winning game 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: 31. říjen 2011, 20:12:32    Předmět: Odpovědět s citátem

Eosie napsal:
Všechno sluč do jedné třídy.

Je vidět, žes to navrhoval těsně kolem WinAPI. Co když jednou budeš implementovat platformu, která ani okno ani nedejbože GDI mít nebude?


Právě že jsem myslel na Linux už když jsem psal ten kód pro Win, a zkontroloval jsem si jestli je možné to takhle rozdělit. Jenže mě vůbec nenapadlo že ten postup vytvoření kontextu je opačný.

S portováním ostatních tříd (e.g. Window, Thread, Mutex, ConditionVariable, RWLock, WaitableTimer, etc) jsem takový problém zatím neměl.

Ohledně jiných platforem, neplánuju nic jiného než Win a Linux. MacOS mě nijak nezajímá, a na SDKčka pro herní konzole nejsem dostatečně bohatý Wink

Ladis napsal:
Souhlas, do jedné třídy (CRenderWindow). Když něco obaluješ do svých tříd, udělej je trochu high-level. Jinak máš zbytečný problémy při portování, protože API a knihovny často nemaj funkce 1:1.


Vidíš, to je dobrý nápad, udělat novou třídu CRenderWindow (jen zdědím CWindow), a přidat tam metodu pro vytvoření okna která, kromě původní parametrů, bude mít taky parametry pro vytvoření render contextu. Takhle si můžu řídit ten postup inicializace podle sebe.

Problém (líně) vyřešen. Twisted Evil
_________________
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: 1. listopad 2011, 10:03:31    Předmět: Odpovědět s citátem

Crypton napsal:
U WGL taky nepotřebuju okno abych vytvořil kontext. Potřebuju jen HWND a HDC, ale nemusí patřit oknu Smile Jak už jsem zjistil... A tím nemyslím kontext pro bitmapu/pixmapu...

Toto ma velmi zaujima, ako sa teda konkretne da vyrobit HGLRC? Nejaky priklad, prosim?
_________________
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
Crypton



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

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

pcmaster napsal:
Toto ma velmi zaujima, ako sa teda konkretne da vyrobit HGLRC? Nejaky priklad, prosim?


No je to vlastně stejný postup, akorád že místo okna použiješ nějakou komponentu, jako třeba label, takže nemusíš mít vytvořené okno a ani registrovat třídu (RegisterClass/Ex).

Takový minimalistický kontext se dá normálně používat, ale spíše se hodí pro zjišťování informací o driveru, hardwaru, a při zjišťování adres glXXX funkcí, před vytvořením plnohodnotného OpenGLv3 kontextu Smile

Funkční kód:
kód:
HWND hWnd = CreateWindowA("STATIC", NULL, WS_POPUP, 0, 0, 0, 0, NULL, NULL, 0, NULL);

HDC hDC = GetDC(hWnd);

PIXELFORMATDESCRIPTOR pfd = {0};
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;

INT iFormat = wglChoosePixelFormat(hDC, &pfd);
wglSetPixelFormat(hDC, iFormat, &pfd);

HGLRC hRC = wglCreateContext(hDC);

_________________
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: 1. listopad 2011, 18:20:01    Předmět: Odpovědět s citátem

No, to som si aj myslel. Dufal som v zazrak Very Happy
_________________
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: 1. listopad 2011, 19:49:34    Předmět: Odpovědět s citátem

Bohužel WGL API má pod kontrolou Mrkvosoft a ten se tam nechystá nic měnit.
_________________
AMD Open Source Graphics Driver Developer
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