WinRT: made SDL_RenderSetViewport work with the D3D 11.1 renderer
This commit is contained in:
parent
bafdb176fa
commit
19ff37c4b3
1 changed files with 79 additions and 44 deletions
|
@ -655,42 +655,18 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
|
|||
{
|
||||
case DisplayOrientations::Landscape:
|
||||
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;
|
||||
|
||||
case DisplayOrientations::Portrait:
|
||||
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;
|
||||
|
||||
case DisplayOrientations::LandscapeFlipped:
|
||||
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;
|
||||
|
||||
case DisplayOrientations::PortraitFlipped:
|
||||
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;
|
||||
|
||||
default:
|
||||
|
@ -706,17 +682,6 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
|
|||
}
|
||||
#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.
|
||||
ComPtr<ID3D11Texture2D> backBuffer;
|
||||
result = data->swapChain->GetBuffer(
|
||||
|
@ -739,15 +704,10 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
|
|||
return result;
|
||||
}
|
||||
|
||||
// Set the rendering viewport to target the entire window.
|
||||
CD3D11_VIEWPORT viewport(
|
||||
0.0f,
|
||||
0.0f,
|
||||
data->renderTargetSize.x,
|
||||
data->renderTargetSize.y
|
||||
);
|
||||
|
||||
data->d3dContext->RSSetViewports(1, &viewport);
|
||||
if (D3D11_UpdateViewport(renderer) != 0) {
|
||||
// D3D11_UpdateViewport will set the SDL error if it fails.
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -949,6 +909,81 @@ D3D11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
|
|||
static int
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue