mirror of
https://github.com/Ryujinx/SDL.git
synced 2025-03-23 21:55:12 +00:00
SDL_Renderer software, D3D11: don't use "renderer->viewport" in back-ends, but use the one from SETVIEWPORT cmd
This commit is contained in:
parent
a2b13e585c
commit
7828362da9
|
@ -700,7 +700,10 @@ D3D11_GetRotationForCurrentRenderTarget(SDL_Renderer * renderer)
|
||||||
static int
|
static int
|
||||||
D3D11_GetViewportAlignedD3DRect(SDL_Renderer * renderer, const SDL_Rect * sdlRect, D3D11_RECT * outRect, BOOL includeViewportOffset)
|
D3D11_GetViewportAlignedD3DRect(SDL_Renderer * renderer, const SDL_Rect * sdlRect, D3D11_RECT * outRect, BOOL includeViewportOffset)
|
||||||
{
|
{
|
||||||
|
D3D11_RenderData *data = (D3D11_RenderData *) renderer->driverdata;
|
||||||
const int rotation = D3D11_GetRotationForCurrentRenderTarget(renderer);
|
const int rotation = D3D11_GetRotationForCurrentRenderTarget(renderer);
|
||||||
|
const SDL_Rect *viewport = &data->currentViewport;
|
||||||
|
|
||||||
switch (rotation) {
|
switch (rotation) {
|
||||||
case DXGI_MODE_ROTATION_IDENTITY:
|
case DXGI_MODE_ROTATION_IDENTITY:
|
||||||
outRect->left = sdlRect->x;
|
outRect->left = sdlRect->x;
|
||||||
|
@ -708,27 +711,27 @@ D3D11_GetViewportAlignedD3DRect(SDL_Renderer * renderer, const SDL_Rect * sdlRec
|
||||||
outRect->top = sdlRect->y;
|
outRect->top = sdlRect->y;
|
||||||
outRect->bottom = sdlRect->y + sdlRect->h;
|
outRect->bottom = sdlRect->y + sdlRect->h;
|
||||||
if (includeViewportOffset) {
|
if (includeViewportOffset) {
|
||||||
outRect->left += renderer->viewport.x;
|
outRect->left += viewport->x;
|
||||||
outRect->right += renderer->viewport.x;
|
outRect->right += viewport->x;
|
||||||
outRect->top += renderer->viewport.y;
|
outRect->top += viewport->y;
|
||||||
outRect->bottom += renderer->viewport.y;
|
outRect->bottom += viewport->y;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DXGI_MODE_ROTATION_ROTATE270:
|
case DXGI_MODE_ROTATION_ROTATE270:
|
||||||
outRect->left = sdlRect->y;
|
outRect->left = sdlRect->y;
|
||||||
outRect->right = sdlRect->y + sdlRect->h;
|
outRect->right = sdlRect->y + sdlRect->h;
|
||||||
outRect->top = renderer->viewport.w - sdlRect->x - sdlRect->w;
|
outRect->top = viewport->w - sdlRect->x - sdlRect->w;
|
||||||
outRect->bottom = renderer->viewport.w - sdlRect->x;
|
outRect->bottom = viewport->w - sdlRect->x;
|
||||||
break;
|
break;
|
||||||
case DXGI_MODE_ROTATION_ROTATE180:
|
case DXGI_MODE_ROTATION_ROTATE180:
|
||||||
outRect->left = renderer->viewport.w - sdlRect->x - sdlRect->w;
|
outRect->left = viewport->w - sdlRect->x - sdlRect->w;
|
||||||
outRect->right = renderer->viewport.w - sdlRect->x;
|
outRect->right = viewport->w - sdlRect->x;
|
||||||
outRect->top = renderer->viewport.h - sdlRect->y - sdlRect->h;
|
outRect->top = viewport->h - sdlRect->y - sdlRect->h;
|
||||||
outRect->bottom = renderer->viewport.h - sdlRect->y;
|
outRect->bottom = viewport->h - sdlRect->y;
|
||||||
break;
|
break;
|
||||||
case DXGI_MODE_ROTATION_ROTATE90:
|
case DXGI_MODE_ROTATION_ROTATE90:
|
||||||
outRect->left = renderer->viewport.h - sdlRect->y - sdlRect->h;
|
outRect->left = viewport->h - sdlRect->y - sdlRect->h;
|
||||||
outRect->right = renderer->viewport.h - sdlRect->y;
|
outRect->right = viewport->h - sdlRect->y;
|
||||||
outRect->top = sdlRect->x;
|
outRect->top = sdlRect->x;
|
||||||
outRect->bottom = sdlRect->x + sdlRect->h;
|
outRect->bottom = sdlRect->x + sdlRect->h;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -214,18 +214,9 @@ SW_QueueDrawPoints(SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FP
|
||||||
|
|
||||||
cmd->data.draw.count = count;
|
cmd->data.draw.count = count;
|
||||||
|
|
||||||
if (renderer->viewport.x || renderer->viewport.y) {
|
for (i = 0; i < count; i++, verts++, points++) {
|
||||||
const int x = renderer->viewport.x;
|
verts->x = (int)points->x;
|
||||||
const int y = renderer->viewport.y;
|
verts->y = (int)points->y;
|
||||||
for (i = 0; i < count; i++, verts++, points++) {
|
|
||||||
verts->x = (int)(x + points->x);
|
|
||||||
verts->y = (int)(y + points->y);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < count; i++, verts++, points++) {
|
|
||||||
verts->x = (int)points->x;
|
|
||||||
verts->y = (int)points->y;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -243,23 +234,11 @@ SW_QueueFillRects(SDL_Renderer * renderer, SDL_RenderCommand *cmd, const SDL_FRe
|
||||||
|
|
||||||
cmd->data.draw.count = count;
|
cmd->data.draw.count = count;
|
||||||
|
|
||||||
if (renderer->viewport.x || renderer->viewport.y) {
|
for (i = 0; i < count; i++, verts++, rects++) {
|
||||||
const int x = renderer->viewport.x;
|
verts->x = (int)rects->x;
|
||||||
const int y = renderer->viewport.y;
|
verts->y = (int)rects->y;
|
||||||
|
verts->w = SDL_max((int)rects->w, 1);
|
||||||
for (i = 0; i < count; i++, verts++, rects++) {
|
verts->h = SDL_max((int)rects->h, 1);
|
||||||
verts->x = (int)(x + rects->x);
|
|
||||||
verts->y = (int)(y + rects->y);
|
|
||||||
verts->w = SDL_max((int)rects->w, 1);
|
|
||||||
verts->h = SDL_max((int)rects->h, 1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < count; i++, verts++, rects++) {
|
|
||||||
verts->x = (int)rects->x;
|
|
||||||
verts->y = (int)rects->y;
|
|
||||||
verts->w = SDL_max((int)rects->w, 1);
|
|
||||||
verts->h = SDL_max((int)rects->h, 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -280,13 +259,8 @@ SW_QueueCopy(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * text
|
||||||
SDL_memcpy(verts, srcrect, sizeof (SDL_Rect));
|
SDL_memcpy(verts, srcrect, sizeof (SDL_Rect));
|
||||||
verts++;
|
verts++;
|
||||||
|
|
||||||
if (renderer->viewport.x || renderer->viewport.y) {
|
verts->x = (int)dstrect->x;
|
||||||
verts->x = (int)(renderer->viewport.x + dstrect->x);
|
verts->y = (int)dstrect->y;
|
||||||
verts->y = (int)(renderer->viewport.y + dstrect->y);
|
|
||||||
} else {
|
|
||||||
verts->x = (int)dstrect->x;
|
|
||||||
verts->y = (int)dstrect->y;
|
|
||||||
}
|
|
||||||
verts->w = (int)dstrect->w;
|
verts->w = (int)dstrect->w;
|
||||||
verts->h = (int)dstrect->h;
|
verts->h = (int)dstrect->h;
|
||||||
|
|
||||||
|
@ -317,13 +291,8 @@ SW_QueueCopyEx(SDL_Renderer * renderer, SDL_RenderCommand *cmd, SDL_Texture * te
|
||||||
|
|
||||||
SDL_memcpy(&verts->srcrect, srcrect, sizeof (SDL_Rect));
|
SDL_memcpy(&verts->srcrect, srcrect, sizeof (SDL_Rect));
|
||||||
|
|
||||||
if (renderer->viewport.x || renderer->viewport.y) {
|
verts->dstrect.x = (int)dstrect->x;
|
||||||
verts->dstrect.x = (int)(renderer->viewport.x + dstrect->x);
|
verts->dstrect.y = (int)dstrect->y;
|
||||||
verts->dstrect.y = (int)(renderer->viewport.y + dstrect->y);
|
|
||||||
} else {
|
|
||||||
verts->dstrect.x = (int)dstrect->x;
|
|
||||||
verts->dstrect.y = (int)dstrect->y;
|
|
||||||
}
|
|
||||||
verts->dstrect.w = (int)dstrect->w;
|
verts->dstrect.w = (int)dstrect->w;
|
||||||
verts->dstrect.h = (int)dstrect->h;
|
verts->dstrect.h = (int)dstrect->h;
|
||||||
verts->angle = angle;
|
verts->angle = angle;
|
||||||
|
@ -618,8 +587,8 @@ SW_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *te
|
||||||
ptr->src.x = (int)(uv_[0] * texture->w);
|
ptr->src.x = (int)(uv_[0] * texture->w);
|
||||||
ptr->src.y = (int)(uv_[1] * texture->h);
|
ptr->src.y = (int)(uv_[1] * texture->h);
|
||||||
|
|
||||||
ptr->dst.x = (int)(xy_[0] * scale_x + renderer->viewport.x);
|
ptr->dst.x = (int)(xy_[0] * scale_x);
|
||||||
ptr->dst.y = (int)(xy_[1] * scale_y + renderer->viewport.y);
|
ptr->dst.y = (int)(xy_[1] * scale_y);
|
||||||
trianglepoint_2_fixedpoint(&ptr->dst);
|
trianglepoint_2_fixedpoint(&ptr->dst);
|
||||||
|
|
||||||
ptr->color = col_;
|
ptr->color = col_;
|
||||||
|
@ -646,8 +615,8 @@ SW_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *te
|
||||||
xy_ = (float *)((char*)xy + j * xy_stride);
|
xy_ = (float *)((char*)xy + j * xy_stride);
|
||||||
col_ = *(SDL_Color *)((char*)color + j * color_stride);
|
col_ = *(SDL_Color *)((char*)color + j * color_stride);
|
||||||
|
|
||||||
ptr->dst.x = (int)(xy_[0] * scale_x + renderer->viewport.x);
|
ptr->dst.x = (int)(xy_[0] * scale_x);
|
||||||
ptr->dst.y = (int)(xy_[1] * scale_y + renderer->viewport.y);
|
ptr->dst.y = (int)(xy_[1] * scale_y);
|
||||||
trianglepoint_2_fixedpoint(&ptr->dst);
|
trianglepoint_2_fixedpoint(&ptr->dst);
|
||||||
|
|
||||||
ptr->color = col_;
|
ptr->color = col_;
|
||||||
|
@ -755,9 +724,19 @@ SW_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertic
|
||||||
const Uint8 b = cmd->data.draw.b;
|
const Uint8 b = cmd->data.draw.b;
|
||||||
const Uint8 a = cmd->data.draw.a;
|
const Uint8 a = cmd->data.draw.a;
|
||||||
const int count = (int) cmd->data.draw.count;
|
const int count = (int) cmd->data.draw.count;
|
||||||
const SDL_Point *verts = (SDL_Point *) (((Uint8 *) vertices) + cmd->data.draw.first);
|
SDL_Point *verts = (SDL_Point *) (((Uint8 *) vertices) + cmd->data.draw.first);
|
||||||
const SDL_BlendMode blend = cmd->data.draw.blend;
|
const SDL_BlendMode blend = cmd->data.draw.blend;
|
||||||
SetDrawState(surface, &drawstate);
|
SetDrawState(surface, &drawstate);
|
||||||
|
|
||||||
|
/* Apply viewport */
|
||||||
|
if (drawstate.viewport->x || drawstate.viewport->y) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
verts[i].x += drawstate.viewport->x;
|
||||||
|
verts[i].y += drawstate.viewport->y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (blend == SDL_BLENDMODE_NONE) {
|
if (blend == SDL_BLENDMODE_NONE) {
|
||||||
SDL_DrawPoints(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
|
SDL_DrawPoints(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
|
||||||
} else {
|
} else {
|
||||||
|
@ -772,9 +751,19 @@ SW_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertic
|
||||||
const Uint8 b = cmd->data.draw.b;
|
const Uint8 b = cmd->data.draw.b;
|
||||||
const Uint8 a = cmd->data.draw.a;
|
const Uint8 a = cmd->data.draw.a;
|
||||||
const int count = (int) cmd->data.draw.count;
|
const int count = (int) cmd->data.draw.count;
|
||||||
const SDL_Point *verts = (SDL_Point *) (((Uint8 *) vertices) + cmd->data.draw.first);
|
SDL_Point *verts = (SDL_Point *) (((Uint8 *) vertices) + cmd->data.draw.first);
|
||||||
const SDL_BlendMode blend = cmd->data.draw.blend;
|
const SDL_BlendMode blend = cmd->data.draw.blend;
|
||||||
SetDrawState(surface, &drawstate);
|
SetDrawState(surface, &drawstate);
|
||||||
|
|
||||||
|
/* Apply viewport */
|
||||||
|
if (drawstate.viewport->x || drawstate.viewport->y) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
verts[i].x += drawstate.viewport->x;
|
||||||
|
verts[i].y += drawstate.viewport->y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (blend == SDL_BLENDMODE_NONE) {
|
if (blend == SDL_BLENDMODE_NONE) {
|
||||||
SDL_DrawLines(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
|
SDL_DrawLines(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
|
||||||
} else {
|
} else {
|
||||||
|
@ -789,9 +778,19 @@ SW_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertic
|
||||||
const Uint8 b = cmd->data.draw.b;
|
const Uint8 b = cmd->data.draw.b;
|
||||||
const Uint8 a = cmd->data.draw.a;
|
const Uint8 a = cmd->data.draw.a;
|
||||||
const int count = (int) cmd->data.draw.count;
|
const int count = (int) cmd->data.draw.count;
|
||||||
const SDL_Rect *verts = (SDL_Rect *) (((Uint8 *) vertices) + cmd->data.draw.first);
|
SDL_Rect *verts = (SDL_Rect *) (((Uint8 *) vertices) + cmd->data.draw.first);
|
||||||
const SDL_BlendMode blend = cmd->data.draw.blend;
|
const SDL_BlendMode blend = cmd->data.draw.blend;
|
||||||
SetDrawState(surface, &drawstate);
|
SetDrawState(surface, &drawstate);
|
||||||
|
|
||||||
|
/* Apply viewport */
|
||||||
|
if (drawstate.viewport->x || drawstate.viewport->y) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
verts[i].x += drawstate.viewport->x;
|
||||||
|
verts[i].y += drawstate.viewport->y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (blend == SDL_BLENDMODE_NONE) {
|
if (blend == SDL_BLENDMODE_NONE) {
|
||||||
SDL_FillRects(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
|
SDL_FillRects(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
|
||||||
} else {
|
} else {
|
||||||
|
@ -811,6 +810,12 @@ SW_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertic
|
||||||
|
|
||||||
PrepTextureForCopy(cmd);
|
PrepTextureForCopy(cmd);
|
||||||
|
|
||||||
|
/* Apply viewport */
|
||||||
|
if (drawstate.viewport->x || drawstate.viewport->y) {
|
||||||
|
dstrect->x += drawstate.viewport->x;
|
||||||
|
dstrect->y += drawstate.viewport->y;
|
||||||
|
}
|
||||||
|
|
||||||
if ( srcrect->w == dstrect->w && srcrect->h == dstrect->h ) {
|
if ( srcrect->w == dstrect->w && srcrect->h == dstrect->h ) {
|
||||||
SDL_BlitSurface(src, srcrect, surface, dstrect);
|
SDL_BlitSurface(src, srcrect, surface, dstrect);
|
||||||
} else {
|
} else {
|
||||||
|
@ -824,9 +829,16 @@ SW_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertic
|
||||||
}
|
}
|
||||||
|
|
||||||
case SDL_RENDERCMD_COPY_EX: {
|
case SDL_RENDERCMD_COPY_EX: {
|
||||||
const CopyExData *copydata = (CopyExData *) (((Uint8 *) vertices) + cmd->data.draw.first);
|
CopyExData *copydata = (CopyExData *) (((Uint8 *) vertices) + cmd->data.draw.first);
|
||||||
SetDrawState(surface, &drawstate);
|
SetDrawState(surface, &drawstate);
|
||||||
PrepTextureForCopy(cmd);
|
PrepTextureForCopy(cmd);
|
||||||
|
|
||||||
|
/* Apply viewport */
|
||||||
|
if (drawstate.viewport->x || drawstate.viewport->y) {
|
||||||
|
copydata->dstrect.x += drawstate.viewport->x;
|
||||||
|
copydata->dstrect.y += drawstate.viewport->y;
|
||||||
|
}
|
||||||
|
|
||||||
SW_RenderCopyEx(renderer, surface, cmd->data.draw.texture, ©data->srcrect,
|
SW_RenderCopyEx(renderer, surface, cmd->data.draw.texture, ©data->srcrect,
|
||||||
©data->dstrect, copydata->angle, ©data->center, copydata->flip);
|
©data->dstrect, copydata->angle, ©data->center, copydata->flip);
|
||||||
break;
|
break;
|
||||||
|
@ -847,6 +859,20 @@ SW_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertic
|
||||||
GeometryCopyData *ptr = (GeometryCopyData *) verts;
|
GeometryCopyData *ptr = (GeometryCopyData *) verts;
|
||||||
|
|
||||||
PrepTextureForCopy(cmd);
|
PrepTextureForCopy(cmd);
|
||||||
|
|
||||||
|
/* Apply viewport */
|
||||||
|
if (drawstate.viewport->x || drawstate.viewport->y) {
|
||||||
|
int i;
|
||||||
|
SDL_Point vp;
|
||||||
|
vp.x = drawstate.viewport->x;
|
||||||
|
vp.y = drawstate.viewport->y;
|
||||||
|
trianglepoint_2_fixedpoint(&vp);
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
ptr[i].dst.x += vp.x;
|
||||||
|
ptr[i].dst.y += vp.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < count; i += 3, ptr += 3) {
|
for (i = 0; i < count; i += 3, ptr += 3) {
|
||||||
SDL_SW_BlitTriangle(
|
SDL_SW_BlitTriangle(
|
||||||
src,
|
src,
|
||||||
|
@ -857,6 +883,20 @@ SW_RunCommandQueue(SDL_Renderer * renderer, SDL_RenderCommand *cmd, void *vertic
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GeometryFillData *ptr = (GeometryFillData *) verts;
|
GeometryFillData *ptr = (GeometryFillData *) verts;
|
||||||
|
|
||||||
|
/* Apply viewport */
|
||||||
|
if (drawstate.viewport->x || drawstate.viewport->y) {
|
||||||
|
int i;
|
||||||
|
SDL_Point vp;
|
||||||
|
vp.x = drawstate.viewport->x;
|
||||||
|
vp.y = drawstate.viewport->y;
|
||||||
|
trianglepoint_2_fixedpoint(&vp);
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
ptr[i].dst.x += vp.x;
|
||||||
|
ptr[i].dst.y += vp.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < count; i += 3, ptr += 3) {
|
for (i = 0; i < count; i += 3, ptr += 3) {
|
||||||
SDL_SW_FillTriangle(surface, &(ptr[0].dst), &(ptr[1].dst), &(ptr[2].dst), blend, ptr[0].color, ptr[1].color, ptr[2].color);
|
SDL_SW_FillTriangle(surface, &(ptr[0].dst), &(ptr[1].dst), &(ptr[2].dst), blend, ptr[0].color, ptr[1].color, ptr[2].color);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue