1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Refactor CRC code: move CRC32 algorithm into separate file to avoid multiple copy of the same code

This commit is contained in:
Sergey Lipskiy 2016-10-11 17:21:46 +07:00
parent 0f9107ad2e
commit 9f8e07e571
10 changed files with 105 additions and 104 deletions

View File

@ -275,6 +275,7 @@
<ClCompile Include="..\..\src\Config.cpp" />
<ClCompile Include="..\..\src\convert.cpp" />
<ClCompile Include="..\..\src\CRC.cpp" />
<ClCompile Include="..\..\src\CRC32.cpp" />
<ClCompile Include="..\..\src\DepthBuffer.cpp" />
<ClCompile Include="..\..\src\DepthBufferRender\ClipPolygon.cpp" />
<ClCompile Include="..\..\src\DepthBufferRender\DepthBufferRender.cpp" />
@ -386,6 +387,7 @@
<ClInclude Include="..\..\src\Config.h" />
<ClInclude Include="..\..\src\convert.h" />
<ClInclude Include="..\..\src\CRC.h" />
<ClInclude Include="..\..\src\CRC32.h" />
<ClInclude Include="..\..\src\Debug.h" />
<ClInclude Include="..\..\src\DepthBuffer.h" />
<ClInclude Include="..\..\src\DepthBufferRender\ClipPolygon.h" />

View File

@ -251,6 +251,9 @@
<ClCompile Include="..\..\src\Performance.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\src\CRC32.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\3DMath.h">
@ -445,5 +448,8 @@
<ClInclude Include="..\..\src\Performance.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\src\CRC32.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -13,6 +13,7 @@ set(GLideN64_SOURCES
Config.cpp
convert.cpp
CRC.cpp
CRC32.cpp
DepthBuffer.cpp
F3D.cpp
F3DDKR.cpp

View File

@ -1,65 +1,22 @@
#include "CRC.h"
#include "CRC32.h"
#define CRC32_POLYNOMIAL 0x04C11DB7
unsigned int CRCTable[ 256 ];
u32 Reflect( u32 ref, char ch )
void CRC_Init()
{
u32 value = 0;
// Swap bit 0 for bit 7
// bit 1 for bit 6, etc.
for (int i = 1; i < (ch + 1); ++i) {
if(ref & 1)
value |= 1 << (ch - i);
ref >>= 1;
}
return value;
}
void CRC_BuildTable()
{
u32 crc;
for (int i = 0; i < 256; ++i) {
crc = Reflect( i, 8 ) << 24;
for (int j = 0; j < 8; ++j)
crc = (crc << 1) ^ (crc & (1 << 31) ? CRC32_POLYNOMIAL : 0);
CRCTable[i] = Reflect( crc, 32 );
}
CRC32_BuildTable();
}
u32 CRC_Calculate_Strict( u32 crc, const void * buffer, u32 count )
{
u8 *p;
u32 orig = crc;
p = (u8*) buffer;
while (count--)
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
return crc ^ orig;
return CRC32_Calculate(crc, buffer, count);
}
u32 CRC_Calculate( u32 crc, const void * buffer, u32 count )
{
return CRC_Calculate_Strict(crc, buffer, count);
return CRC32_Calculate(crc, buffer, count);
}
u32 CRC_CalculatePalette(u32 crc, const void * buffer, u32 count )
{
u8 *p;
u32 orig = crc;
p = (u8*) buffer;
while (count--) {
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
p += 6;
}
return crc ^ orig;
return CRC32_CalculatePalette(crc, buffer, count);
}

View File

@ -1,8 +1,8 @@
#include "Types.h"
void CRC_BuildTable();
void CRC_Init();
// CRC32
// Strict chacksum calculation. usually CRC32
u32 CRC_Calculate_Strict( u32 crc, const void *buffer, u32 count );
u32 CRC_Calculate( u32 crc, const void *buffer, u32 count );
u32 CRC_CalculatePalette( u32 crc, const void *buffer, u32 count );

61
src/CRC32.cpp Normal file
View File

