mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-29 10:20:36 +00:00
Rednukem: Fix MVE crash on Release gcc builds.
This commit is contained in:
parent
808d0591eb
commit
02d4712e57
1 changed files with 62 additions and 60 deletions
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue