The SDL forums have moved to discourse.libsdl.org.
This is just a read-only archive of the previous forums, to keep old links working.


SDL Forum Index
SDL
Simple Directmedia Layer Forums
Weird behaviour on the Raspberry Pi
Andreas Falkenhahn
Guest

I've noticed some weird behaviour on the Raspberry Pi. Take a look at the
following little example code:

#include <SDL.h>

int main(int argc, char *argv[])
{
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *texture1, *texture2, *texture3;
SDL_Event se;
int quit = 0, k;
int w = 295, reverse = 0;
char *pixbuf = malloc(640 * 480 * 4);
unsigned int *ptr;

SDL_Init(SDL_INIT_VIDEO);
SDL_VideoInit("RPI");

window = SDL_CreateWindow("Foo", 0, 0, 640, 480, 0);
renderer = SDL_CreateRenderer(window, -1, 0);
texture1 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 480);
texture2 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 480);

memset(pixbuf, 0, 640 * 480 * 4);
SDL_UpdateTexture(texture1, NULL, pixbuf, 640 * 4);
SDL_RenderCopy(renderer, texture1, NULL, NULL);
SDL_RenderPresent(renderer);

ptr = (unsigned int *) pixbuf;
for(k = 0; k < 640 * 480; k++) *ptr++ = 0xffff0000;
SDL_UpdateTexture(texture2, NULL, pixbuf, 640 * 4);

SDL_ShowWindow(window);
SDL_RaiseWindow(window);

while(!quit) {

SDL_RenderCopy(renderer, texture1, NULL, NULL);

texture3 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, w, w);
SDL_SetRenderTarget(renderer, texture3);
SDL_SetTextureBlendMode(texture2, SDL_BLENDMODE_NONE);
SDL_RenderCopy(renderer, texture2, NULL, NULL);
SDL_SetTextureBlendMode(texture3, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderCopy(renderer, texture3, NULL, NULL);

SDL_RenderPresent(renderer);

while(SDL_PollEvent(&se)) {
if(se.type == SDL_MOUSEBUTTONDOWN) quit = 1;
}

SDL_DestroyTexture(texture3);

if(reverse) {
w -= 10;
} else {
w += 10;
}

if(w >= 640) {
w = 640;
reverse = 1;
} else if(w <= 2) {
w = 2;
reverse = 0;
}
}

SDL_DestroyTexture(texture1);
SDL_DestroyTexture(texture2);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);

SDL_Quit();

free(pixbuf);

return 0;
}

On Windows, Linux & Mac this always fills the screen with red. On the Raspberry Pi,
however, the screen alternates between red and black. It is mostly red, but sometimes
it's also black, so it looks really weird.

Is that a bug in my code or in SDL's Pi backend?

--
Best regards,
Andreas Falkenhahn mailto:

_______________________________________________
SDL mailing list

http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
Re: Weird behaviour on the Raspberry Pi
rtrussell


Joined: 10 Feb 2016
Posts: 88
Andreas Falkenhahn wrote:
Is that a bug in my code or in SDL's Pi backend?

One thing I would question is that there's no SDL_RenderClear(). The docs say "You are strongly encouraged to call SDL_RenderClear() to initialize the backbuffer before starting each new frame's drawing". Does it make any difference if you change it as follows:

Code:
      SDL_SetRenderTarget(renderer, NULL);
      SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
      SDL_RenderClear(renderer);
      SDL_RenderCopy(renderer, texture3, NULL, NULL);
      SDL_RenderPresent(renderer);

Richard.
Weird behaviour on the Raspberry Pi
Andreas Falkenhahn
Guest

On 28.09.2016 at 17:59 rtrussell wrote:

Quote:
One thing I would question is that there's no SDL_RenderClear().
The docs say "You are strongly encouraged to call SDL_RenderClear()
to initialize the backbuffer before starting each new frame's
drawing". Does it make any difference if you change it as follows:

No, doesn't make any difference. The screen still alternates between
red and black. Here is the updated code for reference:

#include <SDL.h>

int main(int argc, char *argv[])
{
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *texture1, *texture2, *texture3;
SDL_Event se;
int quit = 0, k;
int w = 295, reverse = 0;
char *pixbuf = malloc(640 * 480 * 4);
unsigned int *ptr;

SDL_Init(SDL_INIT_VIDEO);
SDL_VideoInit("RPI");

window = SDL_CreateWindow("Foo", 0, 0, 640, 480, 0);
renderer = SDL_CreateRenderer(window, -1, 0);
texture1 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 480);
texture2 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 480);

memset(pixbuf, 0, 640 * 480 * 4);
SDL_UpdateTexture(texture1, NULL, pixbuf, 640 * 4);
SDL_RenderCopy(renderer, texture1, NULL, NULL);
SDL_RenderPresent(renderer);

ptr = (unsigned int *) pixbuf;
for(k = 0; k < 640 * 480; k++) *ptr++ = 0xffff0000;
SDL_UpdateTexture(texture2, NULL, pixbuf, 640 * 4);

SDL_ShowWindow(window);
SDL_RaiseWindow(window);

while(!quit) {

texture3 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, w, w);

SDL_SetRenderTarget(renderer, texture3);
SDL_SetTextureBlendMode(texture2, SDL_BLENDMODE_NONE);
SDL_RenderCopy(renderer, texture2, NULL, NULL);
SDL_SetTextureBlendMode(texture3, SDL_BLENDMODE_BLEND);

SDL_SetRenderTarget(renderer, NULL);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture1, NULL, NULL);
SDL_RenderCopy(renderer, texture3, NULL, NULL);
SDL_RenderPresent(renderer);

while(SDL_PollEvent(&se)) {
if(se.type == SDL_MOUSEBUTTONDOWN) quit = 1;
}

SDL_DestroyTexture(texture3);

if(reverse) {
w -= 10;
} else {
w += 10;
}

if(w >= 640) {
w = 640;
reverse = 1;
} else if(w <= 2) {
w = 2;
reverse = 0;
}
}

SDL_DestroyTexture(texture1);
SDL_DestroyTexture(texture2);

SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);

SDL_Quit();

free(pixbuf);

return 0;
}

--
Best regards,
Andreas Falkenhahn mailto:

_______________________________________________
SDL mailing list

http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
Weird behaviour on the Raspberry Pi
Andreas Falkenhahn
Guest

On 28.09.2016 at 18:44 Jonathan Dearborn wrote:

Quote:
Can you simplify this example with fewer textures and RTT calls and still get this behavior?

It works correctly when disabling scaling, i.e. changing the following line

texture3 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, w, w);

into this line

texture3 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 640, 480);

solves the problem and there is no alternation between red and black screens any
more. The problem only seems to appear when the dimensions of texture3 and texture2
don't match, i.e. when SDL_RenderCopy() needs to scale-copy texture2 to texture3
instead of just copying it without the involvement of scaling.

--
Best regards,
Andreas Falkenhahn mailto:

_______________________________________________
SDL mailing list

http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
Weird behaviour on the Raspberry Pi
Jonny D


Joined: 12 Sep 2009
Posts: 932
Can you simplify this example with fewer textures and RTT calls and still get this behavior?

Jonny D




On Wed, Sep 28, 2016 at 12:40 PM, Andreas Falkenhahn wrote:
Quote:
On 28.09.2016 at 17:59 rtrussell wrote:

Quote:
  One thing I would question is that there's no SDL_RenderClear().
The docs say "You are strongly encouraged to call SDL_RenderClear()
to initialize the backbuffer before starting each new frame's
drawing".  Does it make any difference if you change it as follows:

No, doesn't make any difference. The screen still alternates between
red and black. Here is the updated code for reference:

#include <SDL.h>

int main(int argc, char *argv[])
{
        SDL_Window *window;
        SDL_Renderer *renderer;
        SDL_Texture *texture1, *texture2, *texture3;
        SDL_Event se;
        int quit = 0, k;
        int w = 295, reverse = 0;
        char *pixbuf = malloc(640 * 480 * 4);
        unsigned int *ptr;

        SDL_Init(SDL_INIT_VIDEO);
        SDL_VideoInit("RPI");

        window = SDL_CreateWindow("Foo", 0, 0, 640, 480, 0);
        renderer = SDL_CreateRenderer(window, -1, 0);
        texture1 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 480);
        texture2 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 480);

        memset(pixbuf, 0, 640 * 480 * 4);
        SDL_UpdateTexture(texture1, NULL, pixbuf, 640 * 4);
        SDL_RenderCopy(renderer, texture1, NULL, NULL);
        SDL_RenderPresent(renderer);

        ptr = (unsigned int *) pixbuf;
        for(k = 0; k < 640 * 480; k++) *ptr++ = 0xffff0000;
        SDL_UpdateTexture(texture2, NULL, pixbuf, 640 * 4);

        SDL_ShowWindow(window);
        SDL_RaiseWindow(window);

        while(!quit) {



                texture3 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, w, w);

                SDL_SetRenderTarget(renderer, texture3);
                SDL_SetTextureBlendMode(texture2, SDL_BLENDMODE_NONE);
                SDL_RenderCopy(renderer, texture2, NULL, NULL);
                SDL_SetTextureBlendMode(texture3, SDL_BLENDMODE_BLEND);

                SDL_SetRenderTarget(renderer, NULL);
                SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
                SDL_RenderClear(renderer);
                SDL_RenderCopy(renderer, texture1, NULL, NULL);
                SDL_RenderCopy(renderer, texture3, NULL, NULL);
                SDL_RenderPresent(renderer);

                while(SDL_PollEvent(&se)) {
                        if(se.type == SDL_MOUSEBUTTONDOWN) quit = 1;
                }

                SDL_DestroyTexture(texture3);

                if(reverse) {
                        w -= 10;
                } else {
                        w += 10;
                }

                if(w >= 640) {
                        w = 640;
                        reverse = 1;
                } else if(w <= 2) {
                        w = 2;
                        reverse = 0;
                }
        }

        SDL_DestroyTexture(texture1);
        SDL_DestroyTexture(texture2);

        SDL_DestroyRenderer(renderer);
        SDL_DestroyWindow(window);

        SDL_Quit();

        free(pixbuf);

        return 0;
}

--
Best regards,
 Andreas Falkenhahn                            mailto:

_______________________________________________
SDL mailing list

http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org


Weird behaviour on the Raspberry Pi
Andreas Falkenhahn
Guest

Filed this now as

https://bugzilla.libsdl.org/show_bug.cgi?id=3455

because it clearly seems to be a bug in the Raspi backend.

On 29.09.2016 at 17:16 Andreas Falkenhahn wrote:

Quote:
On 28.09.2016 at 18:44 Jonathan Dearborn wrote:

Quote:
Quote:
Can you simplify this example with fewer textures and RTT calls and still get this behavior?

Quote:
It works correctly when disabling scaling, i.e. changing the following line

Quote:
texture3 = SDL_CreateTexture(renderer,
SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, w, w);

Quote:
into this line

Quote:
texture3 = SDL_CreateTexture(renderer,
SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 640, 480);

Quote:
solves the problem and there is no alternation between red and black screens any
more. The problem only seems to appear when the dimensions of texture3 and texture2
don't match, i.e. when SDL_RenderCopy() needs to scale-copy texture2 to texture3
instead of just copying it without the involvement of scaling.

--
Best regards,
Andreas Falkenhahn mailto:

_______________________________________________
SDL mailing list

http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org