emscripten-core / emscripten-core/emscripten
SDL_RenderPresent clears the buffer when called in different iterations of the loop using SDL_RENDERER_ACCELERATED
- Dominant language
- C++
- Stars
- 27.6k
- Forks
- 3.6k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 105
Description
The sample code below works perfectly in the native SDL. In the Emscripten version using SDL_RENDERER_ACCELERATED active, if the SDL_RenderPresent function is called a second time in an different iteration of the loop, the buffer is cleared (all black) and the screen is flickered.
Apparently the buffer is not maintained between loop iterations as it is in the native SDL.
Is this a limitation or a malfunction?
WIth SDL_RENDERER_SOFTWARE Emscripten version works perfectly .
```
#include
#include
#include
#include
#ifdef __EMSCRIPTEN__
#include
#endif
int candraw=0;
int quit=false;
SDL_Event e;
SDL_Renderer * Renderer=NULL;
struct timeval tv,ntv;
long int elapsed;
void draw_rec(int x, int y)
{
SDL_Rect fillRect = {x, y, 40, 40};
SDL_SetRenderDrawColor (Renderer, 0xFF, 0XFF, 0, 0xFF);
SDL_RenderFillRect (Renderer , &fillRect);
SDL_RenderPresent( Renderer );
}
void loop(void)
{
gettimeofday (&tv, NULL);
elapsed = (((tv.tv_usec - ntv.tv_usec) / 1000L) + 1000L * (tv.tv_sec - ntv.tv_sec));
if(elapsed > 100)
{
SDL_SetRenderDrawColor (Renderer, 0xFF, 0, 0, 0xFF);
SDL_RenderClear( Renderer );
draw_rec(10,20);
SDL_RenderPresent( Renderer );
ntv=tv;
candraw=1;
}
if(candraw)
{
draw_rec(60,80);
}
while( SDL_PollEvent( &e ) != 0 )
{
//User requests quit
if( e.type == SDL_QUIT )
{
quit = true;
#ifdef __EMSCRIPTEN__
emscripten_cancel_main_loop();
#endif
}
if(e.type == SDL_KEYDOWN)
{
printf("key = %c\n",e.key.keysym.sym);
switch(e.key.keysym.sym)
{
case 'q':
quit = true;
#ifdef __EMSCRIPTEN__
emscripten_cancel_main_loop();
#endif
break;
}
}
}
}
int main()
{
printf("started...\n");
if (SDL_Init (SDL_INIT_VIDEO) < 0)
{
printf ("SDL could not initialize! SDL_Error: %s\n", SDL_GetError ());
return 0;
};
SDL_Window * WWindow = SDL_CreateWindow ("teste", 50, 50, 320, 240, 0);
Renderer = SDL_CreateRenderer( WWindow, -1, SDL_RENDERER_ACCELERATED );
if (Renderer == NULL)
{
printf ("Switching to software renderer...\n");
Renderer = SDL_CreateRenderer (WWindow, -1, SDL_RENDERER_SOFTWARE);
}
if (Renderer == NULL)
{
printf ("Renderer could not be created! SDL Error: %s\n", SDL_GetError ());
exit (-1);
}
gettimeofday (&ntv, NULL);
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(loop, 0, 1);
#else
while(!quit)
{
loop();
}
#endif
SDL_DestroyRenderer(Renderer);
SDL_DestroyWindow(WWindow);
SDL_Quit ();
printf("Fim\n");
printf("teste\n");
}
```
Contributor guide
Assessment
This issue has not been assessed yet.