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
SDL_RenderReadPixels crash on reading from Texture
LBandy


Joined: 01 Jan 2013
Posts: 38
Hello,

I've been trying to turn back a Texture to a Surface. Here's my code:

Code:

SDL_Surface* surface = IMG_Load("picture.png");
SDL_Texture* texture = SDL_CreateTextureFromSurface(m_MainRenderer, surface);
SDL_Surface* newSurface = SDL_CreateRGBSurface(0, surface->w, surface->h, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);

SDL_SetRenderTarget(m_MainRenderer, texture);
SDL_RenderReadPixels(m_MainRenderer, NULL, newSurface->format->format, newSurface->pixels, newSurface->pitch);
SDL_SetRenderTarget(m_MainRenderer, NULL);


It always crashes on different places, but the callstack is usually similar to:

Code:

_SDL_Blit_Slow()   Unknown
_SDL_CalculateBlit()   Unknown
_SDL_LowerBlit_REAL()   Unknown
_SDL_ConvertPixels_REAL()   Unknown
_SDL_AtomicUnlock_REAL()   Unknown
_SDL_RenderReadPixels_REAL()   Unknown
_SDL_RenderReadPixels()   Unknown


If I don't switch RenderTarget, I'm able to capture what is on the Renderer to a surface, but that's not what I want to do. The renderer is created with the flag SDL_RENDERER_TARGETTEXTURE and I've tried setting the texture to SDL_TEXTUREACCESS_TARGET, but it didn't help.

Any ideas what am I doing wrong here?

Thank you for your help!
mr_tawan


Joined: 13 Jan 2014
Posts: 161
I think it's does not looks right when you're using a texture that's created from file as a render target. And from your code you're just trying to read a pixel from the texture, or may be from a surface. Usually the texture would have to be created with the flag SDL_TEXTUREACCESS_TARGET, which I don't think the SDL_CreateTextureFromSurface would set that flag (I could be wrong though).

I think the SDL_RenderReadPixels is meant to be used in the use case like screen capture.

And if you're just reading pixel from texture, SDL_LockTexture is what you need.
mr_tawan


Joined: 13 Jan 2014
Posts: 161
Oh and textures can be locked only when it has SDL_TEXTUREACCESS_STREAMING. If the texture is static then it couldn't be lock.

BTW, you can also get the pixel data by locking the surface as well.
LBandy


Joined: 01 Jan 2013
Posts: 38
I've posted the code for the sake of simplicity. In a real life scenario I've created a texture with SDL_TEXTUREACCESS_TARGET and rendered several other textures on it, then I was trying to save the final texture as a file, so I needed a way to convert it back to a surface. The crash was the same.

I'm not sure I understand the SDL_LockTexture relevance, as I'm interested in reading and not writing. Should I lock it before reading too?
LBandy


Joined: 01 Jan 2013
Posts: 38
Only changing SDL_TEXTUREACCESS_TARGET to SDL_TEXTUREACCESS_STREAMING seem to have solved the issue.