WinRT: made SDL_RenderSetViewport work with the D3D 11.1 renderer

This commit is contained in:
David Ludwig 2013-02-17 11:09:07 -05:00
parent bafdb176fa
commit 19ff37c4b3

View file

@ -655,42 +655,18 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
{ {
case DisplayOrientations::Landscape: case DisplayOrientations::Landscape:
rotation = DXGI_MODE_ROTATION_IDENTITY; rotation = DXGI_MODE_ROTATION_IDENTITY;
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 0-degree Z-rotation
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break; break;
case DisplayOrientations::Portrait: case DisplayOrientations::Portrait:
rotation = DXGI_MODE_ROTATION_ROTATE270; rotation = DXGI_MODE_ROTATION_ROTATE270;
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 270-degree Z-rotation
0.0f, -1.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break; break;
case DisplayOrientations::LandscapeFlipped: case DisplayOrientations::LandscapeFlipped:
rotation = DXGI_MODE_ROTATION_ROTATE180; rotation = DXGI_MODE_ROTATION_ROTATE180;
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 180-degree Z-rotation
-1.0f, 0.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break; break;
case DisplayOrientations::PortraitFlipped: case DisplayOrientations::PortraitFlipped:
rotation = DXGI_MODE_ROTATION_ROTATE90; rotation = DXGI_MODE_ROTATION_ROTATE90;
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 90-degree Z-rotation
0.0f, 1.0f, 0.0f, 0.0f,
-1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break; break;
default: default:
@ -706,17 +682,6 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
} }
#endif #endif
//
// Update the view matrix
//
XMStoreFloat4x4(&data->vertexShaderConstantsData.view, // (4)
XMMatrixMultiply(
XMMatrixScaling(2.0f / windowWidth, 2.0f / windowHeight, 1.0f),
XMMatrixMultiply(
XMMatrixTranslation(-1, -1, 0),
XMMatrixRotationX(XM_PI)
)));
// Create a render target view of the swap chain back buffer. // Create a render target view of the swap chain back buffer.
ComPtr<ID3D11Texture2D> backBuffer; ComPtr<ID3D11Texture2D> backBuffer;
result = data->swapChain->GetBuffer( result = data->swapChain->GetBuffer(
@ -739,15 +704,10 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
return result; return result;
} }
// Set the rendering viewport to target the entire window. if (D3D11_UpdateViewport(renderer) != 0) {
CD3D11_VIEWPORT viewport( // D3D11_UpdateViewport will set the SDL error if it fails.
0.0f, return E_FAIL;
0.0f, }
data->renderTargetSize.x,
data->renderTargetSize.y
);
data->d3dContext->RSSetViewports(1, &viewport);
return S_OK; return S_OK;
} }
@ -949,6 +909,81 @@ D3D11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
static int static int
D3D11_UpdateViewport(SDL_Renderer * renderer) D3D11_UpdateViewport(SDL_Renderer * renderer)
{ {
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
if (renderer->viewport.w == 0 || renderer->viewport.h == 0) {
// If the viewport is empty, assume that it is because
// SDL_CreateRenderer is calling it, and will call it again later
// with a non-empty viewport.
return 0;
}
switch (data->orientation)
{
case DisplayOrientations::Landscape:
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 0-degree Z-rotation
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break;
case DisplayOrientations::Portrait:
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 270-degree Z-rotation
0.0f, -1.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break;
case DisplayOrientations::LandscapeFlipped:
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 180-degree Z-rotation
-1.0f, 0.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break;
case DisplayOrientations::PortraitFlipped:
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 90-degree Z-rotation
0.0f, 1.0f, 0.0f, 0.0f,
-1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
break;
default:
SDL_SetError("An unknown DisplayOrientation is being used");
return -1;
}
//
// Update the view matrix
//
float windowWidth = (float) renderer->viewport.w;
float windowHeight = (float) renderer->viewport.h;
XMStoreFloat4x4(&data->vertexShaderConstantsData.view, // (4)
XMMatrixMultiply(
XMMatrixScaling(2.0f / windowWidth, 2.0f / windowHeight, 1.0f),
XMMatrixMultiply(
XMMatrixTranslation(-1, -1, 0),
XMMatrixRotationX(XM_PI)
)));
D3D11_VIEWPORT viewport;
memset(&viewport, 0, sizeof(viewport));
viewport.TopLeftX = (float) renderer->viewport.x;
viewport.TopLeftY = (float) renderer->viewport.y;
viewport.Width = (float) renderer->viewport.w;
viewport.Height = (float) renderer->viewport.h;
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
data->d3dContext->RSSetViewports(1, &viewport);
return 0; return 0;
} }