Allow the render context to do necessary work when the video mode changes.
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402017
This commit is contained in:
parent
461c8e2db4
commit
a1ced0d971
7 changed files with 96 additions and 23 deletions
|
@ -72,6 +72,7 @@ SDL_SendWindowEvent(SDL_WindowID windowID, Uint8 windowevent, int data1,
|
||||||
}
|
}
|
||||||
window->w = data1;
|
window->w = data1;
|
||||||
window->h = data2;
|
window->h = data2;
|
||||||
|
SDL_OnWindowResized(window);
|
||||||
break;
|
break;
|
||||||
case SDL_WINDOWEVENT_MINIMIZED:
|
case SDL_WINDOWEVENT_MINIMIZED:
|
||||||
if (window->flags & SDL_WINDOW_MINIMIZED) {
|
if (window->flags & SDL_WINDOW_MINIMIZED) {
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
static SDL_Renderer *GL_CreateRenderer(SDL_Window * window, Uint32 flags);
|
static SDL_Renderer *GL_CreateRenderer(SDL_Window * window, Uint32 flags);
|
||||||
static int GL_ActivateRenderer(SDL_Renderer * renderer);
|
static int GL_ActivateRenderer(SDL_Renderer * renderer);
|
||||||
|
static int GL_DisplayModeChanged(SDL_Renderer * renderer);
|
||||||
static int GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
static int GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||||
static int GL_SetTexturePalette(SDL_Renderer * renderer,
|
static int GL_SetTexturePalette(SDL_Renderer * renderer,
|
||||||
SDL_Texture * texture,
|
SDL_Texture * texture,
|
||||||
|
@ -97,6 +98,7 @@ SDL_RenderDriver GL_RenderDriver = {
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
SDL_GLContext context;
|
SDL_GLContext context;
|
||||||
|
SDL_bool updateSize;
|
||||||
SDL_bool GL_ARB_texture_rectangle_supported;
|
SDL_bool GL_ARB_texture_rectangle_supported;
|
||||||
int blendMode;
|
int blendMode;
|
||||||
int scaleMode;
|
int scaleMode;
|
||||||
|
@ -219,6 +221,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer->ActivateRenderer = GL_ActivateRenderer;
|
renderer->ActivateRenderer = GL_ActivateRenderer;
|
||||||
|
renderer->DisplayModeChanged = GL_DisplayModeChanged;
|
||||||
renderer->CreateTexture = GL_CreateTexture;
|
renderer->CreateTexture = GL_CreateTexture;
|
||||||
renderer->SetTexturePalette = GL_SetTexturePalette;
|
renderer->SetTexturePalette = GL_SetTexturePalette;
|
||||||
renderer->GetTexturePalette = GL_GetTexturePalette;
|
renderer->GetTexturePalette = GL_GetTexturePalette;
|
||||||
|
@ -282,13 +285,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
} else {
|
} else {
|
||||||
data->glEnable(GL_TEXTURE_2D);
|
data->glEnable(GL_TEXTURE_2D);
|
||||||
}
|
}
|
||||||
data->glMatrixMode(GL_PROJECTION);
|
data->updateSize = SDL_TRUE;
|
||||||
data->glLoadIdentity();
|
|
||||||
data->glMatrixMode(GL_MODELVIEW);
|
|
||||||
data->glLoadIdentity();
|
|
||||||
data->glViewport(0, 0, window->w, window->h);
|
|
||||||
data->glOrtho(0.0, (GLdouble) window->w, (GLdouble) window->h, 0.0, 0.0,
|
|
||||||
1.0);
|
|
||||||
|
|
||||||
return renderer;
|
return renderer;
|
||||||
}
|
}
|
||||||
|
@ -299,7 +296,29 @@ GL_ActivateRenderer(SDL_Renderer * renderer)
|
||||||
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
|
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
|
||||||
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
|
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
|
||||||
|
|
||||||
return SDL_GL_MakeCurrent(window->id, data->context);
|
if (SDL_GL_MakeCurrent(window->id, data->context) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (data->updateSize) {
|
||||||
|
data->glMatrixMode(GL_PROJECTION);
|
||||||
|
data->glLoadIdentity();
|
||||||
|
data->glMatrixMode(GL_MODELVIEW);
|
||||||
|
data->glLoadIdentity();
|
||||||
|
data->glViewport(0, 0, window->w, window->h);
|
||||||
|
data->glOrtho(0.0, (GLdouble) window->w, (GLdouble) window->h, 0.0,
|
||||||
|
0.0, 1.0);
|
||||||
|
data->updateSize = SDL_FALSE;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
GL_DisplayModeChanged(SDL_Renderer * renderer)
|
||||||
|
{
|
||||||
|
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
|
||||||
|
|
||||||
|
data->updateSize = SDL_TRUE;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline__ int
|
static __inline__ int
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
/* SDL surface based renderer implementation */
|
/* SDL surface based renderer implementation */
|
||||||
|
|
||||||
static SDL_Renderer *SW_CreateRenderer(SDL_Window * window, Uint32 flags);
|
static SDL_Renderer *SW_CreateRenderer(SDL_Window * window, Uint32 flags);
|
||||||
|
static int SW_ActivateRenderer(SDL_Renderer * renderer);
|
||||||
|
static int SW_DisplayModeChanged(SDL_Renderer * renderer);
|
||||||
static int SW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
static int SW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||||
static int SW_QueryTexturePixels(SDL_Renderer * renderer,
|
static int SW_QueryTexturePixels(SDL_Renderer * renderer,
|
||||||
SDL_Texture * texture, void **pixels,
|
SDL_Texture * texture, void **pixels,
|
||||||
|
@ -179,7 +181,8 @@ SW_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
SDL_OutOfMemory();
|
SDL_OutOfMemory();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
renderer->ActivateRenderer = SW_ActivateRenderer;
|
||||||
|
renderer->DisplayModeChanged = SW_DisplayModeChanged;
|
||||||
renderer->CreateTexture = SW_CreateTexture;
|
renderer->CreateTexture = SW_CreateTexture;
|
||||||
renderer->QueryTexturePixels = SW_QueryTexturePixels;
|
renderer->QueryTexturePixels = SW_QueryTexturePixels;
|
||||||
renderer->SetTexturePalette = SW_SetTexturePalette;
|
renderer->SetTexturePalette = SW_SetTexturePalette;
|
||||||
|
@ -269,6 +272,32 @@ SW_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
return renderer;
|
return renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
SW_ActivateRenderer(SDL_Renderer * renderer)
|
||||||
|
{
|
||||||
|
SW_RenderData *data = (SW_RenderData *) renderer->driverdata;
|
||||||
|
|
||||||
|
if (data->renderer && data->renderer->ActivateRenderer) {
|
||||||
|
if (data->renderer->ActivateRenderer(data->renderer) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
SW_DisplayModeChanged(SDL_Renderer * renderer)
|
||||||
|
{
|
||||||
|
SW_RenderData *data = (SW_RenderData *) renderer->driverdata;
|
||||||
|
|
||||||
|
if (data->renderer && data->renderer->DisplayModeChanged) {
|
||||||
|
if (data->renderer->DisplayModeChanged(data->renderer) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
SW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
SW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
{
|
{
|
||||||
|
|
|
@ -56,6 +56,7 @@ struct SDL_Texture
|
||||||
struct SDL_Renderer
|
struct SDL_Renderer
|
||||||
{
|
{
|
||||||
int (*ActivateRenderer) (SDL_Renderer * renderer);
|
int (*ActivateRenderer) (SDL_Renderer * renderer);
|
||||||
|
int (*DisplayModeChanged) (SDL_Renderer * renderer);
|
||||||
int (*CreateTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
|
int (*CreateTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
|
||||||
int (*QueryTexturePixels) (SDL_Renderer * renderer, SDL_Texture * texture,
|
int (*QueryTexturePixels) (SDL_Renderer * renderer, SDL_Texture * texture,
|
||||||
void **pixels, int *pitch);
|
void **pixels, int *pitch);
|
||||||
|
@ -133,8 +134,7 @@ struct SDL_VideoDisplay
|
||||||
SDL_DisplayMode *display_modes;
|
SDL_DisplayMode *display_modes;
|
||||||
SDL_DisplayMode desktop_mode;
|
SDL_DisplayMode desktop_mode;
|
||||||
SDL_DisplayMode current_mode;
|
SDL_DisplayMode current_mode;
|
||||||
SDL_DisplayMode desired_mode;
|
SDL_DisplayMode fullscreen_mode;
|
||||||
SDL_DisplayMode *fullscreen_mode;
|
|
||||||
SDL_Palette *palette;
|
SDL_Palette *palette;
|
||||||
|
|
||||||
Uint16 *gamma;
|
Uint16 *gamma;
|
||||||
|
@ -389,6 +389,7 @@ extern SDL_VideoDisplay *SDL_GetDisplayFromWindow(SDL_Window * window);
|
||||||
|
|
||||||
extern void SDL_OnWindowShown(SDL_Window * window);
|
extern void SDL_OnWindowShown(SDL_Window * window);
|
||||||
extern void SDL_OnWindowHidden(SDL_Window * window);
|
extern void SDL_OnWindowHidden(SDL_Window * window);
|
||||||
|
extern void SDL_OnWindowResized(SDL_Window * window);
|
||||||
extern void SDL_OnWindowFocusGained(SDL_Window * window);
|
extern void SDL_OnWindowFocusGained(SDL_Window * window);
|
||||||
extern void SDL_OnWindowFocusLost(SDL_Window * window);
|
extern void SDL_OnWindowFocusLost(SDL_Window * window);
|
||||||
extern SDL_WindowID SDL_GetFocusWindow(void);
|
extern SDL_WindowID SDL_GetFocusWindow(void);
|
||||||
|
|
|
@ -645,6 +645,7 @@ int
|
||||||
SDL_SetFullscreenDisplayMode(const SDL_DisplayMode * mode)
|
SDL_SetFullscreenDisplayMode(const SDL_DisplayMode * mode)
|
||||||
{
|
{
|
||||||
SDL_VideoDisplay *display;
|
SDL_VideoDisplay *display;
|
||||||
|
SDL_DisplayMode fullscreen_mode;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!_this) {
|
if (!_this) {
|
||||||
|
@ -653,18 +654,29 @@ SDL_SetFullscreenDisplayMode(const SDL_DisplayMode * mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
display = &SDL_CurrentDisplay;
|
display = &SDL_CurrentDisplay;
|
||||||
if (mode) {
|
if (!mode) {
|
||||||
SDL_GetClosestDisplayMode(mode, &display->desired_mode);
|
mode = &display->desktop_mode;
|
||||||
display->fullscreen_mode = &display->desired_mode;
|
|
||||||
} else {
|
|
||||||
display->fullscreen_mode = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_GetClosestDisplayMode(mode, &fullscreen_mode);
|
||||||
|
if (SDL_memcmp
|
||||||
|
(&fullscreen_mode, &display->fullscreen_mode,
|
||||||
|
sizeof(fullscreen_mode)) == 0) {
|
||||||
|
/* Nothing to do... */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
display->fullscreen_mode = fullscreen_mode;
|
||||||
|
|
||||||
/* Actually set the mode if we have a fullscreen window visible */
|
/* Actually set the mode if we have a fullscreen window visible */
|
||||||
for (i = 0; i < display->num_windows; ++i) {
|
for (i = 0; i < display->num_windows; ++i) {
|
||||||
SDL_Window *window = &display->windows[i];
|
SDL_Window *window = &display->windows[i];
|
||||||
if (FULLSCREEN_VISIBLE(window)) {
|
if (FULLSCREEN_VISIBLE(window)) {
|
||||||
return SDL_SetDisplayMode(display->fullscreen_mode);
|
if (SDL_SetDisplayMode(&display->fullscreen_mode) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||||
|
SDL_OnWindowResized(window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -678,7 +690,7 @@ SDL_GetFullscreenDisplayMode(SDL_DisplayMode * mode)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (mode) {
|
if (mode) {
|
||||||
*mode = *SDL_CurrentDisplay.fullscreen_mode;
|
*mode = SDL_CurrentDisplay.fullscreen_mode;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1197,7 +1209,7 @@ SDL_SetWindowFullscreen(SDL_WindowID windowID, int fullscreen)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_SetDisplayMode(display->fullscreen_mode);
|
SDL_SetDisplayMode(&display->fullscreen_mode);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
window->flags &= ~SDL_WINDOW_FULLSCREEN;
|
window->flags &= ~SDL_WINDOW_FULLSCREEN;
|
||||||
|
@ -1251,13 +1263,23 @@ SDL_OnWindowHidden(SDL_Window * window)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SDL_OnWindowResized(SDL_Window * window)
|
||||||
|
{
|
||||||
|
SDL_Renderer *renderer = window->renderer;
|
||||||
|
|
||||||
|
if (renderer && renderer->DisplayModeChanged) {
|
||||||
|
renderer->DisplayModeChanged(renderer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SDL_OnWindowFocusGained(SDL_Window * window)
|
SDL_OnWindowFocusGained(SDL_Window * window)
|
||||||
{
|
{
|
||||||
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
|
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
|
||||||
|
|
||||||
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||||
SDL_SetDisplayMode(display->fullscreen_mode);
|
SDL_SetDisplayMode(&display->fullscreen_mode);
|
||||||
}
|
}
|
||||||
if (display->gamma && _this->SetDisplayGammaRamp) {
|
if (display->gamma && _this->SetDisplayGammaRamp) {
|
||||||
_this->SetDisplayGammaRamp(_this, display->gamma);
|
_this->SetDisplayGammaRamp(_this, display->gamma);
|
||||||
|
|
|
@ -268,6 +268,7 @@ Cocoa_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
|
||||||
NSOpenGLContext *nscontext = (NSOpenGLContext *)context;
|
NSOpenGLContext *nscontext = (NSOpenGLContext *)context;
|
||||||
|
|
||||||
[nscontext setView:[windowdata->window contentView]];
|
[nscontext setView:[windowdata->window contentView]];
|
||||||
|
[nscontext update];
|
||||||
[nscontext makeCurrentContext];
|
[nscontext makeCurrentContext];
|
||||||
} else {
|
} else {
|
||||||
[NSOpenGLContext clearCurrentContext];
|
[NSOpenGLContext clearCurrentContext];
|
||||||
|
|
|
@ -749,15 +749,15 @@ PrintEvent(SDL_Event * event)
|
||||||
fprintf(stderr, "Window %d hidden", event->window.windowID);
|
fprintf(stderr, "Window %d hidden", event->window.windowID);
|
||||||
break;
|
break;
|
||||||
case SDL_WINDOWEVENT_EXPOSED:
|
case SDL_WINDOWEVENT_EXPOSED:
|
||||||
fprintf(stderr, "Window %d exposed: %d", event->window.windowID);
|
fprintf(stderr, "Window %d exposed", event->window.windowID);
|
||||||
break;
|
break;
|
||||||
case SDL_WINDOWEVENT_MOVED:
|
case SDL_WINDOWEVENT_MOVED:
|
||||||
fprintf(stderr, "Window %d moved to %d,%d: %d",
|
fprintf(stderr, "Window %d moved to %d,%d",
|
||||||
event->window.windowID, event->window.data1,
|
event->window.windowID, event->window.data1,
|
||||||
event->window.data2);
|
event->window.data2);
|
||||||
break;
|
break;
|
||||||
case SDL_WINDOWEVENT_RESIZED:
|
case SDL_WINDOWEVENT_RESIZED:
|
||||||
fprintf(stderr, "Window %d resized to %dx%d: %d",
|
fprintf(stderr, "Window %d resized to %dx%d",
|
||||||
event->window.windowID, event->window.data1,
|
event->window.windowID, event->window.data1,
|
||||||
event->window.data2);
|
event->window.data2);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue