From a8fb9fe7caea21d702c550630273718e390f3c30 Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Sat, 9 Feb 2013 15:22:49 -0500 Subject: [PATCH] WinRT: made the Direct3D 11.1 renderer directly initialize more of itself, rather than deferring to code in the WinRT video driver --- src/render/direct3d11/SDL_render_d3d11.cpp | 174 +++------------------ src/video/windowsrt/SDL_winrtrenderer.cpp | 7 - src/video/windowsrt/SDL_winrtrenderer.h | 1 - src/video/windowsrt/SDL_winrtvideo.cpp | 2 +- 4 files changed, 27 insertions(+), 157 deletions(-) diff --git a/src/render/direct3d11/SDL_render_d3d11.cpp b/src/render/direct3d11/SDL_render_d3d11.cpp index 8fb436143..63dbfe00b 100644 --- a/src/render/direct3d11/SDL_render_d3d11.cpp +++ b/src/render/direct3d11/SDL_render_d3d11.cpp @@ -79,11 +79,11 @@ static int D3D11_UpdateViewport(SDL_Renderer * renderer); static void D3D11_RenderPresent(SDL_Renderer * renderer); //static void D3D11_DestroyTexture(SDL_Renderer * renderer, // SDL_Texture * texture); -//static void D3D11_DestroyRenderer(SDL_Renderer * renderer); +static void D3D11_DestroyRenderer(SDL_Renderer * renderer); /* Direct3D 11.1 Internal Functions */ HRESULT D3D11_CreateDeviceResources(SDL_Renderer * renderer); - +HRESULT D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer); extern "C" { SDL_RenderDriver D3D11_RenderDriver = { @@ -110,17 +110,6 @@ D3D11_CreateRenderer(SDL_Window * window, Uint32 flags) { SDL_Renderer *renderer; D3D11_RenderData *data; -// SDL_SysWMinfo windowinfo; - // HRESULT result; - // D3DPRESENT_PARAMETERS pparams; - // IDirect3DSwapChain9 *chain; - // D3DCAPS9 caps; - // Uint32 window_flags; - // int w, h; - // SDL_DisplayMode fullscreen_mode; - // D3DMATRIX matrix; - // int d3dxVersion; - //char d3dxDLLFile[50]; renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer)); if (!renderer) { @@ -158,149 +147,38 @@ D3D11_CreateRenderer(SDL_Window * window, Uint32 flags) //renderer->RenderReadPixels = D3D11_RenderReadPixels; renderer->RenderPresent = D3D11_RenderPresent; //renderer->DestroyTexture = D3D11_DestroyTexture; - //renderer->DestroyRenderer = D3D11_DestroyRenderer; + renderer->DestroyRenderer = D3D11_DestroyRenderer; renderer->info = D3D11_RenderDriver.info; + renderer->info.flags = SDL_RENDERER_ACCELERATED; renderer->driverdata = data; - renderer->info.flags = SDL_RENDERER_ACCELERATED; + // HACK: make sure the SDL_Renderer references the SDL_Window data now, in + // order to give init functions access to the underlying window handle: + renderer->window = window; - //SDL_VERSION(&windowinfo.version); - //SDL_GetWindowWMInfo(window, &windowinfo); - - //window_flags = SDL_GetWindowFlags(window); - //SDL_GetWindowSize(window, &w, &h); - //SDL_GetWindowDisplayMode(window, &fullscreen_mode); - - //SDL_zero(pparams); - //pparams.hDeviceWindow = windowinfo.info.win.window; - //pparams.BackBufferWidth = w; - //pparams.BackBufferHeight = h; - //if (window_flags & SDL_WINDOW_FULLSCREEN) { - // pparams.BackBufferFormat = - // PixelFormatToD3DFMT(fullscreen_mode.format); - //} else { - // pparams.BackBufferFormat = D3DFMT_UNKNOWN; - //} - //pparams.BackBufferCount = 1; - //pparams.SwapEffect = D3DSWAPEFFECT_DISCARD; - - //if (window_flags & SDL_WINDOW_FULLSCREEN) { - // pparams.Windowed = FALSE; - // pparams.FullScreen_RefreshRateInHz = - // fullscreen_mode.refresh_rate; - //} else { - // pparams.Windowed = TRUE; - // pparams.FullScreen_RefreshRateInHz = 0; - //} - //if (flags & SDL_RENDERER_PRESENTVSYNC) { - // pparams.PresentationInterval = D3DPRESENT_INTERVAL_ONE; - //} else { - // pparams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - //} - - ///* FIXME: Which adapter? */ - //data->adapter = D3DADAPTER_DEFAULT; - //IDirect3D9_GetDeviceCaps(data->d3d, data->adapter, D3DDEVTYPE_HAL, &caps); - - //result = IDirect3D9_CreateDevice(data->d3d, data->adapter, - // D3DDEVTYPE_HAL, - // pparams.hDeviceWindow, - // D3DCREATE_FPU_PRESERVE | ((caps. - // DevCaps & - // D3DDEVCAPS_HWTRANSFORMANDLIGHT) ? - // D3DCREATE_HARDWARE_VERTEXPROCESSING : - // D3DCREATE_SOFTWARE_VERTEXPROCESSING), - // &pparams, &data->device); - //if (FAILED(result)) { - // D3D11_DestroyRenderer(renderer); - // D3D11_SetError("CreateDevice()", result); - // return NULL; - //} - //data->beginScene = SDL_TRUE; - //data->scaleMode = D3DTEXF_FORCE_DWORD; - - ///* Get presentation parameters to fill info */ - //result = IDirect3DDevice9_GetSwapChain(data->device, 0, &chain); - //if (FAILED(result)) { - // D3D11_DestroyRenderer(renderer); - // D3D11_SetError("GetSwapChain()", result); - // return NULL; - //} - //result = IDirect3DSwapChain9_GetPresentParameters(chain, &pparams); - //if (FAILED(result)) { - // IDirect3DSwapChain9_Release(chain); - // D3D11_DestroyRenderer(renderer); - // D3D11_SetError("GetPresentParameters()", result); - // return NULL; - //} - //IDirect3DSwapChain9_Release(chain); - //if (pparams.PresentationInterval == D3DPRESENT_INTERVAL_ONE) { - // renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC; - //} - //data->pparams = pparams; - - //IDirect3DDevice9_GetDeviceCaps(data->device, &caps); - //renderer->info.max_texture_width = caps.MaxTextureWidth; - //renderer->info.max_texture_height = caps.MaxTextureHeight; - //if (caps.NumSimultaneousRTs >= 2) { - // renderer->info.flags |= SDL_RENDERER_TARGETTEXTURE; - //} - - ///* Set up parameters for rendering */ - //IDirect3DDevice9_SetVertexShader(data->device, NULL); - //IDirect3DDevice9_SetFVF(data->device, - // D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1); - //IDirect3DDevice9_SetRenderState(data->device, D3DRS_ZENABLE, D3DZB_FALSE); - //IDirect3DDevice9_SetRenderState(data->device, D3DRS_CULLMODE, - // D3DCULL_NONE); - //IDirect3DDevice9_SetRenderState(data->device, D3DRS_LIGHTING, FALSE); - ///* Enable color modulation by diffuse color */ - //IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_COLOROP, - // D3DTOP_MODULATE); - //IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_COLORARG1, - // D3DTA_TEXTURE); - //IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_COLORARG2, - // D3DTA_DIFFUSE); - ///* Enable alpha modulation by diffuse alpha */ - //IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_ALPHAOP, - // D3DTOP_MODULATE); - //IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_ALPHAARG1, - // D3DTA_TEXTURE); - //IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_ALPHAARG2, - // D3DTA_DIFFUSE); - ///* Disable second texture stage, since we're done */ - //IDirect3DDevice9_SetTextureStageState(data->device, 1, D3DTSS_COLOROP, - // D3DTOP_DISABLE); - //IDirect3DDevice9_SetTextureStageState(data->device, 1, D3DTSS_ALPHAOP, - // D3DTOP_DISABLE); - - ///* Store the default render target */ - //IDirect3DDevice9_GetRenderTarget(data->device, 0, &data->defaultRenderTarget ); - //data->currentRenderTarget = NULL; - - ///* Set an identity world and view matrix */ - //matrix.m[0][0] = 1.0f; - //matrix.m[0][1] = 0.0f; - //matrix.m[0][2] = 0.0f; - //matrix.m[0][3] = 0.0f; - //matrix.m[1][0] = 0.0f; - //matrix.m[1][1] = 1.0f; - //matrix.m[1][2] = 0.0f; - //matrix.m[1][3] = 0.0f; - //matrix.m[2][0] = 0.0f; - //matrix.m[2][1] = 0.0f; - //matrix.m[2][2] = 1.0f; - //matrix.m[2][3] = 0.0f; - //matrix.m[3][0] = 0.0f; - //matrix.m[3][1] = 0.0f; - //matrix.m[3][2] = 0.0f; - //matrix.m[3][3] = 1.0f; - //IDirect3DDevice9_SetTransform(data->device, D3DTS_WORLD, &matrix); - //IDirect3DDevice9_SetTransform(data->device, D3DTS_VIEW, &matrix); + /* Initialize Direct3D resources */ + if (FAILED(D3D11_CreateDeviceResources(renderer))) { + D3D11_DestroyRenderer(renderer); + return NULL; + } + if (FAILED(D3D11_CreateWindowSizeDependentResources(renderer))) { + D3D11_DestroyRenderer(renderer); + return NULL; + } return renderer; } +static void +D3D11_DestroyRenderer(SDL_Renderer * renderer) +{ + D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata; + if (data) { + delete data; + data = NULL; + } +} + static bool D3D11_ReadFileContents(const wstring & fileName, vector & out) { diff --git a/src/video/windowsrt/SDL_winrtrenderer.cpp b/src/video/windowsrt/SDL_winrtrenderer.cpp index f734771af..dcc68fd8e 100644 --- a/src/video/windowsrt/SDL_winrtrenderer.cpp +++ b/src/video/windowsrt/SDL_winrtrenderer.cpp @@ -36,13 +36,6 @@ SDL_winrtrenderer::~SDL_winrtrenderer() } } -// Initialize the Direct3D resources required to run. -void SDL_winrtrenderer::Initialize() -{ - CreateDeviceResources(); - CreateWindowSizeDependentResources(); -} - // Recreate all device resources and set them back to the current state. void SDL_winrtrenderer::HandleDeviceLost() { diff --git a/src/video/windowsrt/SDL_winrtrenderer.h b/src/video/windowsrt/SDL_winrtrenderer.h index 9fde42517..3cab8270d 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 Initialize(); virtual void HandleDeviceLost(); virtual void CreateDeviceResources(); virtual void CreateWindowSizeDependentResources(); diff --git a/src/video/windowsrt/SDL_winrtvideo.cpp b/src/video/windowsrt/SDL_winrtvideo.cpp index 596bd9966..38c30415f 100644 --- a/src/video/windowsrt/SDL_winrtvideo.cpp +++ b/src/video/windowsrt/SDL_winrtvideo.cpp @@ -232,7 +232,7 @@ WINRT_CreateWindow(_THIS, SDL_Window * window) SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE); SDL_WinRTGlobalApp->m_renderer->m_sdlRenderer = renderer; SDL_WinRTGlobalApp->m_renderer->m_sdlRendererData = (D3D11_RenderData *) renderer->driverdata; - SDL_WinRTGlobalApp->m_renderer->Initialize(); + //SDL_WinRTGlobalApp->m_renderer->Initialize(); /* All done! */ return 0;