Add a new hint SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT that allows SDL_CreateWindowFrom() to set the pixel format of another SDL_Window (and also will set the SDL_WINDOW_OPENGL flag on the window created with SDL_CreateWindowFrom()).
The reasoning behind this change is that source2 in -tools mode has a single OpenGL context that is used with multiple different windows. Some of those windows are created outside the engine (i.e. with Qt) and therefore we need to use SDL_CreateWindowFrom() to get an SDL_Window for those. The requirement for sharing an OpenGL context across multiple different windows is that each window has the same pixel format. To facilitate this, I now set SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT for the main window before calling SDL_CreateWindowFrom(). When I do this, SDL_CreateWindowFrom() will: 1. Set the pixel format of the returned window to the same pixel format as this SDL_Window passed in with the hint 2. The flag SDL_WINDOW_OPENGL will be set on the new window so it can be used for OpenGL rendering. I only currently implemented this for Win32/WGL so implementing it for other platforms (i.e. X11) remains a TODO. CR: SamL Some pseudocode that shows how this is used in Source2: HWND hExternalHwnd; // HWND that was established outside of SDL // Create main window (happens inside platwindow.cpp) SDL_Window *mainWindow = SDL_CreateWindow( , SDL_WINDOW_OPENGL .. ); // Create GL context, happens inside rendersystemgl SDL_GLContext onlyContext = SDL_GL_CreateContext( mainWindow ); // Now I need to create another window from hEternalHwnd for my swap chain that will have the same pixel format as mainWindow, so set the hint SDL_SetHint( SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT, CFmtStr( %p, mainWindow) ); // Create the secondary window. This returned window will have SDL_WINDOW_OPENGL set and share a pixel format with mainWindow from the hint SDL_Window *secondaryWindow = SDL_CreateWindowFrom( hExternalHwnd ); // To render to the main window: SDL_GL_MakeCurrent( mainWindow, onlyContext ); // Do some rendering to main window // To render to the secondary window: SDL_GLMakeCurrent( secondaryWindow, onlyContext ); // Do some rendering to secondary window
This commit is contained in:
parent
d9f1c7b666
commit
a09aac7720
4 changed files with 66 additions and 0 deletions
|
@ -759,6 +759,26 @@ WIN_GL_DeleteContext(_THIS, SDL_GLContext context)
|
|||
_this->gl_data->wglDeleteContext((HGLRC) context);
|
||||
}
|
||||
|
||||
|
||||
SDL_bool
|
||||
WIN_GL_SetPixelFormatFrom(_THIS, SDL_Window * fromWindow, SDL_Window * toWindow)
|
||||
{
|
||||
HDC hfromdc = ((SDL_WindowData *) fromWindow->driverdata)->hdc;
|
||||
HDC htodc = ((SDL_WindowData *) toWindow->driverdata)->hdc;
|
||||
BOOL result;
|
||||
|
||||
/* get the pixel format of the fromWindow */
|
||||
int pixel_format = GetPixelFormat(hfromdc);
|
||||
PIXELFORMATDESCRIPTOR pfd;
|
||||
SDL_memset(&pfd, 0, sizeof(pfd));
|
||||
DescribePixelFormat(hfromdc, pixel_format, sizeof(pfd), &pfd);
|
||||
|
||||
/* set the pixel format of the toWindow */
|
||||
result = SetPixelFormat(htodc, pixel_format, &pfd);
|
||||
|
||||
return result ? SDL_TRUE : SDL_FALSE;
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_OPENGL_WGL */
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_WINDOWS */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue