prepare for code concatenation
diff --git a/src/etnaviv_verifyops.c b/src/etnaviv_verifyops.c index 0d5341e..bc6ccf6 100644 --- a/src/etnaviv_verifyops.c +++ b/src/etnaviv_verifyops.c
@@ -16,34 +16,65 @@ #include "drm_setup.h" #include "cmdstream.h" +#include "memutil.h" #include "state.xml.h" #include "state_3d.xml.h" #include "common.xml.h" -#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#define GPU_CODE(x) {x, ARRAY_SIZE(x)} +struct gpu_code { + const uint32_t *code; + unsigned size; +}; + +struct op_test { + const char *op_name; + size_t unit_size; + void (*generate_values_h)(size_t seed, void *a, size_t width); + // Leave NULL for unary ops + void (*generate_values_v)(size_t seed, void *b, size_t height); + void (*compute_cpu)(void *out, const void *a, const void *b, size_t width, size_t height); + struct gpu_code code; +}; + +struct gpu_code prelude = GPU_CODE(((uint32_t[]){ + 0x0082100c, 0x15600800, 0x800100c0, 0x0000000a, /* 0x4c.u32 t2.x___, t0.yyyy, u1.xxxx, t0.xxxx */ + 0x01021019, 0x00200800, 0x80010000, 0x203fc008, /* lshift.u32 t2._y__, t0.xxxx, void, u0.wwww */ + 0x01011032, 0x15600800, 0x80aa0150, 0x00000000, /* load.u32 t1._y__, u0.yyyy, t2.yyyy, void */ + 0x01021009, 0x00000000, 0x00000000, 0x00154018, /* mov t2._y__, void, void, t1.yyyy */ + 0x00801019, 0x15600800, 0x80010000, 0x203fc008, /* lshift.u32 t0.x___, t0.yyyy, void, u0.wwww */ + 0x00811032, 0x2aa00800, 0x80000050, 0x00000000, /* load.u32 t1.x___, u0.zzzz, t0.xxxx, void */ + 0x00801009, 0x00000000, 0x00000000, 0x00000018, /* mov t0.x___, void, void, t1.xxxx */ +})); + +struct gpu_code postlude = GPU_CODE(((uint32_t[]){ + 0x01001019, 0x00202800, 0x80010000, 0x203fc008, /* lshift.u32 t0._y__, t2.xxxx, void, u0.wwww */ + 0x00800033, 0x00200800, 0x80aa0050, 0x00000008, /* store.u32 mem.x___, u0.xxxx, t0.yyyy, t0.xxxx */ + 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* nop void, void, void, void */ +})); static void gen_cmd_stream(struct etna_cmd_stream *stream, struct etna_bo *out, struct etna_bo *in0, struct etna_bo *in1) { + unsigned num_inst = 10; etna_set_state(stream, VIVS_PA_SYSTEM_MODE, VIVS_PA_SYSTEM_MODE_UNK0 | VIVS_PA_SYSTEM_MODE_UNK4); etna_set_state(stream, VIVS_GL_API_MODE, VIVS_GL_API_MODE_OPENCL); + etna_set_state(stream, VIVS_VS_INPUT_COUNT, VIVS_VS_INPUT_COUNT_COUNT(1) | VIVS_VS_INPUT_COUNT_UNK8(31)); etna_set_state(stream, VIVS_VS_INPUT(0), VIVS_VS_INPUT_I0(0) | VIVS_VS_INPUT_I1(1) | VIVS_VS_INPUT_I2(2) | VIVS_VS_INPUT_I3(3)); etna_set_state(stream, VIVS_VS_TEMP_REGISTER_CONTROL, VIVS_VS_TEMP_REGISTER_CONTROL_NUM_TEMPS(10)); etna_set_state(stream, VIVS_VS_OUTPUT_COUNT, 0); etna_set_state(stream, VIVS_CL_UNK00924, 0x0); - etna_set_state(stream, VIVS_VS_INPUT_COUNT, VIVS_VS_INPUT_COUNT_COUNT(1) | VIVS_VS_INPUT_COUNT_UNK8(31)); - etna_set_state(stream, VIVS_VS_INPUT(0), VIVS_VS_INPUT_I0(0) | VIVS_VS_INPUT_I1(1) | VIVS_VS_INPUT_I2(2) | VIVS_VS_INPUT_I3(3)); - etna_set_state(stream, VIVS_VS_TEMP_REGISTER_CONTROL, VIVS_VS_TEMP_REGISTER_CONTROL_NUM_TEMPS(10)); - etna_set_state(stream, VIVS_VS_OUTPUT_COUNT, 0); - etna_set_state(stream, VIVS_CL_UNK00924, 0x0); + etna_set_state_from_bo(stream, VIVS_VS_UNIFORMS(0), out); etna_set_state_from_bo(stream, VIVS_VS_UNIFORMS(1), in0); etna_set_state_from_bo(stream, VIVS_VS_UNIFORMS(2), in1); + etna_set_state(stream, VIVS_VS_UNIFORMS(3), 0x2); etna_set_state(stream, VIVS_VS_UNIFORMS(4), 0x10); etna_set_state(stream, VIVS_VS_UNIFORMS(5), 0x10); etna_set_state(stream, VIVS_VS_UNIFORMS(6), 0x0); etna_set_state(stream, VIVS_VS_UNIFORMS(7), 0x0); + etna_set_state(stream, VIVS_GL_SEMAPHORE_TOKEN, VIVS_GL_SEMAPHORE_TOKEN_FROM(SYNC_RECIPIENT_FE) | VIVS_GL_SEMAPHORE_TOKEN_TO(SYNC_RECIPIENT_PE)); etna_set_state(stream, VIVS_VS_INPUT_COUNT, VIVS_VS_INPUT_COUNT_COUNT(1) | VIVS_VS_INPUT_COUNT_UNK8(1)); etna_set_state(stream, VIVS_VS_TEMP_REGISTER_CONTROL, VIVS_VS_TEMP_REGISTER_CONTROL_NUM_TEMPS(10)); @@ -51,8 +82,8 @@ etna_set_state(stream, VIVS_GL_VARYING_NUM_COMPONENTS, VIVS_GL_VARYING_NUM_COMPONENTS_VAR0(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR1(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR2(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR3(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR4(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR5(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR6(0x0) | VIVS_GL_VARYING_NUM_COMPONENTS_VAR7(0x0)); etna_set_state(stream, VIVS_GL_UNK03834, 0x0); etna_set_state(stream, VIVS_VS_NEW_UNK00860, 0x0); - etna_set_state(stream, VIVS_VS_RANGE, VIVS_VS_RANGE_LOW(0x0) | VIVS_VS_RANGE_HIGH(0x9)); - etna_set_state(stream, VIVS_VS_UNIFORMS(3), 0x2); + etna_set_state(stream, VIVS_VS_RANGE, VIVS_VS_RANGE_LOW(0x0) | VIVS_VS_RANGE_HIGH(num_inst - 1)); + etna_set_state(stream, VIVS_SH_INST_MEM(0), 0x82100c); etna_set_state(stream, VIVS_SH_INST_MEM(1), 0x15600800); etna_set_state(stream, VIVS_SH_INST_MEM(2), 0x800100c0); @@ -97,6 +128,7 @@ etna_set_state(stream, VIVS_SH_INST_MEM(41), 0x0); etna_set_state(stream, VIVS_SH_INST_MEM(42), 0x0); etna_set_state(stream, VIVS_SH_INST_MEM(43), 0x0); + etna_set_state(stream, VIVS_PS_INPUT_COUNT, VIVS_PS_INPUT_COUNT_COUNT(1) | VIVS_PS_INPUT_COUNT_UNK8(31)); etna_set_state(stream, VIVS_PS_TEMP_REGISTER_CONTROL, VIVS_PS_TEMP_REGISTER_CONTROL_NUM_TEMPS(10)); etna_set_state(stream, VIVS_PS_CONTROL, 0); @@ -113,7 +145,9 @@ etna_set_state(stream, VIVS_CL_WORKGROUP_Y, VIVS_CL_WORKGROUP_Y_SIZE(0x7) | VIVS_CL_WORKGROUP_Y_COUNT(0x1)); etna_set_state(stream, VIVS_CL_WORKGROUP_Z, VIVS_CL_WORKGROUP_Z_SIZE(0x3ff) | VIVS_CL_WORKGROUP_Z_COUNT(0xffff)); etna_set_state(stream, VIVS_CL_THREAD_ALLOCATION, 0x4); + // Kick off program etna_set_state(stream, VIVS_CL_KICKER, 0xbadabeeb); + etna_set_state(stream, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_TEXTURE | VIVS_GL_FLUSH_CACHE_SHADER_L1); etna_set_state(stream, VIVS_GL_SEMAPHORE_TOKEN, VIVS_GL_SEMAPHORE_TOKEN_FROM(SYNC_RECIPIENT_FE) | VIVS_GL_SEMAPHORE_TOKEN_TO(SYNC_RECIPIENT_PE)); etna_set_state(stream, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_DEPTH | VIVS_GL_FLUSH_CACHE_COLOR); @@ -148,24 +182,11 @@ } } -struct op_test { - const char *op_name; - size_t unit_size; - void (*generate_values_h)(size_t seed, void *a, size_t width); - // Leave NULL for unary ops - void (*generate_values_v)(size_t seed, void *b, size_t height); - void (*compute_cpu)(void *out, const void *a, const void *b, size_t width, size_t height); - const uint32_t *gpu_code; - unsigned gpu_code_words; -}; - -#define GPU_CODE(x) x, ARRAY_SIZE(x) struct op_test op_tests[] = { {"add", 4, i32_generate_values_h, i32_generate_values_v, add_compute_cpu, GPU_CODE(((uint32_t[]){ - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00801001, 0x15602800, 0x80000000, 0x00000008 /* add.u32 t0.x___, t2.yyyy, void, t0.xxxx */ })) } }; @@ -226,7 +247,7 @@ } } else { errors = 1; - printf("Unhandled unit_size %d\n", (int)cur_test->unit_size); + printf("No comparison implemented for unit_size %d\n", (int)cur_test->unit_size); } if (errors == 0) { printf("PASS\n");