From adb4b2c6fff620ecd65e3786a2f961413507c1a4 Mon Sep 17 00:00:00 2001 From: notaz Date: Sat, 19 Nov 2011 22:26:46 +0200 Subject: [PATCH 1/1] gpu_neon: add a test ..that works with vram and display list dumps to produce output --- plugins/gpu_neon/Makefile.test | 33 ++++++++++ plugins/gpu_neon/test.c | 107 +++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 plugins/gpu_neon/Makefile.test create mode 100644 plugins/gpu_neon/test.c diff --git a/plugins/gpu_neon/Makefile.test b/plugins/gpu_neon/Makefile.test new file mode 100644 index 00000000..952f5088 --- /dev/null +++ b/plugins/gpu_neon/Makefile.test @@ -0,0 +1,33 @@ +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +CC_ = $(CROSS_COMPILE)gcc + +ARCH = $(shell $(CC) -v 2>&1 | grep -i 'target:' | awk '{print $$2}' | awk -F '-' '{print $$1}') + +CFLAGS += -ggdb -Wall +CFLAGS += -O2 +ifeq "$(ARCH)" "arm" +CFLAGS += -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp +endif +ifeq "$(ARCH)" "x86_64" +CFLAGS += -m32 +endif + +# test_neon +TARGETS = test_peops test_unai +SRC += test.c + +all: $(TARGETS) + +test_neon: SRC += psx_gpu_if.c +test_neon: CFLAGS += -fno-strict-aliasing +test_peops: SRC += peops_if.c +test_peops: CFLAGS += -fno-strict-aliasing +test_unai: SRC += unai_if.cpp +test_unai: CC_ = $(CXX) + +$(TARGETS): $(SRC) + $(CC_) -o $@ $(SRC) $(CFLAGS) $(LDFLAGS) + +clean: + $(RM) $(TARGETS) diff --git a/plugins/gpu_neon/test.c b/plugins/gpu_neon/test.c new file mode 100644 index 00000000..be271b65 --- /dev/null +++ b/plugins/gpu_neon/test.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include "gpu.h" + +static inline unsigned int pcnt_get(void) +{ + unsigned int val; +#ifdef __ARM_ARCH_7A__ + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(val)); +#else + val = 0; +#endif + return val; +} + +static inline void pcnt_init(void) +{ +#ifdef __ARM_ARCH_7A__ + int v; + asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(v)); + v |= 5; // master enable, ccnt reset + v &= ~8; // ccnt divider 0 + asm volatile("mcr p15, 0, %0, c9, c12, 0" :: "r"(v)); + // enable cycle counter + asm volatile("mcr p15, 0, %0, c9, c12, 1" :: "r"(1<<31)); +#endif +} + +const unsigned char cmd_lengths[256] = +{ + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 3, 6, 6, 6, 6, 4, 4, 4, 4, 8, 8, 8, 8, // 20 + 5, 5, 5, 5, 8, 8, 8, 8, 7, 7, 7, 7, 11, 11, 11, 11, + 2, 2, 2, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, // 40 + 3, 3, 3, 3, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2, // 60 + 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // a0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // c0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // e0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +struct psx_gpu gpu __attribute__((aligned(64))); + +typedef struct +{ + uint16_t vram[1024 * 512]; + uint32_t gpu_register[15]; + uint32_t status; +} gpu_dump_struct; + +static gpu_dump_struct state; + +int main(int argc, char *argv[]) +{ + unsigned int start_cycles; + uint32_t *list; + int size; + FILE *state_file; + FILE *list_file; + FILE *out_file; + + if (argc != 3 && argc != 4) + { + printf("usage:\n%s [vram_out]\n", argv[0]); + return 1; + } + + state_file = fopen(argv[1], "rb"); + fread(&state, 1, sizeof(gpu_dump_struct), state_file); + fclose(state_file); + + list_file = fopen(argv[2], "rb"); + fseek(list_file, 0, SEEK_END); + size = ftell(list_file); + fseek(list_file, 0, SEEK_SET); + + list = (uint32_t *)malloc(size); + fread(list, 1, size, list_file); + fclose(list_file); + + pcnt_init(); + renderer_init(); + memcpy(gpu.vram, state.vram, sizeof(gpu.vram)); + + start_cycles = pcnt_get(); + + do_cmd_list(list, size / 4); + renderer_flush_queues(); + + printf("%u\n", pcnt_get() - start_cycles); + + if (argc >= 4) { + out_file = fopen(argv[3], "wb"); + fwrite(gpu.vram, 1, sizeof(gpu.vram), out_file); + fclose(out_file); + } + + return 0; +} -- 2.39.2