Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 21. prosinec 2010, 09:58:18 Předmět: Zamrznutí aplikace v renderu |
|
|
Zdarec,
potýkám se s problémem, že na některých ATI (4870 a vejš (10 > catalyst - na 9kovym se to nestavalo)) mi vytuhne render hnedka v začátku, z přechodu loadingu do vykresleni. U NV je to v pohodě, evidentně mi to vykreje driver, ale na ATI je to problem.
App jsem debugoval přes gDEBUg a ten nenašel nic, potom přes glslDevil a ten mi hlásí INVALID OPERATION hned po glDrawElements(...) -> viz http://nopaste.ceske-hry.cz/223221, kod renderu http://nopaste.ceske-hry.cz/223222, gDEBUG log http://nopaste.ceske-hry.cz/223219
Jelikož v dokumentaci se píše, že tuhle to háže jenom když je glDrawElements mezi glBegin a glEnd a taky
citace: |
GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an
enabled array or the element array and the buffer object's data store is currently mapped.
|
Pravděpodobně to bude ta 2há volba, ale já si kapánek nevím rady co s tím. Podle toho co jsem pochopil, tak odpojuju VBO který se ještě používá? Nemělo by to na sebe počkat? Opravdu to nechápu. Setkal jste se někdo s tím?
Jo, okno je multithreadovany, ale v případě renderu už je všechno načtený když se do něj přechází.
Ještě jeden takovej postřeh, gDEBUG mi háže chyby že používám funkce od VBO/FBO v jiným kontextu než jsem je inicializoval. Je to potenciální možnost že se mi ty pointery v 2hým vlákně ztratí?
A taky to sundá celej catalyst, asi tak, že v 7čkách se wokna přepnou na chvíli na ten integrovanej ovladač.
Asi jsem kouzelík, nechápu to.
Sorry za tak strašnej chaos. |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 21. prosinec 2010, 10:38:01 Předmět: |
|
|
S tymi vlaknami velmi opatrne. Ja odporucam vsetky OpenGL prikazy vzdy vykonavat len v jedinom (hlavnom) vlakne. Aj za cenu nejakeho zaobalenia a vlastnej fronty... A kontexty by nemali vadit, ak su spravne nasharovane. Tiez to ale neodporucam
Co sa tyka invalid operation, tak GL errory sa "kumuluju" tym stylom, ze ti tam ostane vzdy prvy Tj az zavolas glGetError, dostanes prvy error, pretoze dalsie potencialne errory ho uz neprepisali. Hned potom mozes zavolat dalsiu GL funkciu a ta ti vygeneruje error a ten ostane az kym nezavolas glGetError zase.
Napis si makro, ktore bude volat a spracovavat glGetError po kazdom GL prikaze, ci skupine prikazov a narvi to uplne vsade, hlavne do problemovych oblasti. A uvidis, kde je problem. Tie debuggovacie nastroje podla mna robia nieco podobne...
Posrat OpenGL a zhodit driver ci Win nie je zase az take zlozite, nic si z toho nerob  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 21. prosinec 2010, 10:41:31 Předmět: |
|
|
ok pcmaster, pohnuli jsme se dal, ten invalid uz se nedeje, zakladni pricinou toho ze to vytuhne je zavolani glUseProgramObjectARB(), ale jsem si 100% jistej ze ty pointery dostavam, zkusim to ziskani tech ptr dat do jednoho vlakna a uvidim. Asi to opengl neni tak thread safe jak jsem si myslel :/
EDIT: ziskavani pointeru pres wglGetProcAddress jsem rozhazel prakticky vsude kde to slo a vysledek je stejnej. Takze asi tema vice vlaknama to nebude. |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 21. prosinec 2010, 10:58:02 Předmět: |
|
|
OpenGL nie je VOBEC thread safe. Tie funkcie nie su ani thread-safe, ani re-entrant, ani nic!
wglGetProcAddress nemusis pouzivat. Odporucam nieco ako GLEE ci GLFW, co ti ulahci nacitanie vsetkeho. A nebudes musiet vsade zbytocne pisat ARB  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 21. prosinec 2010, 11:00:18 Předmět: |
|
|
DPC, dik, momentalne mam jakejsi glew? asi, zkusim to predelat a uvidime.. |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 21. prosinec 2010, 11:04:06 Předmět: |
|
|
GLEW som myslel GLFW je ine GLEW je OK. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 21. prosinec 2010, 11:11:50 Předmět: |
|
|
ok ok, tedka mi nekdo reknite, proc, kdyz nelokalizuju uniformy tak to jede? Kurva uz, 100vka segfaultu je lepsi nez toto :/ |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 21. prosinec 2010, 11:16:33 Předmět: |
|
|
Klud Skus resetnut komp. Aspon s NV ovladacmi je to obcas fakt nutne. A pre istotu si niekam daj nejake nv/ati example exe, ktore vzdy pusti, aby si si overil, ci ti este funguju vsetky veci -- na NV obcas nefunguju
Co je lokalizacia uniformov? Akoze prekladas nazvy na uniformach? Ok, vazne, ... hod glGetError za glUniformLocation a uvidis. Mas nabindovany program? _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 21. prosinec 2010, 11:22:52 Předmět: |
|
|
, kompl jsme resetovali, problem je jenom na ATI, NV nema problem. Schvalne aji nejaky dema jsme zkouseli ktery jely a mely podobny funkce. Debugujem to po siti, takze je to docela porod. Lokalizaci myslim
citace: |
iUniformShadowMap = glGetUniformLocationARB(MenuPH, "ShadowMap"); |
Jakmile vsechny uniformy vykomentuju, tak program se nekousne a jede. Takze WTF? To ten novej catalyst nepobere glUniform1i? Uz to vazne nechapu xD |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 21. prosinec 2010, 11:28:22 Předmět: |
|
|
A si si isty, ze ti to nehodi nijaky error?
Over si, ci ti glGetUniformLocation nevrati -1 (pripadne (uint)(-1)). Pretoze v tom pripade
a) dany uniform v shaderi nenasiel
b) dany uniform sice nasiel, ale pouziva ho len mrtvy kod, alebo sa nepouziva, tj sa nepouziva a ako keby tam nebol.
Ak je to -1, tak taky uniform nenaplnaj pomocou glUniform A za kazdu funkciu daj glGetError! A hlavne daj glGetError aj pred cele toto kriticke miesto. A uplne vsade. Tj over si, ci ti to prejde bez akehokolvek erroru az sem. Stavim sa, ze neprejde  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Naposledy upravil pcmaster dne 21. prosinec 2010, 11:30:42, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 21. prosinec 2010, 11:30:10 Předmět: |
|
|
jaj, sorry, to jsem zapomel napsat, -1 nevraci ani jedna, to uz me napadlo. Ocekuju to tou glGetError() a napisu |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 21. prosinec 2010, 11:31:37 Předmět: |
|
|
Tiez pozor na glUniform1i vs. glUniform1ui a podobne. Neodporucam ich nespravne kombinovat. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 21. prosinec 2010, 11:35:32 Předmět: |
|
|
uniform1ui? ani neznam uniform1i pouzivam jenom na poslani texturovaci jednotky pro sampler. Jeste kdyz jsme u toho, zatim to vsude v loadu vraci 0 ten glGetError(); jeste cekam na vysledky co to vraci pri renderu.
kód: |
{
glUseProgramObjectARB(MenuPH);
glActiveTextureARB(GL_TEXTURE4_ARB);
glBindTexture(GL_TEXTURE_2D, shadowMapID);
glUniform1iARB(iUniformShadowMap, 4);
glActiveTextureARB(GL_TEXTURE0_ARB);
return;
}
void Shader::BindTextures(GLuint tex, GLuint normalTex, GLuint specularTex)
{
glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, tex);
glUniform1iARB(iUniformDiffuseMap, 1);
glActiveTextureARB(GL_TEXTURE2_ARB);
glBindTexture(GL_TEXTURE_2D, normalTex);
glUniform1iARB(iUniformNormalMap, 2);
glActiveTextureARB(GL_TEXTURE3_ARB);
glBindTexture(GL_TEXTURE_2D, specularTex);
glUniform1iARB(iUniformSpecularMap, 3);
return;
}
void Shader::DisableMenuShader(void)
{
glActiveTextureARB(GL_TEXTURE0_ARB);
glUseProgramObjectARB(0);
return;
}
// binduju pri renderu
glEnableVertexAttribArrayARB(menuLighting.iUniformTangent);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, object[o].uTangentVBO);
glVertexAttribPointerARB(menuLighting.iUniformTangent, 3, GL_FLOAT, 0,0, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glEnableVertexAttribArrayARB(menuLighting.iUniformBiTangent);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, object[o].uBiTangentVBO);
glVertexAttribPointerARB(menuLighting.iUniformBiTangent, 3, GL_FLOAT, 0,0, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
//a ukonceni tam mam ;)
|
EDIT, hmm spickovy, v renderu to takvy uplne vsude vraci 0 :/ :/ |
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 21. prosinec 2010, 12:48:03 Předmět: |
|
|
pcmaster napsal: |
GLEW som myslel GLFW je ine GLEW je OK.
|
BTW: I GLFW má podporu pro extensions (glfwExtensionSupported, glfwGetProcAddress apod.), shodneme se však, že primární účel je kapánek jiný
(GLFW je navíc fakt bezvadná věc, vyzkoušejte!)
Jsem si vědom toho, že tento příspěvek má k tématu nulovou informační hodnotu, ale to má 90% příspěvků na C-H, takže to snad nevadí  _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 21. prosinec 2010, 14:08:09 Předmět: |
|
|
hmm, takze delaji to kombinace glGetUniformLocationARB a glUniform1iARB ktera pouziva to id lokace. Kdyz mam jenom jednu texturu tak to pokazde na ATI vrati 9ku a na Nvidii 0. Na Ati je dycky lag. Uz si zacinam myslet ze to snad musi bejt driver bug kua. |
|
Návrat nahoru |
|
 |
|