Andreas Falkenhahn
2016-09-28 15:07:32 UTC
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?
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:***@falkenhahn.com
Best regards,
Andreas Falkenhahn mailto:***@falkenhahn.com