| 1 | #ifndef BUFFER_HPP |
|---|
| 2 | #define BUFFER_HPP |
|---|
| 3 | #include "bitblock.hpp" |
|---|
| 4 | |
|---|
| 5 | /////////////////////////////////////////////////////////////////////////// |
|---|
| 6 | // Buffer Constants |
|---|
| 7 | /////////////////////////////////////////////////////////////////////////// |
|---|
| 8 | // |
|---|
| 9 | // NOTE: Buffer segments are defined as multiples of BLOCK_SIZE. |
|---|
| 10 | // BLOCK_SIZE defined as a number of bytes. |
|---|
| 11 | // |
|---|
| 12 | #define PADDING_BLOCKS 1 |
|---|
| 13 | #define PADDING_SIZE (BLOCK_SIZE * PADDING_BLOCKS) |
|---|
| 14 | #define COPYBACK_BLOCKS 0 |
|---|
| 15 | #define COPYBACK_SIZE (BLOCK_SIZE * COPYBACK_BLOCKS) |
|---|
| 16 | #define SEGMENT_BLOCKS 12 |
|---|
| 17 | #define SEGMENT_SIZE (BLOCK_SIZE * SEGMENT_BLOCKS) |
|---|
| 18 | #define BUFFER_SIZE (COPYBACK_SIZE + SEGMENT_SIZE + PADDING_SIZE) |
|---|
| 19 | |
|---|
| 20 | /////////////////////////////////////////////////////////////////////////// |
|---|
| 21 | // |
|---|
| 22 | // Statically Allocated Parallel Data Buffer Management |
|---|
| 23 | // |
|---|
| 24 | // Parallel data buffers with optional copyback/padding segments. |
|---|
| 25 | // |
|---|
| 26 | // |COPYBACK BLOCKS|WORKING SEGMENT BLOCKS|PADDING BLOCKS| |
|---|
| 27 | // |
|---|
| 28 | // WARNING: Statically allocated bitblock arrays must remain in scope. |
|---|
| 29 | // |
|---|
| 30 | /////////////////////////////////////////////////////////////////////////// |
|---|
| 31 | |
|---|
| 32 | #define ALLOC_STATIC_ALIGNED_BYTE_BUFFER(base_ptr, buffer_size) \ |
|---|
| 33 | ATTRIBUTE_SIMD_ALIGN BitBlock aligned_##base_ptr[buffer_size/sizeof(BitBlock)]; \ |
|---|
| 34 | assert_bitblock_align((void*)aligned_##base_ptr);\ |
|---|
| 35 | base_ptr = (uint8_t *)&aligned_##base_ptr[0];\ |
|---|
| 36 | |
|---|
| 37 | #define ALLOC_STATIC_ALIGNED_BITBLOCK_BUFFER(base_ptr, buffer_size) \ |
|---|
| 38 | ATTRIBUTE_SIMD_ALIGN BitBlock aligned_##base_ptr[buffer_size/sizeof(BitBlock)/8]; \ |
|---|
| 39 | assert_bitblock_align((void*)aligned_##base_ptr);\ |
|---|
| 40 | base_ptr = &aligned_##base_ptr[0];\ |
|---|
| 41 | |
|---|
| 42 | #define ALLOC_STATIC_ALIGNED_BYTE_BUFFER_WITH_COPYBACK(copyback_ptr, base_ptr) \ |
|---|
| 43 | ATTRIBUTE_SIMD_ALIGN BitBlock aligned_##base_ptr[BUFFER_SIZE/sizeof(BitBlock)]; \ |
|---|
| 44 | assert_bitblock_align((void*)aligned_##base_ptr);\ |
|---|
| 45 | copyback_ptr = (uint8_t *)aligned_##base_ptr; \ |
|---|
| 46 | memset(copyback_ptr,0,COPYBACK_SIZE); \ |
|---|
| 47 | base_ptr = ©back_ptr[COPYBACK_SIZE]; \ |
|---|
| 48 | |
|---|
| 49 | #define ALLOC_STATIC_ALIGNED_BITBLOCK_BUFFER_WITH_COPYBACK(copyback_ptr, base_ptr) \ |
|---|
| 50 | ATTRIBUTE_SIMD_ALIGN BitBlock aligned_##base_ptr[BUFFER_SIZE/sizeof(BitBlock)/8]; \ |
|---|
| 51 | assert_bitblock_align((void*)aligned_##base_ptr);\ |
|---|
| 52 | copyback_ptr = (BitBlock *) aligned_##base_ptr; \ |
|---|
| 53 | memset(copyback_ptr,0,COPYBACK_SIZE/8); \ |
|---|
| 54 | base_ptr = ©back_ptr[COPYBACK_BLOCKS]; \ |
|---|
| 55 | |
|---|
| 56 | #define COPY_BACK_BYTE_BUFFER(copyback_ptr, base_ptr) \ |
|---|
| 57 | do { void * dest = copyback_ptr;\ |
|---|
| 58 | void * src = (uint8_t *)base_ptr + (SEGMENT_SIZE - COPYBACK_SIZE);\ |
|---|
| 59 | assert_bitblock_align(src);\ |
|---|
| 60 | assert_bitblock_align(dest);\ |
|---|
| 61 | memmove(dest, src, COPYBACK_SIZE);\ |
|---|
| 62 | } while(0) |
|---|
| 63 | |
|---|
| 64 | #define COPY_BACK_BITBLOCK_BUFFER(copyback_ptr, base_ptr) \ |
|---|
| 65 | do { void * dest = copyback_ptr;\ |
|---|
| 66 | void * src = (uint8_t *)base_ptr + ((SEGMENT_SIZE - COPYBACK_SIZE)/8);\ |
|---|
| 67 | assert_bitblock_align(src);\ |
|---|
| 68 | assert_bitblock_align(dest);\ |
|---|
| 69 | memmove(dest, src, COPYBACK_SIZE/8);\ |
|---|
| 70 | } while(0) |
|---|
| 71 | |
|---|
| 72 | #endif // BUFFER_HPP |
|---|