.[ ČeskéHry.cz ].
ATI/AMD shader problémy.

 
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
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 22. červenec 2012, 17:09:21    Předmět: ATI/AMD shader problémy. Odpovědět s citátem

Nazdar,

dostal jsem se do fáze testování na různejch sestavách a jako naprosto neočekávané překvapení bylo, že některý fíčurky blbnou nebo případně naprosto nefungují nebo způsobují segfault pod grafikama ATI/AMD.

Předem upozorňuji, aplikace je odladěná v gDebuggeru aby nevykazovala žádný opengl a jiný chyby.
Shadery jsou pro jistotu zkompilovaný pod GPU ShaderAnalyzer od AMD.
Drivery poslední na každé sestavě.
Všechny tyto problémy se nevyskytují na novějším HW nebo na Nvidiích.

1) Problém stínů s PCF, tento problém se vyskytuje jenom na 4kkové řadě HD radeonů.

Moje konfigurace je následující, shadowmapa je vytvořená s GL_LINEAR filtrem - vím, pod catalystem nefunguje bilineární filtrování, ale GL_NEAREST na to nemá vliv. Extenze jsou podporovány pro shadow2Dproj.

Problémový kód PCF filtru:
kód:

     float lookup(vec2 offset, vec4 coord)
     {
         vec2 pixoffset = vec2(1.0/4096.0); // mění se podle velikosti shadowmapy.
         return shadow2DProj(ShadowMap, coord + vec4(offset.x * pixoffset.x * coord.w, offset.y * pixoffset.y * coord.w, 0.05, 0.0)).w;
     }

        float shadow = 1.0;
        if(gl_TexCoord[1].w > 1.0)
        {
            float x,y;
            for (y = -1.5 ; y <=1.5 ; y+=1.0)
                for (x = -1.5 ; x <=1.5 ; x+=1.0)
                    shadow += lookup(vec2(x,y), gl_TexCoord[1]);
           
            shadow /= 16.0;
        }
        shadow = clamp(shadow+0.6, 0.0, 1.0);

Upřímně, nevím proč to pod ATI nefunguje.
Když udělám obyčejnej fetch z textury bez filtrování, stíny fungují.

2) Chybějící modely při instancingu
Překročenej počet instancí v uniform poli, vyřešilo ARB_instanced_arrays a při nepodpoře klasickej render přes cykl.

3) Random segfault, pravděpodobně glActiveTextureARB

Tady bude nejspíš chyba na mojí straně, jenže je tu zase ale :). Předpokládal jsem, že pokud by byla někde chyba v kódu globálně, měl bych dostat v debuggeru INVALID_ENUM bez nějakejch keců. Tato chyba nevyběhne ani na jedné z testované sestavě kromě jedné ATI 4850, na které to způsobí spadnutí driverů do a OS je musí restartovat. Při delším debugu jsem zjistil, že to nejspíš spadne na funkci glActiveTextureARB(unknown) tak teď si nejsem jistý, jestli mám zase rozhrabat 3/4 kódu kde se vyskytuje tato funkce, nebo je to rádoby problém těch ovladačů.

Jo, tato chyba nastane okolo 3s od spuštění základní herní smyčky, takže až v několikátým průchodu toho kódu.

S prvním a druhým problémem se pravděpodobně vyrovnám bez problémů, ale ten poslední, nějaké nápady?

Dík.
_________________
Jeden z vývojářů hry Grenade Madness.


Naposledy upravil Játro.m dne 22. červenec 2012, 20:39:05, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 22. červenec 2012, 18:36:27    Předmět: Odpovědět s citátem

2) http://www.opengl.org/discussion_boards/showthread.php/167784-ati-and-shadow-texture-lockups

3) ak to na inych ATI kartach funguje tak by som proste skusil updatnut ovladace. EDIT: aha najnovsie ovladace. dost mozne bug v ovladacoch.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 23. červenec 2012, 11:22:04    Předmět: Odpovědět s citátem

OT: Rada HD 4xxx a starsi uz nemaji primou podporu v nejnovejsich ovladacich (treba standartni Catalyst 12.6 necha puvodni ovladac a updatne jen SW okolo). Je potreba Catalyst 12.6 legacy.
Krom toho mam HD 4870 a pokud necham v Catalystech povoleny Catalyst AI, tak mi pada napriklad Cinema 4D (OpenGL) -> ty ovladace vazne budou mit nejaky problem.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 23. červenec 2012, 19:21:20    Předmět: Odpovědět s citátem

Dík za odpovědi, už jsem z toho zoufalej. Vezmu to tentokrát pozpátku.

3) Padání a problémy pod ATI
Drivery poslední - 12.6 legacy;
Catalyst AI - vypnutí způsobilo, že se začaly objevovat chyby jako:
citace:

