WinRT: made sure the device orientation transform gets applied (by the D3D 11.1 renderer) when drawing
This commit is contained in:
parent
46530ef818
commit
8b75a125cc
3 changed files with 59 additions and 9 deletions
|
@ -339,6 +339,20 @@ D3D11_CreateDeviceResources(SDL_Renderer * renderer)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Setup space to hold vertex shader constants:
|
||||||
|
//
|
||||||
|
CD3D11_BUFFER_DESC constantBufferDesc(sizeof(SDL_VertexShaderConstants), D3D11_BIND_CONSTANT_BUFFER);
|
||||||
|
result = data->d3dDevice->CreateBuffer(
|
||||||
|
&constantBufferDesc,
|
||||||
|
nullptr,
|
||||||
|
&data->vertexShaderConstants
|
||||||
|
);
|
||||||
|
if (FAILED(result)) {
|
||||||
|
WIN_SetErrorFromHRESULT(__FUNCTION__, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create a vertex buffer:
|
// Create a vertex buffer:
|
||||||
//
|
//
|
||||||
|
@ -553,7 +567,7 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
|
||||||
{
|
{
|
||||||
case DisplayOrientations::Landscape:
|
case DisplayOrientations::Landscape:
|
||||||
rotation = DXGI_MODE_ROTATION_IDENTITY;
|
rotation = DXGI_MODE_ROTATION_IDENTITY;
|
||||||
data->orientationTransform3D = XMFLOAT4X4( // 0-degree Z-rotation
|
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 0-degree Z-rotation
|
||||||
1.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, 1.0f, 0.0f, 0.0f,
|
||||||
0.0f, 0.0f, 1.0f, 0.0f,
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
@ -563,9 +577,9 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
|
||||||
|
|
||||||
case DisplayOrientations::Portrait:
|
case DisplayOrientations::Portrait:
|
||||||
rotation = DXGI_MODE_ROTATION_ROTATE270;
|
rotation = DXGI_MODE_ROTATION_ROTATE270;
|
||||||
data->orientationTransform3D = XMFLOAT4X4( // 90-degree Z-rotation
|
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 270-degree Z-rotation
|
||||||
0.0f, 1.0f, 0.0f, 0.0f,
|
0.0f, -1.0f, 0.0f, 0.0f,
|
||||||
-1.0f, 0.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, 1.0f, 0.0f,
|
||||||
0.0f, 0.0f, 0.0f, 1.0f
|
0.0f, 0.0f, 0.0f, 1.0f
|
||||||
);
|
);
|
||||||
|
@ -573,7 +587,7 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
|
||||||
|
|
||||||
case DisplayOrientations::LandscapeFlipped:
|
case DisplayOrientations::LandscapeFlipped:
|
||||||
rotation = DXGI_MODE_ROTATION_ROTATE180;
|
rotation = DXGI_MODE_ROTATION_ROTATE180;
|
||||||
data->orientationTransform3D = XMFLOAT4X4( // 180-degree Z-rotation
|
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 180-degree Z-rotation
|
||||||
-1.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, -1.0f, 0.0f, 0.0f,
|
||||||
0.0f, 0.0f, 1.0f, 0.0f,
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
@ -583,9 +597,9 @@ D3D11_CreateWindowSizeDependentResources(SDL_Renderer * renderer)
|
||||||
|
|
||||||
case DisplayOrientations::PortraitFlipped:
|
case DisplayOrientations::PortraitFlipped:
|
||||||
rotation = DXGI_MODE_ROTATION_ROTATE90;
|
rotation = DXGI_MODE_ROTATION_ROTATE90;
|
||||||
data->orientationTransform3D = XMFLOAT4X4( // 270-degree Z-rotation
|
data->vertexShaderConstantsData.projection = XMFLOAT4X4( // 90-degree Z-rotation
|
||||||
0.0f, -1.0f, 0.0f, 0.0f,
|
0.0f, 1.0f, 0.0f, 0.0f,
|
||||||
1.0f, 0.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, 1.0f, 0.0f,
|
||||||
0.0f, 0.0f, 0.0f, 1.0f
|
0.0f, 0.0f, 0.0f, 1.0f
|
||||||
);
|
);
|
||||||
|
@ -891,6 +905,15 @@ static int D3D11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||||
nullptr
|
nullptr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
rendererData->d3dContext->UpdateSubresource(
|
||||||
|
rendererData->vertexShaderConstants.Get(),
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
&rendererData->vertexShaderConstantsData,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
UINT stride = sizeof(VertexPositionColor);
|
UINT stride = sizeof(VertexPositionColor);
|
||||||
UINT offset = 0;
|
UINT offset = 0;
|
||||||
rendererData->d3dContext->IASetVertexBuffers(
|
rendererData->d3dContext->IASetVertexBuffers(
|
||||||
|
@ -911,6 +934,12 @@ static int D3D11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
|
|
||||||
|
rendererData->d3dContext->VSSetConstantBuffers(
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
rendererData->vertexShaderConstants.GetAddressOf()
|
||||||
|
);
|
||||||
|
|
||||||
rendererData->d3dContext->PSSetShader(
|
rendererData->d3dContext->PSSetShader(
|
||||||
rendererData->pixelShader.Get(),
|
rendererData->pixelShader.Get(),
|
||||||
nullptr,
|
nullptr,
|
||||||
|
|
|
@ -24,6 +24,11 @@
|
||||||
#include <DirectXMath.h>
|
#include <DirectXMath.h>
|
||||||
#include <wrl/client.h>
|
#include <wrl/client.h>
|
||||||
|
|
||||||
|
struct SDL_VertexShaderConstants
|
||||||
|
{
|
||||||
|
DirectX::XMFLOAT4X4 projection;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
Microsoft::WRL::ComPtr<ID3D11Device1> d3dDevice;
|
Microsoft::WRL::ComPtr<ID3D11Device1> d3dDevice;
|
||||||
|
@ -39,6 +44,10 @@ typedef struct
|
||||||
unsigned int vertexCount;
|
unsigned int vertexCount;
|
||||||
bool loadingComplete;
|
bool loadingComplete;
|
||||||
|
|
||||||
|
// Vertex buffer constants:
|
||||||
|
SDL_VertexShaderConstants vertexShaderConstantsData;
|
||||||
|
Microsoft::WRL::ComPtr<ID3D11Buffer> vertexShaderConstants;
|
||||||
|
|
||||||
// Cached renderer properties.
|
// Cached renderer properties.
|
||||||
DirectX::XMFLOAT2 windowSizeInDIPs;
|
DirectX::XMFLOAT2 windowSizeInDIPs;
|
||||||
DirectX::XMFLOAT2 renderTargetSize;
|
DirectX::XMFLOAT2 renderTargetSize;
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
|
|
||||||
//#pragma pack_matrix( row_major )
|
//#pragma pack_matrix( row_major )
|
||||||
|
|
||||||
|
cbuffer SDL_VertexShaderConstants : register(b0)
|
||||||
|
{
|
||||||
|
matrix projection;
|
||||||
|
};
|
||||||
|
|
||||||
struct VertexShaderInput
|
struct VertexShaderInput
|
||||||
{
|
{
|
||||||
float3 pos : POSITION;
|
float3 pos : POSITION;
|
||||||
|
@ -16,7 +21,14 @@ struct VertexShaderOutput
|
||||||
VertexShaderOutput main(VertexShaderInput input)
|
VertexShaderOutput main(VertexShaderInput input)
|
||||||
{
|
{
|
||||||
VertexShaderOutput output;
|
VertexShaderOutput output;
|
||||||
output.pos = float4(input.pos, 1.0f);
|
float4 pos = float4(input.pos, 1.0f);
|
||||||
|
|
||||||
|
// Transform the vertex position into projected space.
|
||||||
|
pos = mul(pos, projection);
|
||||||
|
output.pos = pos;
|
||||||
|
|
||||||
|
// Pass through the texture's color without modification.
|
||||||
output.tex = input.tex;
|
output.tex = input.tex;
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue