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:
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue