mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-20 22:16:49 +01:00
WinRT: fixed bug whereby offscreen-rendered content could get improperly rotated
Attributes on the host device's rotation were getting applied to offscreen textures in an invalid manner. This was causing some apps to look different, depending on how the device was rotated.
This commit is contained in:
parent
72f703e395
commit
20a6c623c3
@ -1329,11 +1329,23 @@ D3D11_IsDisplayRotated90Degrees(DXGI_MODE_ROTATION rotation)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
D3D11_GetRotationForCurrentRenderTarget(SDL_Renderer * renderer)
|
||||||
|
{
|
||||||
|
D3D11_RenderData *data = (D3D11_RenderData *)renderer->driverdata;
|
||||||
|
if (data->currentOffscreenRenderTargetView) {
|
||||||
|
return DXGI_MODE_ROTATION_IDENTITY;
|
||||||
|
} else {
|
||||||
|
return data->rotation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
D3D11_GetViewportAlignedD3DRect(SDL_Renderer * renderer, const SDL_Rect * sdlRect, D3D11_RECT * outRect)
|
D3D11_GetViewportAlignedD3DRect(SDL_Renderer * renderer, const SDL_Rect * sdlRect, D3D11_RECT * outRect)
|
||||||
{
|
{
|
||||||
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
||||||
switch (data->rotation) {
|
const int rotation = D3D11_GetRotationForCurrentRenderTarget(renderer);
|
||||||
|
switch (rotation) {
|
||||||
case DXGI_MODE_ROTATION_IDENTITY:
|
case DXGI_MODE_ROTATION_IDENTITY:
|
||||||
outRect->left = sdlRect->x;
|
outRect->left = sdlRect->x;
|
||||||
outRect->right = sdlRect->x + sdlRect->w;
|
outRect->right = sdlRect->x + sdlRect->w;
|
||||||
@ -2151,6 +2163,7 @@ D3D11_UpdateViewport(SDL_Renderer * renderer)
|
|||||||
SDL_FRect orientationAlignedViewport;
|
SDL_FRect orientationAlignedViewport;
|
||||||
BOOL swapDimensions;
|
BOOL swapDimensions;
|
||||||
D3D11_VIEWPORT viewport;
|
D3D11_VIEWPORT viewport;
|
||||||
|
const int rotation = D3D11_GetRotationForCurrentRenderTarget(renderer);
|
||||||
|
|
||||||
if (renderer->viewport.w == 0 || renderer->viewport.h == 0) {
|
if (renderer->viewport.w == 0 || renderer->viewport.h == 0) {
|
||||||
/* If the viewport is empty, assume that it is because
|
/* If the viewport is empty, assume that it is because
|
||||||
@ -2166,7 +2179,7 @@ D3D11_UpdateViewport(SDL_Renderer * renderer)
|
|||||||
* default coordinate system) so rotations will be done in the opposite
|
* default coordinate system) so rotations will be done in the opposite
|
||||||
* direction of the DXGI_MODE_ROTATION enumeration.
|
* direction of the DXGI_MODE_ROTATION enumeration.
|
||||||
*/
|
*/
|
||||||
switch (data->rotation) {
|
switch (rotation) {
|
||||||
case DXGI_MODE_ROTATION_IDENTITY:
|
case DXGI_MODE_ROTATION_IDENTITY:
|
||||||
projection = MatrixIdentity();
|
projection = MatrixIdentity();
|
||||||
break;
|
break;
|
||||||
@ -2217,7 +2230,7 @@ D3D11_UpdateViewport(SDL_Renderer * renderer)
|
|||||||
* a landscape mode, for all Windows 8/RT devices, or a portrait mode,
|
* a landscape mode, for all Windows 8/RT devices, or a portrait mode,
|
||||||
* for Windows Phone devices.
|
* for Windows Phone devices.
|
||||||
*/
|
*/
|
||||||
swapDimensions = D3D11_IsDisplayRotated90Degrees(data->rotation);
|
swapDimensions = D3D11_IsDisplayRotated90Degrees(rotation);
|
||||||
if (swapDimensions) {
|
if (swapDimensions) {
|
||||||
orientationAlignedViewport.x = (float) renderer->viewport.y;
|
orientationAlignedViewport.x = (float) renderer->viewport.y;
|
||||||
orientationAlignedViewport.y = (float) renderer->viewport.x;
|
orientationAlignedViewport.y = (float) renderer->viewport.x;
|
||||||
|
Loading…
Reference in New Issue
Block a user