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");