emscripten-core / emscripten-core/emscripten

SDL_RenderPresent clears the buffer when called in different iterations of the loop using SDL_RENDERER_ACCELERATED

Open
#11,111 2 comments 0 reactions 0 assignees View on GitHub
wontfix
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.