Objevuje se jenom s puštěným multisamplingem na jeden FBO, tu neřeším
Reason OpenGL Error
glBlitFramebufferEXT(0 , 800 , 0 , 600 , 0 , 0 , 600 , 600 ,GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT , GL_NEAREST) - GL_INVALID_OPERATION

Vybíhá permanentně, horší je, že na ani jedné sestavě krom té ATI4850 se nevyskytuje.
Reason OpenGL Error
glInterleavedArrays(GL_T2F_V3F , 0 , 0x0022FD50) - GL_INVALID_FRAMEBUFFER_OPERATION


Po tomhle mám sto chutí tu sestavu vzít a zapálit.
Nápady? :D

1) Nefungující PCF filtr

Filtr 4x4 nepřicházel pod ATI v úvahu, když jsem udělal následující test, jestli to vůbec funguje, tak jsem zjistil, že nefunguje.

Vzal jsem funkci lookup kterou jsem posílal hned na začátku.
citace:


float lookup(vec2 offset, vec4 coord)
{
vec2 pixoffset = vec2(1.0/4096.0); // mění se podle velikosti shadowmapy.
return shadow2DProj(ShadowMap, coord + vec4(offset.x * pixoffset.x * coord.w, offset.y * pixoffset.y * coord.w, 0.05, 0.0)).w;
}



Udělal jsem:
citace:

float shadow = lookup(vec2(0.0), gl_TexCoord[1]);



Jak jsem očekával, stíny nikde, kdežto, samozdřejmě na dvou ostatních NV to fungovalo.

Tak jsem chvíli laboroval, dosadil si do funkce, vyšlo mi, že jediný co se děje, tak že se přičítá 0.05 na z.

citace:

shadow2DProj(ShadowMap, coord + vec4(0.0 * pixoffset.x * coord.w, 0.0 * pixoffset.y * coord.w, 0.05, 0.0)).x;


Tak jsem jako poslední zoufalej krok vzal čistě funkci:
citace:

float shadow = shadow2DProj(ShadowMap, gl_TexCoord[1]).x;


A stíny byly na světě, teď k tomu podstatnýmu, funkce je obšlehnutá z nějakýho dema na fabiensanglard.net, jejich demo jsem vzal a testoval, fungovalo všude, zase kromě naší milované 4850ky.

Tak do dop*dele co už dělám špatně, že mi ta jeb*a nerenderuje ty stíny vyhlazený?
Jestě jsem chtěl říct, že texturovací koordinát je uloženej v gl_TexCoord[1], tak jestli to ta ATI bere jako READ only proměnnou, že se mi to při modifikaci podělá.
Jiná maska .x,.y,.z,.w u shadow2Dproj neudělá žádnou změnu.

Nějaké nápady ?
_________________
Jeden z vývojářů hry Grenade Madness.
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: 23. červenec 2012, 21:31:08    Předmět: Odpovědět s citátem

Ani u free hry tě nemusí trápit, že nejede na <1 % HW, ani u komerční (vrátíš těm pár lidem peníze). Nikdy ti to nepojede na 100 % počítačích splňujících parametry. Beztak řešíš tehdejší high-end grafiku do desktopu, tj. její první majitelé už ji dávno prodali a koupili si novější (a druzí majitelé už moc her nekupujou, když batslej počítač z použitejch starejch součástek).
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 23. červenec 2012, 21:57:11    Předmět: Odpovědět s citátem

Ladis napsal:
Ani u free hry tě nemusí trápit, že nejede na <1 % HW, ani u komerční (vrátíš těm pár lidem peníze). Nikdy ti to nepojede na 100 % počítačích splňujících parametry. Beztak řešíš tehdejší high-end grafiku do desktopu, tj. její první majitelé už ji dávno prodali a koupili si novější (a druzí majitelé už moc her nekupujou, když batslej počítač z použitejch starejch součástek).


Bohužel máš pravdu, ale přece jenom, než budu mít v plánu to vypustit do světa, tak bych se rád vyvaroval všech vedlejších problémů který můžu vyřešit teď, dokud je to jenom betaverze kterou mají 4 lidi.

Z5 k problému, GL_INVALID_FRAMEBUFFER_OPERATION vypadá na bug v driveru, fbo se při vytvoření hlásí jako vpořádku vytvořený, není inkompletní. Uvidíme.

Zase jsem ale při tomhle ladění zjistí, jak moc udělal chyb u sebe a co všechno vykrejou zlatý ovladače Nvidií.

A stíny vyřeší bohužel makro v shaderu.
_________________
Jeden z vývojářů hry Grenade Madness.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 23. červenec 2012, 22:41:48    Předmět: Odpovědět s citátem

Játro.m napsal:
Zase jsem ale při tomhle ladění zjistí, jak moc udělal chyb u sebe a co všechno vykrejou zlatý ovladače Nvidií.

jeden vyvojar sa na fore opengl.org vyjadril ze ak to ma behat na obydvoch GPU tak radsej vyvija na ATI. pretoze maju dost striktne ovladace a ked to teda beha na ATI tak to bude takmer na 100% behat aj na nVidii.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
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: 24. červenec 2012, 01:55:38    Předmět: Odpovědět s citátem

Játro.m napsal:
Reason OpenGL Error
glBlitFramebufferEXT(0 , 800 , 0 , 600 , 0 , 0 , 600 , 600 ,GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT , GL_NEAREST) - GL_INVALID_OPERATION

Tento error je korektní - vypadá to, že jsi prohodil 2. a 3. parameter, což by v tomto případě nemělo projít.

Játro.m napsal:
Vybíhá permanentně, horší je, že na ani jedné sestavě krom té ATI4850 se nevyskytuje.
Reason OpenGL Error
glInterleavedArrays(GL_T2F_V3F , 0 , 0x0022FD50) - GL_INVALID_FRAMEBUFFER_OPERATION

Určitě zkontroluj, jestli máš správně nastavený DRAW_BUFFER pomocí glDrawBuffer[s]. Také si projdi specifikaci OpenGL - měla by přesně popisovat, za jakých okolností k tomu erroru může dojít.

Dále bych doporučil používat GL_ARB_debug_output, které by ti mělo dát podrobnější hlášení o chybě.

Na další problémy řešení nemám. Pokud jsi ten kód někde obšlehl, tak se nedivím, že ti najednou přestal fungovat. Twisted Evil
_________________
AMD Open Source Graphics Driver Developer
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: 24. červenec 2012, 02:03:27    Předmět: Odpovědět s citátem

Podíval jsem se k nám do kódu v driveru a vyhazujeme tam GL_INVALID_FRAMEBUFFER_OPERATION pouze když READ_FRAMEBUFFER nebo DRAW_FRAMEBUFFER je incomplete (v závislosti na tom, jaká operace se provádí). Samozřejmě je lepší u CheckFramebufferStatus zadat explicitně, jestli se ptáte na READ nebo DRAW.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 24. červenec 2012, 13:10:12    Předmět: Odpovědět s citátem

Tý jo, až teprve teď jsem si všiml, že ta funkce se volá blbě, ale:
kód:
       
Takhle se volá v enginu.
window.w = 800
window.h = 600
glBlitFramebufferEXT(0, 0, window.w, window.h, 0, 0, window.w, window.h,
                             GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
                             GL_NEAREST);

A toto vyleze z gDebuggeru.
Reason   OpenGL Error
Breaked-on   
glBlitFramebufferEXT(0 , 800 , 0 , 600 , 0 , 0 , 600 , 600 , 0x4100 , GL_NEAREST)
GL_INVALID_OPERATION


Zajímavý chování - chová se to tak aji na NV. glBlitFramebuffer() to nedělá a funguje všude ok.

Další věc, problém padání a segfaultování byla nejspíš vratká implementace glInterleavedArrays která je deprecated, po odstranění jejích volání zmizely chyby jako GL_INVALID_FRAMEBUFFER_OPERATION a přestalo to padat.

Ještě pro kontrolu, takhle blituju při multisamplingu, vypadá to že není problém.
kód:
        glBindFramebuffer(GL_READ_FRAMEBUFFER, postFBOID);
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, finalFBOID);

        glDrawBuffer(GL_COLOR_ATTACHMENT0);
        glReadBuffer(GL_COLOR_ATTACHMENT0);

        glBlitFramebuffer(0, 0, window.w, window.h, 0, 0, window.w, window.h, GL_COLOR_BUFFER_BIT, GL_NEAREST);

        glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);


Až budu dělat příští engine a na něm postavenou hru, tak AMD je jasná volba, díky pánové ;)
_________________
Jeden z vývojářů hry Grenade Madness.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 29. červenec 2012, 19:41:17    Předmět: Odpovědět s citátem

nou napsal:
Játro.m napsal:
Zase jsem ale při tomhle ladění zjistí, jak moc udělal chyb u sebe a co všechno vykrejou zlatý ovladače Nvidií.

jeden vyvojar sa na fore opengl.org vyjadril ze ak to ma behat na obydvoch GPU tak radsej vyvija na ATI. pretoze maju dost striktne ovladace a ked to teda beha na ATI tak to bude takmer na 100% behat aj na nVidii.

http://phoronix.com/forums/showthread.php?72506-People-incorrectly-assume-that-AMD-drivers-suck-They-don-t
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
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