Rednukem: Fix MVE crash on Release gcc builds.

This commit is contained in:
sirlemonhead 2020-03-11 19:41:10 +00:00 committed by Christoph Oelckers
parent 808d0591eb
commit 02d4712e57

View file

@ -133,21 +133,21 @@ private:
uint8_t* GetPreviousFrame(); uint8_t* GetPreviousFrame();
void SwapFrames(); void SwapFrames();
void CopyBlock(uint8_t* pDest, uint8_t* pSrc); void CopyBlock(uint8_t* pDest, uint8_t* pSrc);
void DecodeBlock0(uint32_t offset); void DecodeBlock0(int32_t offset);
void DecodeBlock1(uint32_t offset); void DecodeBlock1(int32_t offset);
void DecodeBlock2(uint32_t offset); void DecodeBlock2(int32_t offset);
void DecodeBlock3(uint32_t offset); void DecodeBlock3(int32_t offset);
void DecodeBlock4(uint32_t offset); void DecodeBlock4(int32_t offset);
void DecodeBlock5(uint32_t offset); void DecodeBlock5(int32_t offset);
void DecodeBlock7(uint32_t offset); void DecodeBlock7(int32_t offset);
void DecodeBlock8(uint32_t offset); void DecodeBlock8(int32_t offset);
void DecodeBlock9(uint32_t offset); void DecodeBlock9(int32_t offset);
void DecodeBlock10(uint32_t offset); void DecodeBlock10(int32_t offset);
void DecodeBlock11(uint32_t offset); void DecodeBlock11(int32_t offset);
void DecodeBlock12(uint32_t offset); void DecodeBlock12(int32_t offset);
void DecodeBlock13(uint32_t offset); void DecodeBlock13(int32_t offset);
void DecodeBlock14(uint32_t offset); void DecodeBlock14(int32_t offset);
void DecodeBlock15(uint32_t offset); void DecodeBlock15(int32_t offset);
RedNukem::FileStream file; RedNukem::FileStream file;
@ -160,7 +160,7 @@ private:
uint8_t* pVideoBuffers[2]; uint8_t* pVideoBuffers[2];
uint32_t nCurrentVideoBuffer, nPreviousVideoBuffer; uint32_t nCurrentVideoBuffer, nPreviousVideoBuffer;
uint32_t videoStride; int32_t videoStride;
DecodeMap decodeMap; DecodeMap decodeMap;
@ -217,6 +217,8 @@ InterplayDecoder::InterplayDecoder()
nFps = 0.0; nFps = 0.0;
nFrameDuration = 0; nFrameDuration = 0;
nTimerRate = 0;
nTimerDiv = 0;
audio.nChannels = 0; audio.nChannels = 0;
audio.nSampleRate = 0; audio.nSampleRate = 0;
@ -644,11 +646,11 @@ bool InterplayDecoder::Run()
{ {
int i = 0; int i = 0;
for (int y = 0; y < nHeight; y += 8) for (uint32_t y = 0; y < nHeight; y += 8)
{ {
for (int x = 0; x < nWidth; x += 8) for (uint32_t x = 0; x < nWidth; x += 8)
{ {
int opcode; uint32_t opcode;
// alternate between getting low and high 4 bits // alternate between getting low and high 4 bits
if (i & 1) { if (i & 1) {
@ -659,7 +661,7 @@ bool InterplayDecoder::Run()
} }
i++; i++;
uint32_t offset = x + (y * videoStride); int32_t offset = x + (y * videoStride);
switch (opcode) switch (opcode)
{ {
@ -746,26 +748,26 @@ void InterplayDecoder::CopyBlock(uint8_t* pDest, uint8_t* pSrc)
for (int y = 0; y < 8; y++) for (int y = 0; y < 8; y++)
{ {
memcpy(pDest, pSrc, 8); memcpy(pDest, pSrc, 8);
pSrc += videoStride; pSrc += (intptr_t)videoStride;
pDest += videoStride; pDest += (intptr_t)videoStride;
} }
} }
void InterplayDecoder::DecodeBlock0(uint32_t offset) void InterplayDecoder::DecodeBlock0(int32_t offset)
{ {
// copy from the same offset but from the previous frame // copy from the same offset but from the previous frame
uint8_t* pDest = GetCurrentFrame() + offset; uint8_t* pDest = GetCurrentFrame() + (intptr_t)offset;
uint8_t* pSrc = GetPreviousFrame() + offset; uint8_t* pSrc = GetPreviousFrame() + (intptr_t)offset;
CopyBlock(pDest, pSrc); CopyBlock(pDest, pSrc);
} }
void InterplayDecoder::DecodeBlock1(uint32_t offset) void InterplayDecoder::DecodeBlock1(int32_t offset)
{ {
// nothing to do for this. // nothing to do for this.
} }
void InterplayDecoder::DecodeBlock2(uint32_t offset) void InterplayDecoder::DecodeBlock2(int32_t offset)
{ {
// copy block from 2 frames ago using a motion vector; need 1 more byte // copy block from 2 frames ago using a motion vector; need 1 more byte
uint8_t B = file.ReadByte(); uint8_t B = file.ReadByte();
@ -781,13 +783,13 @@ void InterplayDecoder::DecodeBlock2(uint32_t offset)
y = 8 + ((B - 56) / 29); y = 8 + ((B - 56) / 29);
} }
uint8_t* pDest = GetCurrentFrame() + offset; uint8_t* pDest = GetCurrentFrame() + (intptr_t)offset;
uint8_t* pSrc = GetCurrentFrame() + (intptr_t)(offset + x + (y * videoStride)); uint8_t* pSrc = GetCurrentFrame() + (intptr_t)(int64_t)offset + (int64_t)x + (int64_t(y) * (int64_t)videoStride);
CopyBlock(pDest, pSrc); CopyBlock(pDest, pSrc);
} }
void InterplayDecoder::DecodeBlock3(uint32_t offset) void InterplayDecoder::DecodeBlock3(int32_t offset)
{ {
// copy 8x8 block from current frame from an up/left block // copy 8x8 block from current frame from an up/left block
uint8_t B = file.ReadByte(); uint8_t B = file.ReadByte();
@ -804,13 +806,13 @@ void InterplayDecoder::DecodeBlock3(uint32_t offset)
y = -(8 + ((B - 56) / 29)); y = -(8 + ((B - 56) / 29));
} }
uint8_t* pDest = GetCurrentFrame() + offset; uint8_t* pDest = GetCurrentFrame() + (intptr_t)offset;
uint8_t* pSrc = GetCurrentFrame() + (intptr_t)(offset + x + (y * videoStride)); uint8_t* pSrc = GetCurrentFrame() + (intptr_t)(int64_t)offset + (int64_t)x + (int64_t(y) * (int64_t)videoStride);
CopyBlock(pDest, pSrc); CopyBlock(pDest, pSrc);
} }
void InterplayDecoder::DecodeBlock4(uint32_t offset) void InterplayDecoder::DecodeBlock4(int32_t offset)
{ {
// copy a block from the previous frame; need 1 more byte // copy a block from the previous frame; need 1 more byte
int x, y; int x, y;
@ -823,30 +825,30 @@ void InterplayDecoder::DecodeBlock4(uint32_t offset)
x = -8 + BL; x = -8 + BL;
y = -8 + BH; y = -8 + BH;
uint8_t* pDest = GetCurrentFrame() + offset; uint8_t* pDest = GetCurrentFrame() + (intptr_t)offset;
uint8_t* pSrc = GetPreviousFrame() + (intptr_t)(offset + x + (y * videoStride)); uint8_t* pSrc = GetPreviousFrame() + (intptr_t)(int64_t)offset + (int64_t)x + (int64_t(y) * (int64_t)videoStride);
CopyBlock(pDest, pSrc); CopyBlock(pDest, pSrc);
} }
void InterplayDecoder::DecodeBlock5(uint32_t offset) void InterplayDecoder::DecodeBlock5(int32_t offset)
{ {
// copy a block from the previous frame using an expanded range; need 2 more bytes // copy a block from the previous frame using an expanded range; need 2 more bytes
int8_t x = file.ReadByte(); int8_t x = file.ReadByte();
int8_t y = file.ReadByte(); int8_t y = file.ReadByte();
uint8_t* pDest = GetCurrentFrame() + offset; uint8_t* pDest = GetCurrentFrame() + (intptr_t)offset;
uint8_t* pSrc = GetPreviousFrame() + (intptr_t)(offset + x + (y * videoStride)); uint8_t* pSrc = GetPreviousFrame() + (intptr_t)(int64_t)offset + (int64_t)x + (int64_t(y) * (int64_t)videoStride);
CopyBlock(pDest, pSrc); CopyBlock(pDest, pSrc);
} }
// Block6 is unknown and skipped // Block6 is unknown and skipped
void InterplayDecoder::DecodeBlock7(uint32_t offset) void InterplayDecoder::DecodeBlock7(int32_t offset)
{ {
uint8_t* pBuffer = GetCurrentFrame() + offset; uint8_t* pBuffer = GetCurrentFrame() + (intptr_t)offset;
uint32_t flags; uint32_t flags = 0;
uint8_t P[2]; uint8_t P[2];
P[0] = file.ReadByte(); P[0] = file.ReadByte();
@ -884,10 +886,10 @@ void InterplayDecoder::DecodeBlock7(uint32_t offset)
} }
} }
void InterplayDecoder::DecodeBlock8(uint32_t offset) void InterplayDecoder::DecodeBlock8(int32_t offset)
{ {
uint8_t* pBuffer = GetCurrentFrame() + offset; uint8_t* pBuffer = GetCurrentFrame() + (intptr_t)offset;
uint32_t flags; uint32_t flags = 0;
uint8_t P[4]; uint8_t P[4];
// 2-color encoding for each 4x4 quadrant, or 2-color encoding on either top and bottom or left and right halves // 2-color encoding for each 4x4 quadrant, or 2-color encoding on either top and bottom or left and right halves
@ -963,9 +965,9 @@ void InterplayDecoder::DecodeBlock8(uint32_t offset)
} }
} }
void InterplayDecoder::DecodeBlock9(uint32_t offset) void InterplayDecoder::DecodeBlock9(int32_t offset)
{ {
uint8_t* pBuffer = GetCurrentFrame() + offset; uint8_t* pBuffer = GetCurrentFrame() + (intptr_t)offset;
uint8_t P[4]; uint8_t P[4];
file.ReadBytes(P, 4); file.ReadBytes(P, 4);
@ -1039,9 +1041,9 @@ void InterplayDecoder::DecodeBlock9(uint32_t offset)
} }
} }
void InterplayDecoder::DecodeBlock10(uint32_t offset) void InterplayDecoder::DecodeBlock10(int32_t offset)
{ {
uint8_t* pBuffer = GetCurrentFrame() + offset; uint8_t* pBuffer = GetCurrentFrame() + (intptr_t)offset;
uint8_t P[8]; uint8_t P[8];
file.ReadBytes(P, 4); file.ReadBytes(P, 4);
@ -1101,22 +1103,22 @@ void InterplayDecoder::DecodeBlock10(uint32_t offset)
} }
} }
void InterplayDecoder::DecodeBlock11(uint32_t offset) void InterplayDecoder::DecodeBlock11(int32_t offset)
{ {
// 64-color encoding (each pixel in block is a different color) // 64-color encoding (each pixel in block is a different color)
uint8_t* pBuffer = GetCurrentFrame() + offset; uint8_t* pBuffer = GetCurrentFrame() + (intptr_t)offset;
for (int y = 0; y < 8; y++) for (int y = 0; y < 8; y++)
{ {
assert(file.ReadBytes(pBuffer, 8) == 8); file.ReadBytes(pBuffer, 8);
pBuffer += videoStride; pBuffer += videoStride;
} }
} }
void InterplayDecoder::DecodeBlock12(uint32_t offset) void InterplayDecoder::DecodeBlock12(int32_t offset)
{ {
// 16-color block encoding: each 2x2 block is a different color // 16-color block encoding: each 2x2 block is a different color
uint8_t* pBuffer = GetCurrentFrame() + offset; uint8_t* pBuffer = GetCurrentFrame() + (intptr_t)offset;
for (int y = 0; y < 8; y += 2) for (int y = 0; y < 8; y += 2)
{ {
@ -1131,10 +1133,10 @@ void InterplayDecoder::DecodeBlock12(uint32_t offset)
} }
} }
void InterplayDecoder::DecodeBlock13(uint32_t offset) void InterplayDecoder::DecodeBlock13(int32_t offset)
{ {
// 4-color block encoding: each 4x4 block is a different color // 4-color block encoding: each 4x4 block is a different color
uint8_t* pBuffer = GetCurrentFrame() + offset; uint8_t* pBuffer = GetCurrentFrame() + (intptr_t)offset;
uint8_t P[2]; uint8_t P[2];
for (int y = 0; y < 8; y++) for (int y = 0; y < 8; y++)
@ -1145,16 +1147,16 @@ void InterplayDecoder::DecodeBlock13(uint32_t offset)
P[1] = file.ReadByte(); P[1] = file.ReadByte();
} }
memset(pBuffer, P[0], 4); memset(pBuffer, P[0], 4);
memset(pBuffer + 4, P[1], 4); memset(pBuffer + 4, P[1], 4);
pBuffer += videoStride; pBuffer += videoStride;
} }
} }
void InterplayDecoder::DecodeBlock14(uint32_t offset) void InterplayDecoder::DecodeBlock14(int32_t offset)
{ {
// 1-color encoding : the whole block is 1 solid color // 1-color encoding : the whole block is 1 solid color
uint8_t* pBuffer = GetCurrentFrame() + offset; uint8_t* pBuffer = GetCurrentFrame() + (intptr_t)offset;
uint8_t pix = file.ReadByte(); uint8_t pix = file.ReadByte();
for (int y = 0; y < 8; y++) for (int y = 0; y < 8; y++)
@ -1164,10 +1166,10 @@ void InterplayDecoder::DecodeBlock14(uint32_t offset)
} }
} }
void InterplayDecoder::DecodeBlock15(uint32_t offset) void InterplayDecoder::DecodeBlock15(int32_t offset)
{ {
// dithered encoding // dithered encoding
uint8_t* pBuffer = GetCurrentFrame() + offset; uint8_t* pBuffer = GetCurrentFrame() + (intptr_t)offset;
uint8_t P[2]; uint8_t P[2];
P[0] = file.ReadByte(); P[0] = file.ReadByte();