diff --git a/compression/CBFByteOffset.cpp b/compression/CBFByteOffset.cpp index f618e4e02..2e37db681 100644 --- a/compression/CBFByteOffset.cpp +++ b/compression/CBFByteOffset.cpp @@ -6,11 +6,6 @@ #include #include -#if defined(__SSE2__) || defined(_M_X64) || defined(_M_AMD64) -# include -# define MINICBF_STREAM_STORE 1 -#endif - #include "../common/JFJochException.h" namespace { @@ -19,26 +14,6 @@ int16_t ReadI16(const uint8_t *p) { int16_t v; std::memcpy(&v, p, 2); return v; int32_t ReadI32(const uint8_t *p) { int32_t v; std::memcpy(&v, p, 4); return v; } int64_t ReadI64(const uint8_t *p) { int64_t v; std::memcpy(&v, p, 8); return v; } -// Nothing on this side reads the decoded image back: it goes to the GPU by DMA, or a CPU engine -// walks it once and drops it. An ordinary store therefore pays twice over - it reads every cache -// line before overwriting it, and it evicts 72 MB of live cache to make room - so the pixels go -// straight past the cache. Measured on an 18 Mpx frame: 27 ms of ordinary stores against 11 ms of -// these. The bytes written are the same either way; the fence is what makes them visible to the -// copy that follows. -void StorePixel(int32_t *out, int32_t value) { -#ifdef MINICBF_STREAM_STORE - _mm_stream_si32(out, value); -#else - *out = value; -#endif -} - -void StoreFence() { -#ifdef MINICBF_STREAM_STORE - _mm_sfence(); -#endif -} - } // namespace // The x-CBF_BYTE_OFFSET scheme: a running value, each pixel stored as a delta in the smallest @@ -75,12 +50,10 @@ void DecodeCBFByteOffset(const uint8_t *data, size_t size, int32_t *out, size_t } value += delta; - StorePixel(out + written, static_cast(value)); + out[written] = static_cast(value); written++; } - StoreFence(); - if (written != n_pixels) throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "miniCBF byte-offset stream ended after " + std::to_string(written)