From 6addecc3615d5e3f9caaafd39aa639c8ff49115b Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 21 Dec 2016 23:02:27 +0300 Subject: Use precalculated values for A and S dyes. --- src/resources/dye/dyecolor.h | 33 ++++++++++++++++++----- src/resources/dye/dyepalette.cpp | 1 + src/resources/dye/dyepalette_replaceacolor.cpp | 12 ++------- src/resources/dye/dyepalette_replaceaoglcolor.cpp | 12 ++------- src/resources/dye/dyepalette_replacescolor.cpp | 12 ++------- src/resources/dye/dyepalette_replacesoglcolor.cpp | 12 ++------- 6 files changed, 35 insertions(+), 47 deletions(-) (limited to 'src/resources') diff --git a/src/resources/dye/dyecolor.h b/src/resources/dye/dyecolor.h index 11e12a038..11257fc22 100644 --- a/src/resources/dye/dyecolor.h +++ b/src/resources/dye/dyecolor.h @@ -27,42 +27,61 @@ #include "localconsts.h" +#define buildHex(a, b, c, d) \ + (a) * 16777216U + (b) * 65536U + (c) * 256U + CAST_U32(d) + struct DyeColor final { - DyeColor() noexcept2 + DyeColor() noexcept2 : + valueA(buildHex(0, 0, 0, 255)), + valueS(buildHex(0, 0, 0, 0)), + valueSOgl(buildHex(0, 0, 0, 0)) { value[3] = 255; } DyeColor(const uint8_t r, const uint8_t g, - const uint8_t b) noexcept2 + const uint8_t b) noexcept2 : + valueA(buildHex(r, g, b, 255)), + valueS(buildHex(r, g, b, 0)), + valueSOgl(buildHex(0, b, g, r)) { value[0] = r; value[1] = g; value[2] = b; value[3] = 255; -// value2 = buildHex(r, g, b, 255); } DyeColor(const uint8_t r, const uint8_t g, const uint8_t b, - const uint8_t a) noexcept2 + const uint8_t a) noexcept2 : + valueA(buildHex(r, g, b, a)), + valueS(buildHex(r, g, b, 0)), + valueSOgl(buildHex(0, b, g, r)) { value[0] = r; value[1] = g; value[2] = b; value[3] = a; -// value2 = buildHex(r, g, b, a); + } + + void update() + { + valueA = buildHex(value[0], value[1], value[2], value[3]); + valueS = buildHex(value[0], value[1], value[2], 0); + valueSOgl = buildHex(0, value[2], value[1], value[0]); } union { uint8_t value[4]; - uint32_t value1; + uint32_t valueAOgl; }; -// uint32_t value2; + uint32_t valueA; + uint32_t valueS; + uint32_t valueSOgl; }; #endif // RESOURCES_DYE_DYECOLOR_H diff --git a/src/resources/dye/dyepalette.cpp b/src/resources/dye/dyepalette.cpp index 76f82b439..28efd76ba 100644 --- a/src/resources/dye/dyepalette.cpp +++ b/src/resources/dye/dyepalette.cpp @@ -109,6 +109,7 @@ void DyePalette::hexToColor(const std::string &restrict hexStr, hexDecode(hexStr[i]) << 4) + hexDecode(hexStr[i + 1])); } + color.update(); } unsigned int DyePalette::hexDecode(const signed char c) noexcept2 diff --git a/src/resources/dye/dyepalette_replaceacolor.cpp b/src/resources/dye/dyepalette_replaceacolor.cpp index f98c52343..7c24d6c1f 100644 --- a/src/resources/dye/dyepalette_replaceacolor.cpp +++ b/src/resources/dye/dyepalette_replaceacolor.cpp @@ -31,14 +31,6 @@ #ifdef __x86_64__ // avx2 #include "immintrin.h" - -#if SDL_BYTEORDER == SDL_BIG_ENDIAN -#define buildHex(a, b, c, d) \ - (d) * 16777216U + (c) * 65536U + (b) * 256U + CAST_U32(a) -#else // SDL_BYTEORDER == SDL_BIG_ENDIAN -#define buildHex(a, b, c, d) \ - (a) * 16777216U + (b) * 65536U + (c) * 256U + CAST_U32(d) -#endif // SDL_BYTEORDER == SDL_BIG_ENDIAN #endif // __x86_64__ #include "debug.h" @@ -177,8 +169,8 @@ void DyePalette::replaceAColorSimd(uint32_t *restrict pixels, ++ it; const DyeColor &col2 = *it; - __m256i newMask = _mm256_set1_epi32(buildHex(col2.value[0], col2.value[1], col2.value[2], col2.value[3])); - __m256i cmpMask = _mm256_set1_epi32(buildHex(col.value[0], col.value[1], col.value[2], col.value[3])); + __m256i newMask = _mm256_set1_epi32(col2.valueA); + __m256i cmpMask = _mm256_set1_epi32(col.valueA); __m256i cmpRes = _mm256_cmpeq_epi32(base, cmpMask); __m256i srcAnd = _mm256_andnot_si256(cmpRes, base); __m256i dstAnd = _mm256_and_si256(cmpRes, newMask); diff --git a/src/resources/dye/dyepalette_replaceaoglcolor.cpp b/src/resources/dye/dyepalette_replaceaoglcolor.cpp index 2b2d7a54c..8ed7af643 100644 --- a/src/resources/dye/dyepalette_replaceaoglcolor.cpp +++ b/src/resources/dye/dyepalette_replaceaoglcolor.cpp @@ -33,14 +33,6 @@ #ifdef __x86_64__ // avx2 #include "immintrin.h" - -#if SDL_BYTEORDER == SDL_BIG_ENDIAN -#define buildHex(a, b, c, d) \ - (d) * 16777216U + (c) * 65536U + (b) * 256U + CAST_U32(a) -#else // SDL_BYTEORDER == SDL_BIG_ENDIAN -#define buildHex(a, b, c, d) \ - (a) * 16777216U + (b) * 65536U + (c) * 256U + CAST_U32(d) -#endif // SDL_BYTEORDER == SDL_BIG_ENDIAN #endif // __x86_64__ #include "debug.h" @@ -185,8 +177,8 @@ void DyePalette::replaceAOGLColorSimd(uint32_t *restrict pixels, ++ it; const DyeColor &col2 = *it; - __m256i newMask = _mm256_set1_epi32(buildHex(col2.value[3], col2.value[2], col2.value[1], col2.value[0])); - __m256i cmpMask = _mm256_set1_epi32(buildHex(col.value[3], col.value[2], col.value[1], col.value[0])); + __m256i newMask = _mm256_set1_epi32(col2.valueAOgl); + __m256i cmpMask = _mm256_set1_epi32(col.valueAOgl); __m256i cmpRes = _mm256_cmpeq_epi32(base, cmpMask); __m256i srcAnd = _mm256_andnot_si256(cmpRes, base); __m256i dstAnd = _mm256_and_si256(cmpRes, newMask); diff --git a/src/resources/dye/dyepalette_replacescolor.cpp b/src/resources/dye/dyepalette_replacescolor.cpp index 22f4e6ac4..02412b186 100644 --- a/src/resources/dye/dyepalette_replacescolor.cpp +++ b/src/resources/dye/dyepalette_replacescolor.cpp @@ -29,14 +29,6 @@ #ifdef __x86_64__ // avx2 #include "immintrin.h" - -#if SDL_BYTEORDER == SDL_BIG_ENDIAN -#define buildHex(a, b, c, d) \ - (d) * 16777216U + (c) * 65536U + (b) * 256U + CAST_U32(a) -#else // SDL_BYTEORDER == SDL_BIG_ENDIAN -#define buildHex(a, b, c, d) \ - (a) * 16777216U + (b) * 65536U + (c) * 256U + CAST_U32(d) -#endif // SDL_BYTEORDER == SDL_BIG_ENDIAN #endif // __x86_64__ #include "debug.h" @@ -178,9 +170,9 @@ void DyePalette::replaceSColorSimd(uint32_t *restrict pixels, __m256i base2 = _mm256_and_si256(mask, base); //print256("base2 ", base2); - __m256i newMask = _mm256_set1_epi32(buildHex(col2.value[0], col2.value[1], col2.value[2], 0)); + __m256i newMask = _mm256_set1_epi32(col2.valueS); //print256("newMask ", newMask); - __m256i cmpMask = _mm256_set1_epi32(buildHex(col.value[0], col.value[1], col.value[2], 0)); + __m256i cmpMask = _mm256_set1_epi32(col.valueS); //print256("cmpMask ", cmpMask); __m256i cmpRes = _mm256_cmpeq_epi32(base2, cmpMask); //print256("cmpRes ", cmpRes); diff --git a/src/resources/dye/dyepalette_replacesoglcolor.cpp b/src/resources/dye/dyepalette_replacesoglcolor.cpp index a023d8f79..899286240 100644 --- a/src/resources/dye/dyepalette_replacesoglcolor.cpp +++ b/src/resources/dye/dyepalette_replacesoglcolor.cpp @@ -31,14 +31,6 @@ #ifdef __x86_64__ // avx2 #include "immintrin.h" - -#if SDL_BYTEORDER == SDL_BIG_ENDIAN -#define buildHex(a, b, c, d) \ - (d) * 16777216U + (c) * 65536U + (b) * 256U + CAST_U32(a) -#else // SDL_BYTEORDER == SDL_BIG_ENDIAN -#define buildHex(a, b, c, d) \ - (a) * 16777216U + (b) * 65536U + (c) * 256U + CAST_U32(d) -#endif // SDL_BYTEORDER == SDL_BIG_ENDIAN #endif // __x86_64__ #include "debug.h" @@ -186,9 +178,9 @@ void DyePalette::replaceSOGLColorSimd(uint32_t *restrict pixels, __m256i base2 = _mm256_and_si256(mask, base); //print256("base2 ", base2); - __m256i newMask = _mm256_set1_epi32(buildHex(0, col2.value[2], col2.value[1], col2.value[0])); + __m256i newMask = _mm256_set1_epi32(col2.valueSOgl); //print256("newMask ", newMask); - __m256i cmpMask = _mm256_set1_epi32(buildHex(0, col.value[2], col.value[1], col.value[0])); + __m256i cmpMask = _mm256_set1_epi32(col.valueSOgl); //print256("cmpMask ", cmpMask); __m256i cmpRes = _mm256_cmpeq_epi32(base2, cmpMask); //print256("cmpRes ", cmpRes); -- cgit v1.2.3-60-g2f50