Fix VIC out of bounds copy (#3386)
* Fix VIC out of bounds copy * Update the assert
This commit is contained in:
parent
851f56b08a
commit
d987cacfb7
3 changed files with 46 additions and 10 deletions
|
@ -10,17 +10,22 @@ namespace Ryujinx.Graphics.Vic
|
|||
{
|
||||
static class Blender
|
||||
{
|
||||
public static void BlendOne(Surface dst, Surface src, ref SlotStruct slot)
|
||||
public static void BlendOne(Surface dst, Surface src, ref SlotStruct slot, Rectangle targetRect)
|
||||
{
|
||||
if (Sse41.IsSupported && (dst.Width & 3) == 0)
|
||||
int x1 = targetRect.X;
|
||||
int y1 = targetRect.Y;
|
||||
int x2 = Math.Min(src.Width, x1 + targetRect.Width);
|
||||
int y2 = Math.Min(src.Height, y1 + targetRect.Height);
|
||||
|
||||
if (Sse41.IsSupported && ((x1 | x2) & 3) == 0)
|
||||
{
|
||||
BlendOneSse41(dst, src, ref slot);
|
||||
BlendOneSse41(dst, src, ref slot, x1, y1, x2, y2);
|
||||
return;
|
||||
}
|
||||
|
||||
for (int y = 0; y < dst.Height; y++)
|
||||
for (int y = y1; y < y2; y++)
|
||||
{
|
||||
for (int x = 0; x < dst.Width; x++)
|
||||
for (int x = x1; x < x2; x++)
|
||||
{
|
||||
int inR = src.GetR(x, y);
|
||||
int inG = src.GetG(x, y);
|
||||
|
@ -40,9 +45,9 @@ namespace Ryujinx.Graphics.Vic
|
|||
}
|
||||
}
|
||||
|
||||
private unsafe static void BlendOneSse41(Surface dst, Surface src, ref SlotStruct slot)
|
||||
private unsafe static void BlendOneSse41(Surface dst, Surface src, ref SlotStruct slot, int x1, int y1, int x2, int y2)
|
||||
{
|
||||
Debug.Assert((dst.Width & 3) == 0);
|
||||
Debug.Assert(((x1 | x2) & 3) == 0);
|
||||
|
||||
ref MatrixStruct mtx = ref slot.ColorMatrixStruct;
|
||||
|
||||
|
@ -62,9 +67,9 @@ namespace Ryujinx.Graphics.Vic
|
|||
Pixel* ip = srcPtr;
|
||||
Pixel* op = dstPtr;
|
||||
|
||||
for (int y = 0; y < dst.Height; y++, ip += src.Width, op += dst.Width)
|
||||
for (int y = y1; y < y2; y++, ip += src.Width, op += dst.Width)
|
||||
{
|
||||
for (int x = 0; x < dst.Width; x += 4)
|
||||
for (int x = x1; x < x2; x += 4)
|
||||
{
|
||||
Vector128<int> pixel1 = Sse41.ConvertToVector128Int32((ushort*)(ip + (uint)x));
|
||||
Vector128<int> pixel2 = Sse41.ConvertToVector128Int32((ushort*)(ip + (uint)x + 1));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue