[OpenGL ES / C#] Surface opnieuw maken na control resize

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Ik ben bezig met een OpenGL ES app in .Net (2.0) voor Windows Mobile. Ik heb een Form met daarin een custom Control die het hele client gedeelte van de Form beslaat, en de window handle van dat control gebruik ik om de OpenGL ES surface te maken.

Nou loop ik echter tegen het probleem aan dat als ik de applicatie run op mijn HTC Touch Pro2 (met WM 6.5.5) en mijn toetsenbord uittrek (en het form dus resized van een lange rechthoek naar een brede rechthoek), de applicatie gewoon keihard freezed op de eerstvolgende OpenGL call. Ik heb gepoogd het surface te hercreëren als er geresized is, maar ook dat wil niet werken.

Wat ik nu dus doe is op een Control.OnResize() een eglDestroySurface(oudeSurface), vervolgens eglCreateWindowSurface() en een eglMakeCurrent() met het nieuwe surface. Wat er daadwerkelijk gebeurt is een beetje afhankelijk van hoe ik mijn breakpoints heb geplaatst. Als ik 'm op eglCreateSurface() break dan blijft ie daar ook hangen als ik 'm weer verder laat lopen, en anders redt ie het tot de eerstvolgende gl call (glViewport() in mijn geval).

Iemand enig idee hoe ik een resize fatsoenlijk kan handlen?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 11:32
Weet je zeker dat de Control het eerste is wat resized? Is het niet een hardware event ofzo, waardoor voordat jou event opgegooid word er al OpgenGL calls gedaan worden? (die daarna dus in de soep lopen)

Even niets...


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Nee, dat was ook het eerste in mij opkwam en dat heb ik nog gechecked :)

Sowieso is die OpenGL driver op m'n telefoon ook echt brak. Als ik een paar keer achter elkaar mijn app run zonder 'm fatsoenlijk af te sluiten en de opengl resources op te ruimen, dan crasht ie op een gegeven moment op eglInitialize() en moet ik mijn telefoon softresetten wil er überhaupt nog een opengl app opgestart kunnen worden :/

Maar goed, kan me nauwelijks voorstellen dat het een driverprobleem is waar iedereen tegenaan loopt, want op internet valt er verdomd weinig over dit specifieke probleem te vinden.

[ Voor 78% gewijzigd door .oisyn op 20-04-2010 14:43 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 11:32
En het compleet opnieuw initialiseren van OpenGL werkt wel?
(duurt natuurlijk lang, maar even voor de test...)

Even niets...


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Zou ik ook nog kunnen proberen idd, maar daar wil ik liever niet aan want dan moet ik alle resources ook weer opnieuw inladen...

Maar je zegt dat iets als
C#:
1
2
3
egl.DestroySurface(display, surface);
surface = egl.CreateWindowSurface(display, config, windowHandle, (IntPtr)0);
egl.MakeCurrent(display, surface, surface, context);

afdoende zou moeten zijn?

(PS ik gebruik deze OpenGL ES .Net wrapper)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 11:32
display is neem ik aan je Control in .NET?
Heb je er al eens aan gedacht om een nieuwe control te maken en daar de surface aan te hangen?

Control base = new Control();
egl.CreateWindowSurface(base, ..., ... );
parent.Add(base);

Ik ben geen OpenGL expert hoor, ik denk alleen kritisch mee ;)

Even niets...


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
FireDrunk schreef op dinsdag 20 april 2010 @ 15:33:
display is neem ik aan je Control in .NET?
Yup, dmv eglGetDisplay() met de window handle van m'n control. Hmm, maar nu ik dit schrijf bedenk ik me opeens dat de egl wrapper de HDC pakt van de window, en die kan weleens niet meer geldig zijn. Misschien moet ik het display eens initialiseren met de desktop DC (GetDC(0)), en de window handle van het control slechts gebruiken voor de surface creation. Interessant, vanavond maar eens proberen :). Bedankt voor de schop in hopelijk de juiste richting ;)

.edit: of gewoon EGL_DEFAULT_DISPLAY, wellicht nog beter.

[ Voor 8% gewijzigd door .oisyn op 20-04-2010 16:20 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Dat werkt dus ook niet :/. Overigens valt wel op dat hij nu wel 1 frame goed weergeeft, maar daarna alsnog de soep inloopt.

.edit: sterker nog, hij rendert gewoon nog pakweg 20 frames met de goede surface, maar daarna loopt ie vast (en mag ik m'n telefoon softresetten)

[ Voor 37% gewijzigd door .oisyn op 20-04-2010 22:22 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
.oisyn schreef op dinsdag 20 april 2010 @ 14:47:
(PS ik gebruik deze OpenGL ES .Net wrapper)
Gaat de hello world app aldaar wel goed? Jouw code komt dus overeen met zoiets?
Het valt me op dat je inderdaad niet veel vindt bij [google=eglDestroySurface wm_size]..
offtopic:
Geen Windows Mobile hier. :9

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
pedorus schreef op woensdag 21 april 2010 @ 00:16:
[...]

Gaat de hello world app aldaar wel goed?
Nope, die heeft hetzelfde probleem. Maar iets als GLBenchmark of Opera 10 (die doet dacht ik ook OpenGL?) dan weer niet.
Jouw code komt dus overeen met zoiets
Yup, behalve dat ik 'm ook eerst unbind. Hoeft officieel niet, maar deze driver heeft wel meer problemen met het niet opruimen van resources.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public void ResetSurface(IntPtr hWnd)
{
    //System.Threading.Thread.Sleep(1000);

    egl.MakeCurrent(display, EGLSurface.None, EGLSurface.None, context);
    egl.DestroySurface(display, surface);

    surface = egl.CreateWindowSurface(display, config, hWnd, null);
    if (surface.Pointer == EGLSurface.None.Pointer)
        throw new InvalidOperationException("Can't create window surface.");

    egl.MakeCurrent(display, surface, surface, context);
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 11:32
Ik ga even testen, ik heb een Touch HD met WiMo 6.5.5.
Ik kan met de Test app gewoon mijn scherm draaien...
Framerate zuigt daarna wel (van ~38 naar ~22 fps)

Het is me een beetje teveel werk om zelf een test scenario te schrijven, dus mocht je jou code op een ander toestel willen testen, mag je het wel even mailen (email adres staat in profiel).
Dan kijk ik of het wel werkt op mijn telefoon.

[ Voor 91% gewijzigd door FireDrunk op 21-04-2010 11:34 ]

Even niets...


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Ik heb hier ook nog een HD liggen, van m'n vrouw. Het punt is alleen dat die geen slide-out toetsenbord hebben ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 11:32
So? ik heb gewoon een softwarebutton om te draaien...

Even niets...


Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

.oisyn schreef op dinsdag 20 april 2010 @ 22:06:
Dat werkt dus ook niet :/. Overigens valt wel op dat hij nu wel 1 frame goed weergeeft, maar daarna alsnog de soep inloopt.

.edit: sterker nog, hij rendert gewoon nog pakweg 20 frames met de goede surface, maar daarna loopt ie vast (en mag ik m'n telefoon softresetten)
Zou het kunnen dat de GC na ongeveer 20 frames je oude surface opruimt, en dat daarbij iets misgaat?

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Ik kan me herinneren dat het op m'n oude Touch Pro (die helaas een duik in het zwembad niet heeft overleefd) ook gewoon werkte. Wellicht is het een issue van m'n ROM. Ik draai ook 6.5.5 (build 23549), een EnergyRom van 20 maart.
Bozozo schreef op woensdag 21 april 2010 @ 11:58:
[...]

Zou het kunnen dat de GC na ongeveer 20 frames je oude surface opruimt, en dat daarbij iets misgaat?
Nee dat kan niet, OpenGL resources worden niet gemanaged door .Net maar door de native OpenGL implementatie.

[ Voor 42% gewijzigd door .oisyn op 21-04-2010 12:02 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 11:32
Ik heb Energyrom van 17 April (23889) met GTX theme, mischien dat dat iets uitmaakt?

Even niets...


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Grappig, het probleem is manila.exe. Als ik die kill (en m'n homescreen kwijt ben) dan werkt het wel. Ik zie het nog wel 1 frame fout gaan, maar daar herstelt hij zich gewoon weer van.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1