summaryrefslogtreecommitdiff
path: root/xddm/display/res.c
diff options
context:
space:
mode:
Diffstat (limited to 'xddm/display/res.c')
-rw-r--r--xddm/display/res.c57
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)\