mirror of https://github.com/mgba-emu/mgba.git
GBA Video: Fix regressions from sprite cycle counting
This commit is contained in:
parent
95d77f76e2
commit
ee5c9c8a91
|
@ -12,6 +12,7 @@
|
||||||
if (!(renderer->row[outX] & FLAG_UNWRITTEN)) { \
|
if (!(renderer->row[outX] & FLAG_UNWRITTEN)) { \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
|
renderer->spriteCyclesRemaining -= 1; \
|
||||||
SPRITE_XBASE_ ## DEPTH(inX); \
|
SPRITE_XBASE_ ## DEPTH(inX); \
|
||||||
SPRITE_DRAW_PIXEL_ ## DEPTH ## _ ## TYPE(inX); \
|
SPRITE_DRAW_PIXEL_ ## DEPTH ## _ ## TYPE(inX); \
|
||||||
}
|
}
|
||||||
|
@ -44,10 +45,11 @@
|
||||||
unsigned tileData; \
|
unsigned tileData; \
|
||||||
unsigned widthMask = ~(width - 1); \
|
unsigned widthMask = ~(width - 1); \
|
||||||
unsigned heightMask = ~(height - 1); \
|
unsigned heightMask = ~(height - 1); \
|
||||||
for (; outX < x + totalWidth && outX < end; ++outX, ++inX) { \
|
for (; outX < condition; ++outX, ++inX) { \
|
||||||
if (!(renderer->row[outX] & FLAG_UNWRITTEN)) { \
|
if (!(renderer->row[outX] & FLAG_UNWRITTEN)) { \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
|
renderer->spriteCyclesRemaining -= 2; \
|
||||||
xAccum += mat.a; \
|
xAccum += mat.a; \
|
||||||
yAccum += mat.c; \
|
yAccum += mat.c; \
|
||||||
int localX = (xAccum >> 8) + (width >> 1); \
|
int localX = (xAccum >> 8) + (width >> 1); \
|
||||||
|
@ -147,6 +149,10 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
|
||||||
if (GBARegisterDISPCNTGetMode(renderer->dispcnt) >= 3 && GBAObjAttributesCGetTile(sprite->c) < 512) {
|
if (GBARegisterDISPCNTGetMode(renderer->dispcnt) >= 3 && GBAObjAttributesCGetTile(sprite->c) < 512) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (renderer->spriteCyclesRemaining <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int variant = renderer->target1Obj &&
|
int variant = renderer->target1Obj &&
|
||||||
GBAWindowControlIsBlendEnable(renderer->currentWindow.packed) &&
|
GBAWindowControlIsBlendEnable(renderer->currentWindow.packed) &&
|
||||||
(renderer->blendEffect == BLEND_BRIGHTEN || renderer->blendEffect == BLEND_DARKEN);
|
(renderer->blendEffect == BLEND_BRIGHTEN || renderer->blendEffect == BLEND_DARKEN);
|
||||||
|
@ -178,10 +184,7 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
|
||||||
if (GBAObjAttributesAIsTransformed(sprite->a)) {
|
if (GBAObjAttributesAIsTransformed(sprite->a)) {
|
||||||
int totalWidth = width << GBAObjAttributesAGetDoubleSize(sprite->a);
|
int totalWidth = width << GBAObjAttributesAGetDoubleSize(sprite->a);
|
||||||
int totalHeight = height << GBAObjAttributesAGetDoubleSize(sprite->a);
|
int totalHeight = height << GBAObjAttributesAGetDoubleSize(sprite->a);
|
||||||
renderer->spriteCyclesRemaining -= 10 + totalWidth * 2;
|
renderer->spriteCyclesRemaining -= 10;
|
||||||
if (renderer->spriteCyclesRemaining <= 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
struct GBAOAMMatrix mat;
|
struct GBAOAMMatrix mat;
|
||||||
LOAD_16(mat.a, 0, &renderer->d.oam->mat[GBAObjAttributesBGetMatIndex(sprite->b)].a);
|
LOAD_16(mat.a, 0, &renderer->d.oam->mat[GBAObjAttributesBGetMatIndex(sprite->b)].a);
|
||||||
LOAD_16(mat.b, 0, &renderer->d.oam->mat[GBAObjAttributesBGetMatIndex(sprite->b)].b);
|
LOAD_16(mat.b, 0, &renderer->d.oam->mat[GBAObjAttributesBGetMatIndex(sprite->b)].b);
|
||||||
|
@ -192,10 +195,15 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
|
||||||
inY += 256;
|
inY += 256;
|
||||||
}
|
}
|
||||||
int outX = x >= start ? x : start;
|
int outX = x >= start ? x : start;
|
||||||
|
int condition = x + totalWidth;
|
||||||
int inX = outX - x;
|
int inX = outX - x;
|
||||||
int xAccum = mat.a * (inX - 1 - (totalWidth >> 1)) + mat.b * (inY - (totalHeight >> 1));
|
int xAccum = mat.a * (inX - 1 - (totalWidth >> 1)) + mat.b * (inY - (totalHeight >> 1));
|
||||||
int yAccum = mat.c * (inX - 1 - (totalWidth >> 1)) + mat.d * (inY - (totalHeight >> 1));
|
int yAccum = mat.c * (inX - 1 - (totalWidth >> 1)) + mat.d * (inY - (totalHeight >> 1));
|
||||||
|
|
||||||
|
if (end < condition) {
|
||||||
|
condition = end;
|
||||||
|
}
|
||||||
|
|
||||||
if (!GBAObjAttributesAIs256Color(sprite->a)) {
|
if (!GBAObjAttributesAIs256Color(sprite->a)) {
|
||||||
palette = &palette[GBAObjAttributesCGetPalette(sprite->c) << 4];
|
palette = &palette[GBAObjAttributesCGetPalette(sprite->c) << 4];
|
||||||
if (flags & FLAG_OBJWIN) {
|
if (flags & FLAG_OBJWIN) {
|
||||||
|
@ -215,11 +223,10 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
|
||||||
SPRITE_TRANSFORMED_LOOP(256, NORMAL);
|
SPRITE_TRANSFORMED_LOOP(256, NORMAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
if (x + totalWidth > VIDEO_HORIZONTAL_PIXELS) {
|
||||||
renderer->spriteCyclesRemaining -= width;
|
renderer->spriteCyclesRemaining -= (x + totalWidth - VIDEO_HORIZONTAL_PIXELS) * 2;
|
||||||
if (renderer->spriteCyclesRemaining <= 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
int outX = x >= start ? x : start;
|
int outX = x >= start ? x : start;
|
||||||
int condition = x + width;
|
int condition = x + width;
|
||||||
int mosaicH = 1;
|
int mosaicH = 1;
|
||||||
|
@ -277,6 +284,9 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re
|
||||||
SPRITE_NORMAL_LOOP(256, NORMAL);
|
SPRITE_NORMAL_LOOP(256, NORMAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (x + width > VIDEO_HORIZONTAL_PIXELS) {
|
||||||
|
renderer->spriteCyclesRemaining -= x + width - VIDEO_HORIZONTAL_PIXELS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue