/* rbtest.c - how fast can the 604e read a frame out of the Mystique's VRAM? * Claude Opus 5.5, 2026-10-14. */ #include #include #include #include "mga.h" #define N (640 * 480 * 2) static int cmpd(const void *a, const void *b) { double x = *(const double *) a, y = *(const double *) b; return x < y ? -1 : x > y; } int main(void) { static double buf[N / 8]; double t[15]; int m, k, i; static char *name[] = { "32-bit loads", "64-bit (lfd) loads", "memcpy", "16-bit loads" }; if (mga_open()) return 1; for (m = 0; m < 4; m++) { for (k = 0; k < 15; k++) { double t0 = mga_now(); if (m == 0) { volatile unsigned int *s = (volatile unsigned int *) mga_fb; unsigned int *d = (unsigned int *) buf; for (i = 0; i < N / 4; i++) d[i] = s[i]; } if (m == 1) { volatile double *s = (volatile double *) mga_fb; for (i = 0; i < N / 8; i++) buf[i] = s[i]; } if (m == 2) memcpy(buf, (void *) mga_fb, N); if (m == 3) { volatile unsigned short *s = (volatile unsigned short *) mga_fb; unsigned short *d = (unsigned short *) buf; for (i = 0; i < N / 2; i++) d[i] = s[i]; } t[k] = mga_now() - t0; } qsort(t, 15, sizeof(double), cmpd); printf("%-20s min %6.1f ms median %6.1f ms %5.1f MB/s\n", name[m], t[0] * 1e3, t[7] * 1e3, N / t[7] / 1e6); } /* for scale: writing the same frame into VRAM */ for (k = 0; k < 15; k++) { double t0 = mga_now(); volatile double *d = (volatile double *) mga_fb; for (i = 0; i < N / 8; i++) d[i] = buf[i]; t[k] = mga_now() - t0; } qsort(t, 15, sizeof(double), cmpd); printf("%-20s min %6.1f ms median %6.1f ms %5.1f MB/s\n", "64-bit stores", t[0] * 1e3, t[7] * 1e3, N / t[7] / 1e6); mga_close(); return 0; }