WinRT: made the Direct3D 11.1 renderer directly initialize more of itself, rather than deferring to code in the WinRT video driver

This commit is contained in:
David Ludwig 2013-02-09 15:22:49 -05:00
parent 9df73a8ba1
commit 587165bdd6
4 changed files with 27 additions and 157 deletions

View file

@ -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<char> & out)
{