From ee07fe6b56772d18030afd3e496853a53490fbf4 Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Sat, 9 Feb 2013 16:00:55 -0500 Subject: [PATCH] WinRT: added SDL_WINDOWEVENT_RESIZED support, and moved window-resize-handling code from WinRT rendering code to D3D 11.1 code --- src/render/direct3d11/SDL_render_d3d11.cpp | 23 +++++++++++++++------- src/video/windowsrt/SDL_WinRTApp.cpp | 6 +++++- src/video/windowsrt/SDL_winrtrenderer.cpp | 9 --------- src/video/windowsrt/SDL_winrtrenderer.h | 1 - 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/render/direct3d11/SDL_render_d3d11.cpp b/src/render/direct3d11/SDL_render_d3d11.cpp index da45862a9..3ba765769 100644 --- a/src/render/direct3d11/SDL_render_d3d11.cpp +++ b/src/render/direct3d11/SDL_render_d3d11.cpp @@ -51,8 +51,8 @@ using namespace Windows::UI::Core; /* Direct3D 11.1 renderer implementation */ static SDL_Renderer *D3D11_CreateRenderer(SDL_Window * window, Uint32 flags); -//static void D3D11_WindowEvent(SDL_Renderer * renderer, -// const SDL_WindowEvent *event); +static void D3D11_WindowEvent(SDL_Renderer * renderer, + const SDL_WindowEvent *event); //static int D3D11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture); //static int D3D11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, // const SDL_Rect * rect, const void *pixels, @@ -131,9 +131,7 @@ D3D11_CreateRenderer(SDL_Window * window, Uint32 flags) data->windowSizeInDIPs = 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->UpdateTexture = D3D11_UpdateTexture; //renderer->LockTexture = D3D11_LockTexture; @@ -402,7 +400,7 @@ D3D11_CreateDeviceResources(SDL_Renderer * renderer) #ifdef __WINRT__ -CoreWindow ^ +static CoreWindow ^ D3D11_GetCoreWindowFromSDLRenderer(SDL_Renderer * renderer) { SDL_Window * sdlWindow = renderer->window; @@ -660,6 +658,7 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer) return S_OK; } +// This method is called when the window's size changes. HRESULT D3D11_UpdateForWindowSizeChange(SDL_Renderer * renderer) { @@ -691,7 +690,7 @@ D3D11_HandleDeviceLost(SDL_Renderer * renderer) D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata; 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.y = 0; data->swapChain = nullptr; @@ -711,6 +710,16 @@ D3D11_HandleDeviceLost(SDL_Renderer * renderer) 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 D3D11_UpdateViewport(SDL_Renderer * renderer) { diff --git a/src/video/windowsrt/SDL_WinRTApp.cpp b/src/video/windowsrt/SDL_WinRTApp.cpp index 493d88195..d9f433163 100644 --- a/src/video/windowsrt/SDL_WinRTApp.cpp +++ b/src/video/windowsrt/SDL_WinRTApp.cpp @@ -151,7 +151,11 @@ void SDL_WinRTApp::Uninitialize() 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) diff --git a/src/video/windowsrt/SDL_winrtrenderer.cpp b/src/video/windowsrt/SDL_winrtrenderer.cpp index ea831ddce..bb89580a8 100644 --- a/src/video/windowsrt/SDL_winrtrenderer.cpp +++ b/src/video/windowsrt/SDL_winrtrenderer.cpp @@ -16,9 +16,6 @@ using namespace Windows::UI::Core; using namespace Windows::Foundation; using namespace Windows::Graphics::Display; -extern CoreWindow ^ D3D11_GetCoreWindowFromSDLRenderer(SDL_Renderer * renderer); -extern HRESULT D3D11_UpdateForWindowSizeChange(SDL_Renderer * renderer); - // Constructor. SDL_winrtrenderer::SDL_winrtrenderer() : 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) { const float blackColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; diff --git a/src/video/windowsrt/SDL_winrtrenderer.h b/src/video/windowsrt/SDL_winrtrenderer.h index 7d172f8c3..061cdb3a2 100644 --- a/src/video/windowsrt/SDL_winrtrenderer.h +++ b/src/video/windowsrt/SDL_winrtrenderer.h @@ -16,7 +16,6 @@ ref class SDL_winrtrenderer public: virtual ~SDL_winrtrenderer(); - virtual void UpdateForWindowSizeChange(); virtual void Present(); internal: