Added resize support for GDI and Direct3D renderers
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402022
This commit is contained in:
parent
e16c932a5c
commit
3e23ac57e2
3 changed files with 108 additions and 9 deletions
|
@ -789,7 +789,7 @@ GL_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
texture->driverdata = NULL;
|
texture->driverdata = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
GL_DestroyRenderer(SDL_Renderer * renderer)
|
GL_DestroyRenderer(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
|
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
/* Direct3D renderer implementation */
|
/* Direct3D renderer implementation */
|
||||||
|
|
||||||
static SDL_Renderer *D3D_CreateRenderer(SDL_Window * window, Uint32 flags);
|
static SDL_Renderer *D3D_CreateRenderer(SDL_Window * window, Uint32 flags);
|
||||||
|
static int D3D_DisplayModeChanged(SDL_Renderer * renderer);
|
||||||
static int D3D_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
static int D3D_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||||
static int D3D_SetTexturePalette(SDL_Renderer * renderer,
|
static int D3D_SetTexturePalette(SDL_Renderer * renderer,
|
||||||
SDL_Texture * texture,
|
SDL_Texture * texture,
|
||||||
|
@ -61,7 +62,7 @@ SDL_RenderDriver D3D_RenderDriver = {
|
||||||
{
|
{
|
||||||
"d3d",
|
"d3d",
|
||||||
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
|
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
|
||||||
SDL_RENDERER_PRESENTFLIP2 | sDL_RENDERER_PRESENTFLIP3 |
|
SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
|
||||||
SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC |
|
SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC |
|
||||||
SDL_RENDERER_ACCELERATED),
|
SDL_RENDERER_ACCELERATED),
|
||||||
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK |
|
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK |
|
||||||
|
@ -90,6 +91,7 @@ SDL_RenderDriver D3D_RenderDriver = {
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
IDirect3DDevice9 *device;
|
IDirect3DDevice9 *device;
|
||||||
|
D3DPRESENT_PARAMETERS pparams;
|
||||||
SDL_bool beginScene;
|
SDL_bool beginScene;
|
||||||
} D3D_RenderData;
|
} D3D_RenderData;
|
||||||
|
|
||||||
|
@ -182,6 +184,7 @@ D3D_SetError(const char *prefix, HRESULT result)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
SDL_SetError("%s: %s", prefix, error);
|
SDL_SetError("%s: %s", prefix, error);
|
||||||
|
fprintf(stderr, "%s: %s\n", prefix, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
static D3DFORMAT
|
static D3DFORMAT
|
||||||
|
@ -253,6 +256,7 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderer->DisplayModeChanged = D3D_DisplayModeChanged;
|
||||||
renderer->CreateTexture = D3D_CreateTexture;
|
renderer->CreateTexture = D3D_CreateTexture;
|
||||||
renderer->SetTexturePalette = D3D_SetTexturePalette;
|
renderer->SetTexturePalette = D3D_SetTexturePalette;
|
||||||
renderer->GetTexturePalette = D3D_GetTexturePalette;
|
renderer->GetTexturePalette = D3D_GetTexturePalette;
|
||||||
|
@ -276,7 +280,7 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
pparams.BackBufferHeight = window->h;
|
pparams.BackBufferHeight = window->h;
|
||||||
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||||
pparams.BackBufferFormat =
|
pparams.BackBufferFormat =
|
||||||
PixelFormatToD3DFMT(display->fullscreen_mode->format);
|
PixelFormatToD3DFMT(display->fullscreen_mode.format);
|
||||||
} else {
|
} else {
|
||||||
pparams.BackBufferFormat = D3DFMT_UNKNOWN;
|
pparams.BackBufferFormat = D3DFMT_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
@ -296,7 +300,7 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||||
pparams.Windowed = FALSE;
|
pparams.Windowed = FALSE;
|
||||||
pparams.FullScreen_RefreshRateInHz =
|
pparams.FullScreen_RefreshRateInHz =
|
||||||
display->fullscreen_mode->refresh_rate;
|
display->fullscreen_mode.refresh_rate;
|
||||||
} else {
|
} else {
|
||||||
pparams.Windowed = TRUE;
|
pparams.Windowed = TRUE;
|
||||||
pparams.FullScreen_RefreshRateInHz = 0;
|
pparams.FullScreen_RefreshRateInHz = 0;
|
||||||
|
@ -355,6 +359,7 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
if (pparams.PresentationInterval == D3DPRESENT_INTERVAL_ONE) {
|
if (pparams.PresentationInterval == D3DPRESENT_INTERVAL_ONE) {
|
||||||
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
|
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
|
||||||
}
|
}
|
||||||
|
data->pparams = pparams;
|
||||||
|
|
||||||
IDirect3DDevice9_GetDeviceCaps(data->device, &caps);
|
IDirect3DDevice9_GetDeviceCaps(data->device, &caps);
|
||||||
renderer->info.max_texture_width = caps.MaxTextureWidth;
|
renderer->info.max_texture_width = caps.MaxTextureWidth;
|
||||||
|
@ -370,6 +375,48 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
return renderer;
|
return renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
D3D_Reset(SDL_Renderer * renderer)
|
||||||
|
{
|
||||||
|
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
|
||||||
|
HRESULT result;
|
||||||
|
|
||||||
|
result = IDirect3DDevice9_Reset(data->device, &data->pparams);
|
||||||
|
if (FAILED(result)) {
|
||||||
|
if (result == D3DERR_DEVICELOST) {
|
||||||
|
/* Don't worry about it, we'll reset later... */
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
D3D_SetError("Reset()", result);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IDirect3DDevice9_SetVertexShader(data->device, NULL);
|
||||||
|
IDirect3DDevice9_SetFVF(data->device, D3DFVF_XYZRHW | D3DFVF_TEX1);
|
||||||
|
IDirect3DDevice9_SetRenderState(data->device, D3DRS_CULLMODE,
|
||||||
|
D3DCULL_NONE);
|
||||||
|
IDirect3DDevice9_SetRenderState(data->device, D3DRS_LIGHTING, FALSE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
D3D_DisplayModeChanged(SDL_Renderer * renderer)
|
||||||
|
{
|
||||||
|
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
|
||||||
|
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
|
||||||
|
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
|
||||||
|
|
||||||
|
data->pparams.BackBufferWidth = window->w;
|
||||||
|
data->pparams.BackBufferHeight = window->h;
|
||||||
|
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||||
|
data->pparams.BackBufferFormat =
|
||||||
|
PixelFormatToD3DFMT(display->fullscreen_mode.format);
|
||||||
|
} else {
|
||||||
|
data->pparams.BackBufferFormat = D3DFMT_UNKNOWN;
|
||||||
|
}
|
||||||
|
return D3D_Reset(renderer);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
D3D_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
D3D_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
{
|
{
|
||||||
|
@ -388,6 +435,12 @@ D3D_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
|
|
||||||
texture->driverdata = data;
|
texture->driverdata = data;
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
/* FIXME: Do we want non-managed textures?
|
||||||
|
They need to be freed on device reset and then reloaded by the app...
|
||||||
|
*/
|
||||||
|
texture->access = SDL_TEXTUREACCESS_LOCAL;
|
||||||
|
#endif
|
||||||
if (texture->access == SDL_TEXTUREACCESS_LOCAL) {
|
if (texture->access == SDL_TEXTUREACCESS_LOCAL) {
|
||||||
pool = D3DPOOL_MANAGED;
|
pool = D3DPOOL_MANAGED;
|
||||||
} else {
|
} else {
|
||||||
|
@ -709,6 +762,14 @@ D3D_RenderPresent(SDL_Renderer * renderer)
|
||||||
data->beginScene = SDL_TRUE;
|
data->beginScene = SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = IDirect3DDevice9_TestCooperativeLevel(data->device);
|
||||||
|
if (result == D3DERR_DEVICELOST) {
|
||||||
|
/* We'll reset later */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (result == D3DERR_DEVICENOTRESET) {
|
||||||
|
D3D_Reset(renderer);
|
||||||
|
}
|
||||||
result = IDirect3DDevice9_Present(data->device, NULL, NULL, NULL, NULL);
|
result = IDirect3DDevice9_Present(data->device, NULL, NULL, NULL, NULL);
|
||||||
if (FAILED(result)) {
|
if (FAILED(result)) {
|
||||||
D3D_SetError("Present()", result);
|
D3D_SetError("Present()", result);
|
||||||
|
@ -730,7 +791,7 @@ D3D_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
texture->driverdata = NULL;
|
texture->driverdata = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
D3D_DestroyRenderer(SDL_Renderer * renderer)
|
D3D_DestroyRenderer(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
|
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
/* GDI renderer implementation */
|
/* GDI renderer implementation */
|
||||||
|
|
||||||
static SDL_Renderer *GDI_CreateRenderer(SDL_Window * window, Uint32 flags);
|
static SDL_Renderer *GDI_CreateRenderer(SDL_Window * window, Uint32 flags);
|
||||||
|
static int GDI_DisplayModeChanged(SDL_Renderer * renderer);
|
||||||
static int GDI_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
static int GDI_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
|
||||||
static int GDI_QueryTexturePixels(SDL_Renderer * renderer,
|
static int GDI_QueryTexturePixels(SDL_Renderer * renderer,
|
||||||
SDL_Texture * texture, void **pixels,
|
SDL_Texture * texture, void **pixels,
|
||||||
|
@ -66,7 +67,7 @@ SDL_RenderDriver GDI_RenderDriver = {
|
||||||
{
|
{
|
||||||
"gdi",
|
"gdi",
|
||||||
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
|
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
|
||||||
SDL_RENDERER_PRESENTFLIP2 | sDL_RENDERER_PRESENTFLIP3 |
|
SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
|
||||||
SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED),
|
SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED),
|
||||||
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK |
|
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK |
|
||||||
SDL_TEXTUREBLENDMODE_BLEND),
|
SDL_TEXTUREBLENDMODE_BLEND),
|
||||||
|
@ -155,6 +156,7 @@ GDI_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderer->DisplayModeChanged = GDI_DisplayModeChanged;
|
||||||
renderer->CreateTexture = GDI_CreateTexture;
|
renderer->CreateTexture = GDI_CreateTexture;
|
||||||
renderer->QueryTexturePixels = GDI_QueryTexturePixels;
|
renderer->QueryTexturePixels = GDI_QueryTexturePixels;
|
||||||
renderer->SetTexturePalette = GDI_SetTexturePalette;
|
renderer->SetTexturePalette = GDI_SetTexturePalette;
|
||||||
|
@ -196,7 +198,7 @@ GDI_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
|
|
||||||
if (flags & SDL_RENDERER_SINGLEBUFFER) {
|
if (flags & SDL_RENDERER_SINGLEBUFFER) {
|
||||||
renderer->info.flags |=
|
renderer->info.flags |=
|
||||||
(SDL_RENDERER_SINGLEBUFFER | sDL_RENDERER_PRESENTCOPY);
|
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY);
|
||||||
n = 0;
|
n = 0;
|
||||||
} else if (flags & SDL_RENDERER_PRESENTFLIP2) {
|
} else if (flags & SDL_RENDERER_PRESENTFLIP2) {
|
||||||
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2;
|
renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2;
|
||||||
|
@ -230,6 +232,42 @@ GDI_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
return renderer;
|
return renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
GDI_DisplayModeChanged(SDL_Renderer * renderer)
|
||||||
|
{
|
||||||
|
GDI_RenderData *data = (GDI_RenderData *) renderer->driverdata;
|
||||||
|
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
|
||||||
|
int i, n;
|
||||||
|
|
||||||
|
if (renderer->info.flags & SDL_RENDERER_SINGLEBUFFER) {
|
||||||
|
n = 0;
|
||||||
|
} else if (renderer->info.flags & SDL_RENDERER_PRESENTFLIP2) {
|
||||||
|
n = 2;
|
||||||
|
} else if (renderer->info.flags & SDL_RENDERER_PRESENTFLIP3) {
|
||||||
|
n = 3;
|
||||||
|
} else {
|
||||||
|
n = 1;
|
||||||
|
}
|
||||||
|
for (i = 0; i < n; ++i) {
|
||||||
|
if (data->hbm[i]) {
|
||||||
|
DeleteObject(data->hbm[i]);
|
||||||
|
data->hbm[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0; i < n; ++i) {
|
||||||
|
data->hbm[i] =
|
||||||
|
CreateCompatibleBitmap(data->window_hdc, window->w, window->h);
|
||||||
|
if (!data->hbm[i]) {
|
||||||
|
WIN_SetError("CreateCompatibleBitmap()");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (n > 0) {
|
||||||
|
SelectObject(data->render_hdc, data->hbm[0]);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
GDI_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
GDI_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
{
|
{
|
||||||
|
@ -258,7 +296,7 @@ GDI_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
data->pitch = (texture->w * SDL_BYTESPERPIXEL(data->format));
|
data->pitch = (texture->w * SDL_BYTESPERPIXEL(data->format));
|
||||||
|
|
||||||
if (data->yuv || texture->access == SDL_TEXTUREACCESS_LOCAL
|
if (data->yuv || texture->access == SDL_TEXTUREACCESS_LOCAL
|
||||||
|| texture->format != SDL_GetCurrentDisplayMode()->format) {
|
|| texture->format != display->current_mode.format) {
|
||||||
int bmi_size;
|
int bmi_size;
|
||||||
LPBITMAPINFO bmi;
|
LPBITMAPINFO bmi;
|
||||||
|
|
||||||
|
@ -621,7 +659,7 @@ GDI_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
texture->driverdata = NULL;
|
texture->driverdata = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
GDI_DestroyRenderer(SDL_Renderer * renderer)
|
GDI_DestroyRenderer(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
GDI_RenderData *data = (GDI_RenderData *) renderer->driverdata;
|
GDI_RenderData *data = (GDI_RenderData *) renderer->driverdata;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue