WinRT: added SDL_WINDOWEVENT_RESIZED support, and moved window-resize-handling code from WinRT rendering code to D3D 11.1 code

This commit is contained in:
David Ludwig 2013-02-09 16:00:55 -05:00
parent 0408a58b16
commit 43c3909acd
4 changed files with 21 additions and 18 deletions

View file

@ -51,8 +51,8 @@ using namespace Windows::UI::Core;
/* Direct3D 11.1 renderer implementation */ /* Direct3D 11.1 renderer implementation */
static SDL_Renderer *D3D11_CreateRenderer(SDL_Window * window, Uint32 flags); static SDL_Renderer *D3D11_CreateRenderer(SDL_Window * window, Uint32 flags);
//static void D3D11_WindowEvent(SDL_Renderer * renderer, static void D3D11_WindowEvent(SDL_Renderer * renderer,
// const SDL_WindowEvent *event); const SDL_WindowEvent *event);
//static int D3D11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture); //static int D3D11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
//static int D3D11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, //static int D3D11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
// const SDL_Rect * rect, const void *pixels, // const SDL_Rect * rect, const void *pixels,
@ -131,9 +131,7 @@ D3D11_CreateRenderer(SDL_Window * window, Uint32 flags)
data->windowSizeInDIPs = XMFLOAT2(0, 0); data->windowSizeInDIPs = XMFLOAT2(0, 0);
data->renderTargetSize = XMFLOAT2(0, 0); data->renderTargetSize = XMFLOAT2(0, 0);
// TODO: Create Direct3D Object(s) renderer->WindowEvent = D3D11_WindowEvent;
//renderer->WindowEvent = D3D11_WindowEvent;
//renderer->CreateTexture = D3D11_CreateTexture; //renderer->CreateTexture = D3D11_CreateTexture;
//renderer->UpdateTexture = D3D11_UpdateTexture; //renderer->UpdateTexture = D3D11_UpdateTexture;
//renderer->LockTexture = D3D11_LockTexture; //renderer->LockTexture = D3D11_LockTexture;
@ -402,7 +400,7 @@ D3D11_CreateDeviceResources(SDL_Renderer * renderer)
#ifdef __WINRT__ #ifdef __WINRT__
CoreWindow ^ static CoreWindow ^
D3D11_GetCoreWindowFromSDLRenderer(SDL_Renderer * renderer) D3D11_GetCoreWindowFromSDLRenderer(SDL_Renderer * renderer)
{ {
SDL_Window * sdlWindow = renderer->window; SDL_Window * sdlWindow = renderer->window;
@ -660,6 +658,7 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
return S_OK; return S_OK;
} }
// This method is called when the window's size changes.
HRESULT HRESULT
D3D11_UpdateForWindowSizeChange(SDL_Renderer * renderer) D3D11_UpdateForWindowSizeChange(SDL_Renderer * renderer)
{ {
@ -691,7 +690,7 @@ D3D11_HandleDeviceLost(SDL_Renderer * renderer)
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata; D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
HRESULT result = S_OK; HRESULT result = S_OK;
// Reset these member variables to ensure that UpdateForWindowSizeChange recreates all resources. // Reset these member variables to ensure that D3D11_UpdateForWindowSizeChange recreates all resources.
data->windowSizeInDIPs.x = 0; data->windowSizeInDIPs.x = 0;
data->windowSizeInDIPs.y = 0; data->windowSizeInDIPs.y = 0;
data->swapChain = nullptr; data->swapChain = nullptr;
@ -711,6 +710,16 @@ D3D11_HandleDeviceLost(SDL_Renderer * renderer)
return S_OK; return S_OK;
} }
static void
D3D11_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
{
//D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
if (event->event == SDL_WINDOWEVENT_RESIZED) {
D3D11_UpdateForWindowSizeChange(renderer);
}
}
static int static int
D3D11_UpdateViewport(SDL_Renderer * renderer) D3D11_UpdateViewport(SDL_Renderer * renderer)
{ {

View file

@ -151,7 +151,11 @@ void SDL_WinRTApp::Uninitialize()
void SDL_WinRTApp::OnWindowSizeChanged(CoreWindow^ sender, WindowSizeChangedEventArgs^ args) void SDL_WinRTApp::OnWindowSizeChanged(CoreWindow^ sender, WindowSizeChangedEventArgs^ args)
{ {
m_renderer->UpdateForWindowSizeChange(); SDL_SendWindowEvent(
m_sdlWindowData->sdlWindow,
SDL_WINDOWEVENT_RESIZED,
(int) ceil(args->Size.Width),
(int) ceil(args->Size.Height));
} }
void SDL_WinRTApp::OnVisibilityChanged(CoreWindow^ sender, VisibilityChangedEventArgs^ args) void SDL_WinRTApp::OnVisibilityChanged(CoreWindow^ sender, VisibilityChangedEventArgs^ args)

View file

@ -16,9 +16,6 @@ using namespace Windows::UI::Core;
using namespace Windows::Foundation; using namespace Windows::Foundation;
using namespace Windows::Graphics::Display; using namespace Windows::Graphics::Display;
extern CoreWindow ^ D3D11_GetCoreWindowFromSDLRenderer(SDL_Renderer * renderer);
extern HRESULT D3D11_UpdateForWindowSizeChange(SDL_Renderer * renderer);
// Constructor. // Constructor.
SDL_winrtrenderer::SDL_winrtrenderer() : SDL_winrtrenderer::SDL_winrtrenderer() :
m_mainTextureHelperSurface(NULL), m_mainTextureHelperSurface(NULL),
@ -102,12 +99,6 @@ void SDL_winrtrenderer::ResizeMainTexture(int w, int h)
); );
} }
// This method is called in the event handler for the SizeChanged event.
void SDL_winrtrenderer::UpdateForWindowSizeChange()
{
DX::ThrowIfFailed(D3D11_UpdateForWindowSizeChange(m_sdlRenderer));
}
void SDL_winrtrenderer::Render(SDL_Surface * surface, SDL_Rect * rects, int numrects) void SDL_winrtrenderer::Render(SDL_Surface * surface, SDL_Rect * rects, int numrects)
{ {
const float blackColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; const float blackColor[] = { 0.0f, 0.0f, 0.0f, 0.0f };

View file

@ -16,7 +16,6 @@ internal:
public: public:
virtual ~SDL_winrtrenderer(); virtual ~SDL_winrtrenderer();
virtual void UpdateForWindowSizeChange();
virtual void Present(); virtual void Present();
internal: internal: