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: 29. říjen 2011, 04:13:11 Předmět: GLX vs WGL - Tvorba kontextu |
|
|
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 Díky za případné odpovědi. _________________
|
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. říjen 2011, 12:42:51 Předmět: |
|
|
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 |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 29. říjen 2011, 14:35:36 Předmět: |
|
|
Takže moje představa o tom, že na linuxech je jeden sdílený rendering kontext, byla předpokládám chybná... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. říjen 2011, 15:00:07 Předmět: |
|
|
Proč by tam měl být jen jeden kontext? Jak tě to napadlo? _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 29. říjen 2011, 15:24:47 Předmět: |
|
|
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 |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. říjen 2011, 16:32:24 Předmět: |
|
|
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 |
|
|
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 29. říjen 2011, 18:54:18 Předmět: |
|
|
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 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... _________________
|
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. říjen 2011, 21:53:10 Předmět: |
|
|
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 |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 30. říjen 2011, 01:02:36 Předmět: |
|
|
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 |
|
|
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 31. říjen 2011, 20:12:32 Předmět: |
|
|
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ý
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. _________________
|
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 1. listopad 2011, 10:03:31 Předmět: |
|
|
Crypton napsal: |
U WGL taky nepotřebuju okno abych vytvořil kontext. Potřebuju jen HWND a HDC, ale nemusí patřit oknu 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 |
|
|
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 1. listopad 2011, 11:01:59 Předmět: |
|
|
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
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 |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 1. listopad 2011, 18:20:01 Předmět: |
|
|
No, to som si aj myslel. Dufal som v zazrak _________________ 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: 1. listopad 2011, 19:49:34 Předmět: |
|
|
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 |
|
|
|