Rev. 5178 broke my SDL frame component

I updated SDL, and suddenly my SDL frames stopped working. They’d “initialize” full of gibberish, and I couldn’t render anything to them. After a bit of digging, I found a problem: the renderer initialization routine in my SDL frame code wasn’t getting called anymore.

procedure TSdlFrame.Paint;
begin
if SDL_SelectRenderer(FWindowID) = -1 then
CreateRenderer;
SDL_RenderPresent;
end;

function TSdlFrame.CreateRenderer: boolean;
const
pf: tagPIXELFORMATDESCRIPTOR = (nSize: sizeof(pf); nVersion: 1;
dwFlags: PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
iPixelType: PFD_TYPE_RGBA; cColorBits: 24; cAlphaBits: 8;
iLayerType: PFD_MAIN_PLANE);

RENDERERS: array[TRendererType] of AnsiString = (‘software’, ‘gdi’, ‘opengl’, ‘d3d’);
var
pFormat: integer;
begin
if (SDL_SelectRenderer(FWindowID) = 0) then
begin
result := true;
Exit;
end;
if FRendererType = rtOpenGL then
begin
pFormat := ChoosePixelFormat(canvas.Handle, @pf);
if not SetPixelFormat(canvas.Handle, pFormat, @pf) then
outputDebugString(PChar(SysErrorMessage(GetLastError)));
if wglCreateContext(canvas.Handle) = 0 then
outputDebugString(PChar(SysErrorMessage(GetLastError)));
end;
if (SDL_CreateRenderer(FWindowID, SDL_RendererIndex(RENDERERS[FRendererType]), [sdlrPresentFlip3, sdlrAccelerated]) = 0) then
begin
SDL_ShowWindow(FWindowID);
assert(SDL_SetRenderDrawColor(0, 0, 0, 255) = 0);
FFlags := SDL_GetWindowFlags(FWindowID);
if assigned(FOnAvailable) then
FOnAvailable(self);
end
else outputDebugString(pChar(format(‘SDL_CreateRenderer failed: %s’, [sdl_GetError])));
result := SDL_SelectRenderer(FWindowID) = 0;
end;

This is a critical issue. The Paint method gets called when the control receives a WM_PAINT message from Windows. I can’t create the renderer before then, or it will fail and cause trouble. And when I do create it, it needs to be created with certain parameters. So imagine my surprise when I started debugging into the DLL and found that SDL_SelectRenderer was trying to be “helpful” by creating the renderer for me if it didn’t already exist! Now not only does my initialization code not get called, I end up with the wrong renderer and so things don’t render as expected when I try to use the window.

This behavior was introduced in revision 5178 and needs to be reverted.

Thanks for the report. Not having to explicitly create the renderer
in the simple case is useful, but we definitely need to support your
situation as well. I have a solution planned for this, but I want to
think it through some more before checking it in.

See ya!On Sun, Nov 22, 2009 at 12:37 PM, Mason Wheeler wrote:

I updated SDL, and suddenly my SDL frames stopped working.? They’d
"initialize" full of gibberish, and I couldn’t render anything to them.
After a bit of digging, I found a problem: the renderer initialization
routine in my SDL frame code wasn’t getting called anymore.

procedure TSdlFrame.Paint;
begin
?? if SDL_SelectRenderer(FWindowID) = -1 then
??? CreateRenderer;
?? SDL_RenderPresent;
end;

function TSdlFrame.CreateRenderer: boolean;
const
?? pf: tagPIXELFORMATDESCRIPTOR = (nSize: sizeof(pf); nVersion: 1;
??? dwFlags: PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
??? iPixelType: PFD_TYPE_RGBA; cColorBits: 24; cAlphaBits: 8;
??? iLayerType: PFD_MAIN_PLANE);

