diff options
Diffstat (limited to 'xddm/display/res.c')
-rw-r--r-- | xddm/display/res.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/xddm/display/res.c b/xddm/display/res.c index 60e9bcb..589218b 100644 --- a/xddm/display/res.c +++ b/xddm/display/res.c @@ -1283,6 +1283,63 @@ static _inline void fast_memcpy_unaligment(void *dest, const void *src, size_t l #endif +uint64_t time_usecs(void) +{ + ENG_TIME_FIELDS systime; + EngQueryLocalTime(&systime); + return (uint64_t)(systime.usMilliseconds * 1000 + systime.usSecond * 1e6 + + systime.usMinute * 60e6 + systime.usHour * 3600e6); +} + +void benchmark_memcpy(PDev *pdev) +{ + size_t i; + unsigned char *src_unaligned; + unsigned char *dest_unaligned; + uint64_t start, total1, total2; + unsigned char *src = NULL; + unsigned char *dest = NULL; + size_t size = 1024; + size_t iter = 1024 * 1024; + + for (size = 1024; size < 1024*1024*2; size *= 2, iter /= 2) { + src_unaligned = EngAllocMem(0, size + 31, ALLOC_TAG); + dest_unaligned = EngAllocMem(0, size + 31, ALLOC_TAG); + src = (unsigned char *)((size_t)(src_unaligned + 31) & ~0x1f); + dest = (unsigned char *)((size_t)(dest_unaligned + 31) & ~0x1f); + + for (i = 0 ; i < size ; ++i) + src[i] = i; + + start = time_usecs(); + for (i = 0 ; i < iter ; ++i) { + fast_memcpy_aligned(dest, src, size); + } + total2 = time_usecs() - start; + + { + int errors = 0; + for (i = 0 ; i < size ; ++i) { + if (dest[i] != src[i]) { + errors++; + } + } + if (errors > 0) { + DEBUG_PRINT((pdev, 1, "!!! copy errors %d !!!\n", errors)); + } + } + + start = time_usecs(); + for (i = 0 ; i < iter ; ++i) + memcpy(dest, src, size); + total1 = time_usecs() - start; + + DEBUG_PRINT((pdev, 1, "%d: %lld, %lld\n", size, total1, total2)); + EngFreeMem(src_unaligned); + EngFreeMem(dest_unaligned); + } +} + #ifdef DBG #define PutBytesAlign __PutBytesAlign #define PutBytes(pdev, chunk, now, end, src, size, page_counter, alloc_size, use_sse)\ |