blob: 96ffa1299ba37ca34b2f1fa37b214ff02f5f5d2e [file] [log] [blame]
/*
* Copyright (C) 2016 Etnaviv Project.
* Distributed under the MIT software license, see the accompanying
* file COPYING or http://www.opensource.org/licenses/mit-license.php.
*/
/* Basic "hello world" test */
/* Adapted from etnaviv_cl_test_gc3000 for GC7000, Fuchsia */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#if defined(__Fuchsia__)
#include "cmdstream_fuchsia.h"
#else
#include "drm_setup.h"
#include "cmdstream.h"
#endif
#include "hw/state.xml.h"
#include "hw/state_3d.xml.h"
#include "hw/common.xml.h"
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
uint32_t hello_code[] = {
/* 0: */ 0x00801000, 0x00000000, 0x00000000, 0x20000008, /* mov t0.x___, void, void, u0.xxxx */
/* 2: */ 0x00801033, 0x00000800, 0x90000050, 0x7400048f, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 3: */ 0x00801033, 0x00000800, 0x900000d0, 0x7400065f, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 4: */ 0x00801033, 0x00000c00, 0x90000150, 0x740006cf, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 5: */ 0x00801033, 0x00000c00, 0x900001d0, 0x740006cf, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 6: */ 0x00801033, 0x00000c00, 0x90000250, 0x740006ff, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 7: */ 0x00801033, 0x00000c00, 0x900002d0, 0x740002cf, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 8: */ 0x00801033, 0x00000c00, 0x90000350, 0x7400020f, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 9: */ 0x00801033, 0x00000c00, 0x900003d0, 0x7400057f, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 10: */ 0x00801033, 0x00000c00, 0x90000450, 0x740006ff, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 11: */ 0x00801033, 0x00000c00, 0x900004d0, 0x7400072f, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 12: */ 0x00801033, 0x00000c00, 0x90000550, 0x740006cf, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 13: */ 0x00801033, 0x00000c00, 0x900005d0, 0x7400064f, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 14: */ 0x00801033, 0x00000c00, 0x90000650, 0x7400021f, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 15: */ 0x00801033, 0x00000c00, 0x900006d0, 0x7400000f, /* store.s8 mem.x___, t0.xxxx, ?, ? */
/* 16: */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* nop void, void, void, void */
};
static void gen_cmd_stream(struct etna_cmd_stream *stream, struct etna_bo *code, struct etna_bo *bmp)
{
etna_set_state(stream, VIVS_PA_SYSTEM_MODE, VIVS_PA_SYSTEM_MODE_PROVOKING_VERTEX_LAST | VIVS_PA_SYSTEM_MODE_HALF_PIXEL_CENTER);
etna_set_state(stream, VIVS_GL_API_MODE, VIVS_GL_API_MODE_OPENCL);
etna_set_state(stream, VIVS_VS_HALTI5_UNK15600, 0x00000002);
etna_set_state(stream, VIVS_NTE_DESCRIPTOR_UNK14C40, 0x1);
etna_stall(stream, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE);
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(4));
etna_set_state(stream, VIVS_VS_OUTPUT_COUNT, 0);
etna_set_state(stream, VIVS_CL_UNK00924, 0);
etna_set_state_from_bo(stream, VIVS_SH_HALTI5_UNIFORMS(0), bmp, ETNA_RELOC_WRITE);
etna_set_state(stream, VIVS_SH_HALTI5_UNIFORMS(1), 0x1100);
etna_set_state(stream, VIVS_PA_HALTI5_UNK00A90(0), VIVS_GL_VARYING_TOTAL_COMPONENTS_NUM(0x0));
etna_set_state(stream, VIVS_PS_HALTI5_UNK01080(0), VIVS_GL_VARYING_TOTAL_COMPONENTS_NUM(0x0));
etna_set_state(stream, VIVS_PS_TEMP_REGISTER_CONTROL, VIVS_PS_TEMP_REGISTER_CONTROL_NUM_TEMPS(4));
etna_set_state(stream, VIVS_PS_HALTI5_UNK01058, 0x00000000);
etna_set_state(stream, VIVS_PS_UNIFORM_BASE, 0x0);
etna_set_state(stream, VIVS_PS_NEWRANGE_LOW, 0);
etna_set_state(stream, VIVS_PS_NEWRANGE_HIGH, 0x10);
etna_set_state_from_bo(stream, VIVS_PS_INST_ADDR, code, ETNA_RELOC_READ);
etna_set_state(stream, VIVS_VS_HALTI5_UNK15600, 0x00000002);
etna_set_state(stream, VIVS_VS_ICACHE_CONTROL, 0x1);
etna_set_state(stream, VIVS_PS_HALTI5_UNK01094, 0xF);
etna_set_state(stream, VIVS_PS_INPUT_COUNT, 0x00001F01);
etna_set_state(stream, VIVS_PS_INPUT_COUNT + 0x4, 0x00000008);
etna_set_state(stream, VIVS_PS_INPUT_COUNT + 0x8, 0x00000F00);
etna_set_state(stream, VIVS_VS_HALTI5_UNK008A0, 0);
etna_set_state(stream, VIVS_PA_HALTI5_UNK00AA8, 0);
etna_set_state(stream, VIVS_PA_ATTRIBUTE_ELEMENT_COUNT, VIVS_PA_ATTRIBUTE_ELEMENT_COUNT_UNK0(0x0) | VIVS_PA_ATTRIBUTE_ELEMENT_COUNT_COUNT(0x0));
etna_set_state(stream, VIVS_GL_VARYING_TOTAL_COMPONENTS, VIVS_GL_VARYING_TOTAL_COMPONENTS_NUM(0x0));
etna_set_state(stream, VIVS_GL_UNK03834, 0x0);
etna_set_state(stream, VIVS_PS_CONTROL_EXT, 0x0);
etna_set_state(stream, VIVS_VS_LOAD_BALANCING, 0xF3F0000);
etna_set_state(stream, VIVS_VS_OUTPUT_COUNT, 1);
etna_set_state(stream, VIVS_GL_HALTI5_UNK03888, 0);
etna_set_state(stream, VIVS_PS_UNK01048, 0);
etna_set_state(stream, VIVS_CL_CONFIG, 0x03000001);
etna_set_state(stream, VIVS_CL_UNK00924, 0x00010000);
etna_set_state(stream, VIVS_CL_THREAD_ALLOCATION, 0x1);
etna_set_state(stream, VIVS_CL_UNK0092C, 0x0);
etna_set_state(stream, VIVS_CL_UNK00934, 0x0);
etna_set_state(stream, VIVS_CL_UNK0093C, 0x0);
etna_set_state(stream, VIVS_CL_HALTI5_UNK00958, 0x1);
etna_set_state(stream, VIVS_CL_HALTI5_UNK0095C, 0x1);
etna_set_state(stream, VIVS_CL_HALTI5_UNK00960, 0x1);
etna_set_state(stream, VIVS_CL_UNK00940, 0x00000000);
etna_set_state(stream, VIVS_CL_UNK00940 + 0x4, 0xFFFFFFFF);
etna_set_state(stream, VIVS_CL_UNK00940 + 0x8, 0xFFFFFFFF);
etna_set_state(stream, VIVS_CL_UNK00940 + 0xC, 0x00000000);
etna_set_state(stream, VIVS_CL_UNK00940 + 0x10, 0x000003FF);
etna_set_state(stream, VIVS_CL_UNK00940 + 0x14, 0x000003FF);
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_stall(stream, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_DEPTH | VIVS_GL_FLUSH_CACHE_COLOR);
}
#if defined(__Fuchsia__)
int etnaviv_cl_test_gc7000(int argc, char *argv[])
#else
int main(int argc, char *argv[])
#endif
{
struct drm_test_info *info;
struct etna_bo *bmp, *code;
static const size_t out_size = 65536;
static const size_t code_size = 4096;
if ((info = drm_test_setup(argc, argv)) == NULL) {
return 1;
}
code = etna_bo_new(info->dev, code_size, DRM_ETNA_GEM_CACHE_UNCACHED);
if (!code) {
fprintf(stderr, "Unable to allocate buffer\n");
goto out;
}
memcpy(etna_bo_map(code), hello_code, sizeof(hello_code));
bmp = etna_bo_new(info->dev, out_size, DRM_ETNA_GEM_CACHE_UNCACHED);
if (!bmp) {
fprintf(stderr, "Unable to allocate buffer\n");
goto out;
}
memset(etna_bo_map(bmp), 0xFF, out_size);
/* generate command sequence */
gen_cmd_stream(info->stream, code, bmp);
etna_cmd_stream_finish(info->stream);
const unsigned char *data = etna_bo_map(bmp);
const char kHelloWorld[] = "Hello, World!";
if (strncmp((char*)data, kHelloWorld, sizeof(kHelloWorld)) == 0) {
drm_test_teardown(info);
return 0;
}
printf("Unexpected result:\n");
for(int i=0; i<0x100; ++i) {
printf("%02x ", data[i]);
}
printf("\n");
out:
drm_test_teardown(info);
return 1;
}