@ -0,0 +1,61 @@
#include "CRC32.h"
#define CRC32_POLYNOMIAL 0x04C11DB7
unsigned int CRCTable[ 256 ];
static
u32 Reflect( u32 ref, char ch )
{
u32 value = 0;
// Swap bit 0 for bit 7
// bit 1 for bit 6, etc.
for (int i = 1; i < (ch + 1); ++i) {
if(ref & 1)
value |= 1 << (ch - i);
ref >>= 1;
}
return value;
}
void CRC32_BuildTable()
{
u32 crc;
for (int i = 0; i < 256; ++i) {
crc = Reflect( i, 8 ) << 24;
for (int j = 0; j < 8; ++j)
crc = (crc << 1) ^ (crc & (1 << 31) ? CRC32_POLYNOMIAL : 0);
CRCTable[i] = Reflect( crc, 32 );
}
}
u32 CRC32_Calculate( u32 crc, const void * buffer, u32 count )
{
u8 *p;
u32 orig = crc;
p = (u8*) buffer;
while (count--)
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
return crc ^ orig;
}
u32 CRC32_CalculatePalette(u32 crc, const void * buffer, u32 count )
{
u8 *p;
u32 orig = crc;
p = (u8*) buffer;
while (count--) {
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
p += 6;
}
return crc ^ orig;
}

6
src/CRC32.h Normal file
View File

@ -0,0 +1,6 @@
#include "Types.h"
void CRC32_BuildTable();
u32 CRC32_Calculate( u32 crc, const void *buffer, u32 count );
u32 CRC32_CalculatePalette( u32 crc, const void *buffer, u32 count );

View File

@ -1,11 +1,11 @@
#include "CRC.h"
#include <arm_acle.h>
void CRC_BuildTable()
void CRC_Init()
{
}
u32 CRC_Calculate_Strict( u32 crc, const void * buffer, u32 count )
u32 CRC_Calculate( u32 crc, const void * buffer, u32 count )
{
u8 *p;
u32 orig = crc;
@ -35,9 +35,9 @@ u32 CRC_Calculate_Strict( u32 crc, const void * buffer, u32 count )
return crc ^ orig;
}
u32 CRC_Calculate( u32 crc, const void * buffer, u32 count )
u32 CRC_Calculate_Strict( u32 crc, const void * buffer, u32 count )
{
return CRC_Calculate_Strict(crc, buffer, count);
return CRC_Calculate(crc, buffer, count);
}
u32 CRC_CalculatePalette(u32 crc, const void * buffer, u32 count )

View File

@ -1,64 +1,32 @@
#include "CRC.h"
#include "CRC32.h"
#define CRC32_POLYNOMIAL 0x04C11DB7
unsigned int CRCTable[ 256 ];
u32 Reflect( u32 ref, char ch )
void CRC_Init()
{
u32 value = 0;
// Swap bit 0 for bit 7
// bit 1 for bit 6, etc.
for (int i = 1; i < (ch + 1); ++i) {
if(ref & 1)
value |= 1 << (ch - i);
ref >>= 1;
}
return value;
}
void CRC_BuildTable()
{
u32 crc;
for (int i = 0; i < 256; ++i) {
crc = Reflect( i, 8 ) << 24;
for (int j = 0; j < 8; ++j)
crc = (crc << 1) ^ (crc & (1 << 31) ? CRC32_POLYNOMIAL : 0);
CRCTable[i] = Reflect( crc, 32 );
}
CRC32_BuildTable();
}
u32 CRC_Calculate_Strict( u32 crc, const void * buffer, u32 count )
{
u8 *p;
u32 orig = crc;
p = (u8*) buffer;
while (count--)
crc = (crc >> 8) ^ CRCTable[(crc & 0xFF) ^ *p++];
return crc ^ orig;
return CRC32_Calculate(crc, buffer, count);
}
u32 CRC_Calculate( u32 crc, const void * buffer, u32 count )
{
unsigned int i;
u32 *data = (u32 *) buffer;
unsigned int i;
u32 *data = (u32 *) buffer;
count /= 4;
for(i = 0; i < count; ++i) {
crc += data[i];
crc += (crc << 10);
crc ^= (crc >> 6);
}
count /= 4;
for(i = 0; i < count; ++i) {
crc += data[i];
crc += (crc << 10);
crc ^= (crc >> 6);
}
crc += (crc << 3);
crc ^= (crc >> 11);
crc += (crc << 15);
return crc;
crc += (crc << 3);
crc ^= (crc >> 11);
crc += (crc << 15);
return crc;
}
u32 CRC_CalculatePalette( u32 crc, const void * buffer, u32 count )

View File

@ -68,7 +68,7 @@ private:
{
current[0] = nullptr;
current[1] = nullptr;
CRC_BuildTable();
CRC_Init();
}
TextureCache(const TextureCache &);