Hi,
I want to cache some buttons which I compose from several drawing operations as textures. But they only show up at the first SDL_RenderPresent call. On the second they are gone. Why? What am I doing wrong.
I work with SDL2 on a Raspberrypi.
This is what I did:
window = SDL_CreateWindow("YaPS", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1024, 768, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, 0, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
SDL_GetRendererInfo(renderer, &info);
if (!(info.flags & SDL_RENDERER_TARGETTEXTURE))
{
// check if renderer fail to use target texture, it does not fail
printlog(LOG_ERROR,"Renderer does not support SetRenderTarget\n",SDL_GetError());
return 1;
}
ob->tx = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, ob->r.w, ob->r.h);
// ob->tx=background;
if (!ob->tx)
{
printlog(LOG_ERROR, "Cannot create object texture %i '%s': %s\n", id, text, SDL_GetError());
return ob;
}
SDL_SetTextureBlendMode(ob->tx, SDL_BLENDMODE_BLEND); // allow transparency
// now "draw" the button onto the texture
// set render output to texture
SDL_SetRenderTarget(renderer, ob->tx);
// set the background color
SDL_SetRenderDrawColor2(renderer, (ob->flags&SELECTED)?ob->style->bgcolor_selected:ob->style->bgcolor);
// draw the button's background
SDL_RenderFillRect(renderer, &ob->r);
// set render target to screen
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderCopy(renderer, ob->tx, NULL, &ob->r);
SDL_RenderPresent(renderer);
puts("pause1"); getchar();
SDL_RenderCopy(renderer, ob->tx, NULL, &ob->r);
SDL_RenderPresent(renderer);
puts("pause2"); getchar();
When program reaches “pause1” I see the blue rectangle on the screen. At “pause2” it is gone.
You might say, that the SDL_TEXTUREACCESS_STREAMING is wrong. I would say yes, but if I set it to SDL_TEXTUREACCESS_STATIC, nothing happens at all. I never see my blue rectangle.