?? RENDERERS: array[TRendererType] of AnsiString = (‘software’, ‘gdi’,
‘opengl’, ‘d3d’);
var
? pFormat: integer;
begin
?? if (SDL_SelectRenderer(FWindowID) = 0) then
?? begin
??? result := true;
??? Exit;
?? end;
?? if FRendererType = rtOpenGL then
?? begin
??? pFormat := ChoosePixelFormat(canvas.Handle, @pf);
??? if not SetPixelFormat(canvas.Handle, pFormat, @pf) then
??? outputDebugString(PChar(SysErrorMessage(GetLastError)));
??? if wglCreateContext(canvas.Handle) = 0 then
??? outputDebugString(PChar(SysErrorMessage(GetLastError)));
?? end;
?? if (SDL_CreateRenderer(FWindowID,
SDL_RendererIndex(RENDERERS[FRendererType]), [sdlrPresentFlip3,
sdlrAccelerated]) = 0) then
?? begin
??? SDL_ShowWindow(FWindowID);
??? assert(SDL_SetRenderDrawColor(0, 0, 0, 255) = 0);
??? FFlags := SDL_GetWindowFlags(FWindowID);
??? if assigned(FOnAvailable) then
??? FOnAvailable(self);
?? end
?? else outputDebugString(pChar(format(‘SDL_CreateRenderer failed: %s’,
[sdl_GetError])));
?? result := SDL_SelectRenderer(FWindowID) = 0;
end;

This is a critical issue.? The Paint method gets called when the control
receives a WM_PAINT message from Windows.? I can’t create the renderer
before then, or it will fail and cause trouble.? And when I do create it, it
needs to be created with certain parameters.? So imagine my surprise when I
started debugging into the DLL and found that SDL_SelectRenderer was trying
to be “helpful” by creating the renderer for me if it didn’t already exist!
Now not only does my initialization code not get called, I end up with the
wrong renderer and so things don’t render as expected when I try to use the
window.

This behavior was introduced in revision 5178 and needs to be reverted.


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org


-Sam Lantinga, Founder and President, Galaxy Gameworks LLC

What’s the solution you’re thinking of? If we can discuss it on
here and look at it from different angles it might help things a bit.________________________________
From: slouken@libsdl.org (slouken)
Subject: Re: [SDL] Rev. 5178 broke my SDL frame component

Thanks for the report. Not having to explicitly create the renderer
in the simple case is useful, but we definitely need to support your
situation as well. I have a solution planned for this, but I want to
think it through some more before checking it in.

After thinking about it, I changed it so that SDL_GetRenderInfo() and
SDL_SelectRenderer() won’t create a renderer, but if you start using
draw calls (not caring what renderer you get) then it’ll create the
default one for you.

Thanks!On Mon, Nov 23, 2009 at 9:53 AM, Mason Wheeler wrote:

What’s the solution you’re thinking of?? If we can discuss it on
here and look at it from different angles it might help things a bit.


From: Sam Lantinga <@slouken>
Subject: Re: [SDL] Rev. 5178 broke my SDL frame component

Thanks for the report.? Not having to explicitly create the renderer
in the simple case is useful, but we definitely need to support your
situation as well.? I have a solution planned for this, but I want to
think it through some more before checking it in.


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org


-Sam Lantinga, Founder and President, Galaxy Gameworks LLC

OK, that makes sense. Thanks! BTW would you mind taking a look
at Bugzilla #771?________________________________
From: slouken@libsdl.org (slouken)
Subject: Re: [SDL] Rev. 5178 broke my SDL frame component

After thinking about it, I changed it so that SDL_GetRenderInfo() and
SDL_SelectRenderer() won’t create a renderer, but if you start using
draw calls (not caring what renderer you get) then it’ll create the
default one for you.

Thanks!

Yep, it’s already taken care of! :)On Tue, Nov 24, 2009 at 3:30 AM, Mason Wheeler wrote:

OK, that makes sense.? Thanks!? BTW would you mind taking a look
at Bugzilla #771?


From: Sam Lantinga <@slouken>
Subject: Re: [SDL] Rev. 5178 broke my SDL frame component

After thinking about it, I changed it so that SDL_GetRenderInfo() and
SDL_SelectRenderer() won’t create a renderer, but if you start using
draw calls (not caring what renderer you get) then it’ll create the
default one for you.

Thanks!


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org


-Sam Lantinga, Founder and President, Galaxy Gameworks LLC