blob: 0d0566b9db12c7c0151cac02d6e7646110f6da59 [file] [log] [blame]
/*
* Copyright (C) 2017 Etnaviv Project.
* Distributed under the MIT software license, see the accompanying
* file COPYING or http://www.opensource.org/licenses/mit-license.php.
*/
/* Basic triangle rendering test */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "drm_setup.h"
#include "cmdstream.h"
#include "write_bmp.h"
#include "hw/state.xml.h"
#include "hw/state_3d.xml.h"
#include "hw/common.xml.h"
/* TODO:
* - process output (un-supertile resolve)
* - free/cleanup
*/
/* Data stream */
static const float vData[] = {
0.0f, 1.0f, 0.0f, 1.0f, // point 1
1.0f, 0.0f, 0.0f, 1.0f, // red
-1.0f, -1.0f, 0.0f, 1.0f, // point 2
0.0f, 1.0f, 0.0f, 1.0f, // green
1.0f, -1.0f, 0.0f, 1.0f, // point 3
0.0f, 0.0f, 1.0f, 1.0f, // blue
};
struct attachments {
struct etna_bo *color_status;
struct etna_bo *color_surface;
struct etna_bo *depth_status;
struct etna_bo *depth_surface;
struct etna_bo *stream_data;
struct etna_reloc color_status_base;
struct etna_reloc color_surface_base;
struct etna_reloc depth_status_base;
struct etna_reloc depth_surface_base;
struct etna_reloc stream_base;
};
/* 1280x800 */
static const size_t color_status_size = 0x4400;
static const size_t color_surface_size = 0x410000;
static const size_t depth_status_size = 0x4400;
static const size_t depth_surface_size = 0x410000;
static bool initialize_attachments(struct etna_device *dev, struct attachments *at)
{
/* Allocate memory for depth and surface attachments */
at->color_status = etna_bo_new(dev, color_status_size, DRM_ETNA_GEM_CACHE_UNCACHED);
at->color_surface = etna_bo_new(dev, color_surface_size, DRM_ETNA_GEM_CACHE_UNCACHED);
at->depth_status = etna_bo_new(dev, depth_status_size, DRM_ETNA_GEM_CACHE_UNCACHED);
at->depth_surface = etna_bo_new(dev, depth_surface_size, DRM_ETNA_GEM_CACHE_UNCACHED);
at->stream_data = etna_bo_new(dev, sizeof(vData), DRM_ETNA_GEM_CACHE_UNCACHED);
if (!at->color_status || !at->color_surface ||
!at->depth_status || !at->depth_surface || !at->stream_data) {
fprintf(stderr, "Error allocating memory\n");
return false;
}
/* Set base bo's */
at->color_status_base.bo = at->color_status;
at->color_status_base.flags = ETNA_RELOC_WRITE | ETNA_RELOC_READ;
at->color_status_base.offset = 0;
at->color_surface_base.bo = at->color_surface;
at->color_surface_base.flags = ETNA_RELOC_WRITE | ETNA_RELOC_READ;
at->color_surface_base.offset = 0;
at->depth_status_base.bo = at->depth_status;
at->depth_status_base.flags = ETNA_RELOC_WRITE | ETNA_RELOC_READ;
at->depth_status_base.offset = 0;
at->depth_surface_base.bo = at->depth_surface;
at->depth_surface_base.flags = ETNA_RELOC_WRITE | ETNA_RELOC_READ;
at->depth_surface_base.offset = 0;
at->stream_base.bo = at->stream_data;
at->stream_base.flags = ETNA_RELOC_READ;
at->stream_base.offset = 0;
/* Clear surfaces */
memset(etna_bo_map(at->color_status), 0, color_status_size);
memset(etna_bo_map(at->color_surface), 0, color_surface_size);
memset(etna_bo_map(at->depth_status), 0, depth_status_size);
memset(etna_bo_map(at->depth_surface), 0, depth_surface_size);
/* Upload stream data */
unsigned char *mapped = etna_bo_map(at->stream_data);
memcpy(mapped, vData, sizeof(vData));
return true;
}
static bool free_attachments(struct etna_device *dev, struct attachments *at)
{
return true;
}
/* render frame from blob */
static void build_frame_cmdbuf(struct etna_cmd_stream *stream, struct attachments *at)
{
etna_set_state(stream, VIVS_GL_VERTEX_ELEMENT_CONFIG, 0x00000001);
etna_set_state(stream, VIVS_RA_CONTROL, 0x00000001);
etna_set_state(stream, VIVS_PA_W_CLIP_LIMIT, 0x34000001);
etna_set_state(stream, VIVS_PE_LOGIC_OP, 0xfffffbff);
etna_set_state(stream, VIVS_RA_UNK00E0C, 0x00000000);
etna_set_state(stream, VIVS_PA_FLAGS, 0x40000000);
etna_set_state(stream, VIVS_PA_SYSTEM_MODE, 0x00000011);
etna_set_state(stream, VIVS_GL_API_MODE, 0x00000000);
etna_set_state(stream, VIVS_SE_CONFIG, 0x00000000);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_TS_FLUSH_CACHE, 0x00000001);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_TS_FLUSH_CACHE, 0x00000001);
etna_stall(stream, SYNC_RECIPIENT_RA, SYNC_RECIPIENT_PE);
etna_set_state(stream, VIVS_RS_CONFIG, 0x00000606);
etna_set_state(stream, VIVS_RS_DITHER(0), 0xffffffff);
etna_set_state(stream, VIVS_RS_DITHER(1), 0xffffffff);
etna_set_state_reloc(stream, VIVS_RS_DEST_ADDR, &at->color_status_base);
etna_set_state_reloc(stream, VIVS_RS_PIPE_DEST_ADDR(0), &at->color_status_base);
etna_set_state(stream, VIVS_RS_SOURCE_STRIDE, 0x00000000);
etna_set_state(stream, VIVS_RS_DEST_STRIDE, 0x00000080);
etna_set_state(stream, VIVS_RS_FILL_VALUE(0), 0x55555555);
etna_set_state(stream, VIVS_RS_CLEAR_CONTROL, 0x0001ffff);
etna_set_state(stream, VIVS_RS_EXTRA_CONFIG, 0x00100000);
etna_set_state(stream, VIVS_RS_WINDOW_SIZE, 0x00880020);
etna_set_state(stream, VIVS_RS_PIPE_OFFSET(0), 0x00000000);
etna_set_state(stream, VIVS_RS_SINGLE_BUFFER, 0x00000001);
etna_set_state(stream, VIVS_RS_KICKER, 0xbadabeeb);
etna_set_state(stream, VIVS_RS_SINGLE_BUFFER, 0x00000000);
etna_stall(stream, SYNC_RECIPIENT_RA, SYNC_RECIPIENT_PE);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000002);
etna_set_state(stream, VIVS_DUMMY_DUMMY, 0x00000000);
etna_set_state(stream, VIVS_TS_COLOR_AUTO_DISABLE_COUNT, 0x00010400);
etna_set_state_reloc(stream, VIVS_TS_COLOR_STATUS_BASE, &at->color_status_base);
etna_set_state_reloc(stream, VIVS_TS_COLOR_SURFACE_BASE, &at->color_surface_base);
etna_set_state(stream, VIVS_TS_COLOR_CLEAR_VALUE, 0xff808080);
etna_set_state(stream, VIVS_TS_COLOR_CLEAR_VALUE_EXT, 0xff808080);
etna_set_state(stream, VIVS_TS_MEM_CONFIG, 0x00000022);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000001);
etna_set_state(stream, VIVS_DUMMY_DUMMY, 0x00000000);
etna_set_state_reloc(stream, VIVS_TS_DEPTH_STATUS_BASE, &at->depth_status_base);
etna_set_state_reloc(stream, VIVS_TS_DEPTH_SURFACE_BASE, &at->depth_surface_base);
etna_set_state(stream, VIVS_TS_DEPTH_CLEAR_VALUE, 0xffffff00);
etna_set_state(stream, VIVS_TS_MEM_CONFIG, 0x00000063);
etna_set_state(stream, VIVS_SE_DEPTH_SCALE, 0x00000000);
etna_set_state(stream, VIVS_SE_DEPTH_BIAS, 0x00000000);
etna_set_state(stream, VIVS_FE_VERTEX_ELEMENT_CONFIG(0), 0x10000008);
etna_set_state(stream, VIVS_FE_VERTEX_ELEMENT_CONFIG(1), 0x20100088);
etna_set_state(stream, VIVS_VS_INPUT(0), 0x00000100);
etna_set_state_reloc(stream, VIVS_NFE_VERTEX_STREAMS_BASE_ADDR(0), &at->stream_base);
etna_set_state(stream, VIVS_NFE_VERTEX_STREAMS_CONTROL(0), 0x00000020);
etna_set_state(stream, VIVS_NFE_VERTEX_STREAMS_UNK14680(0), 0x00000000);
etna_set_state(stream, VIVS_FE_GENERIC_ATTRIB_SCALE(0), 0x3f800000);
etna_set_state(stream, VIVS_FE_GENERIC_ATTRIB_SCALE(1), 0x3f800000);
// How to emit 0 address?
//etna_set_state_reloc(stream, VIVS_FE_INDEX_STREAM_BASE_ADDR, 0x00000000);
etna_set_state(stream, VIVS_FE_INDEX_STREAM_CONTROL, 0x00000000);
etna_set_state(stream, VIVS_FE_PRIMITIVE_RESTART_INDEX, 0x00000000);
etna_set_state_fixp(stream, VIVS_PA_VIEWPORT_SCALE_X, 0x02800000);
etna_set_state_fixp(stream, VIVS_PA_VIEWPORT_SCALE_Y, 0xfe700000);
etna_set_state_fixp(stream, VIVS_PA_VIEWPORT_OFFSET_X, 0x02800000);
etna_set_state_fixp(stream, VIVS_PA_VIEWPORT_OFFSET_Y, 0x01900000);
etna_set_state(stream, VIVS_PA_VIEWPORT_UNK00A80, 0x38a01404);
etna_set_state_fixp(stream, VIVS_PA_VIEWPORT_UNK00A84, 0x20000000);
etna_set_state(stream, VIVS_PA_ZFARCLIPPING, 0x00000000);
etna_set_state_fixp(stream, VIVS_SE_SCISSOR_LEFT, 0x00000000);
etna_set_state_fixp(stream, VIVS_SE_SCISSOR_TOP, 0x00000000);
etna_set_state_fixp(stream, VIVS_SE_SCISSOR_RIGHT, 0x05001119);
etna_set_state_fixp(stream, VIVS_SE_SCISSOR_BOTTOM, 0x03201111);
etna_set_state_fixp(stream, VIVS_SE_CLIP_RIGHT, 0x0500ffff);
etna_set_state_fixp(stream, VIVS_SE_CLIP_BOTTOM, 0x0320ffff);
etna_set_state(stream, VIVS_PE_ALPHA_OP, 0x00000070);
etna_set_state(stream, VIVS_PE_ALPHA_BLEND_COLOR, 0x00000000);
etna_set_state(stream, VIVS_PE_ALPHA_CONFIG, 0x00100010);
etna_set_state(stream, VIVS_PE_ALPHA_COLOR_EXT0, 0x00000000);
etna_set_state(stream, VIVS_PE_ALPHA_COLOR_EXT1, 0x00000000);
etna_set_state(stream, VIVS_PE_STENCIL_CONFIG_EXT, 0x0000fdff);
etna_set_state(stream, VIVS_PE_LOGIC_OP, 0xfffffbff);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000002);
etna_set_state(stream, VIVS_PE_COLOR_FORMAT, 0x06110f10);
etna_set_state(stream, VIVS_PE_DITHER(0), 0x6e4ca280);
etna_set_state(stream, VIVS_PE_DITHER(1), 0x5d7f91b3);
etna_set_state_reloc(stream, VIVS_PE_PIPE_COLOR_ADDR(0), &at->color_surface_base);
etna_set_state_reloc(stream, VIVS_PE_PIPE_COLOR_ADDR(1), &at->color_surface_base);
etna_set_state(stream, VIVS_PE_COLOR_STRIDE, 0x00001400);
etna_set_state(stream, VIVS_PE_LOGIC_OP, 0xfffffe7f);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000001);
etna_set_state(stream, VIVS_PE_DEPTH_CONFIG, 0x05050710);
etna_set_state(stream, VIVS_PE_DEPTH_NEAR, 0x00000000);
etna_set_state(stream, VIVS_PE_DEPTH_FAR, 0x3f800000);
etna_set_state(stream, VIVS_PE_DEPTH_NORMALIZE, 0x4b7fffff);
etna_set_state_reloc(stream, VIVS_PE_PIPE_DEPTH_ADDR(0), &at->depth_surface_base);
etna_set_state_reloc(stream, VIVS_PE_PIPE_DEPTH_ADDR(1), &at->depth_surface_base);
etna_set_state(stream, VIVS_PE_LOGIC_OP, 0xfffffe7f);
etna_set_state(stream, VIVS_PE_DEPTH_STRIDE, 0x00001400);
etna_set_state(stream, VIVS_PE_LOGIC_OP, 0xff4fffff);
etna_set_state(stream, VIVS_RA_EARLY_DEPTH, 0x00000031);
etna_set_state(stream, VIVS_PE_HDEPTH_CONTROL, 0x00000000);
etna_set_state(stream, VIVS_RA_HDEPTH_CONTROL, 0x00007000);
etna_set_state(stream, VIVS_PA_VIEWPORT_SCALE_Z, 0x3f000000);
etna_set_state(stream, VIVS_PA_VIEWPORT_OFFSET_Z, 0x3f000000);
etna_set_state(stream, VIVS_PE_STENCIL_OP, 0x00070007);
etna_set_state(stream, VIVS_PE_STENCIL_CONFIG, 0x00000000);
etna_set_state(stream, VIVS_PE_STENCIL_CONFIG_EXT, 0xfffffe00);
etna_set_state(stream, VIVS_PE_STENCIL_CONFIG_EXT2, 0x00000000);
etna_set_state(stream, VIVS_GL_MULTI_SAMPLE_CONFIG, 0x00000000);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_stall(stream, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE);
etna_set_state(stream, VIVS_PE_LOGIC_OP, 0xf0ffffff);
etna_set_state(stream, VIVS_PA_LINE_WIDTH, 0x3f000000);
etna_set_state(stream, VIVS_PA_CONFIG, 0x00412100);
etna_set_state(stream, VIVS_PA_WIDE_LINE_WIDTH0, 0x3f000000);
etna_set_state(stream, VIVS_PA_WIDE_LINE_WIDTH1, 0x3f000000);
etna_stall(stream, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE);
etna_set_state(stream, VIVS_VS_INPUT_COUNT, 0x00000102);
etna_set_state(stream, VIVS_VS_TEMP_REGISTER_CONTROL, 0x00000002);
etna_set_state(stream, VIVS_VS_OUTPUT(0), 0x00000100);
etna_set_state(stream, VIVS_VS_UNIFORM_CACHE, 0x00000000);
etna_set_state(stream, VIVS_VS_RANGE, 0x00000000);
etna_set_state(stream, VIVS_VS_ICACHE_CONTROL, 0x00000010);
//etna_set_state(stream, VIVS_VS_INST_ADDR, 0x00000000);
etna_set_state(stream, VIVS_VS_UNIFORM_BASE, 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM(0), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM(1), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM(2), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM(3), 0x00000000);
etna_set_state(stream, VIVS_RA_CONTROL, 0x00000001);
etna_set_state(stream, VIVS_PS_OUTPUT_REG, 0x00000001);
etna_set_state(stream, VIVS_PS_TEMP_REGISTER_CONTROL, 0x00000002);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(0), 0x00000200);
etna_set_state(stream, VIVS_GL_VARYING_NUM_COMPONENTS, 0x00000004);
etna_set_state(stream, VIVS_GL_UNK03834, 0x00000000);
etna_set_state(stream, VIVS_GL_VARYING_COMPONENT_USE(0), 0x00000000);
etna_set_state(stream, VIVS_GL_VARYING_COMPONENT_USE(1), 0x00000000);
etna_set_state(stream, VIVS_GL_UNK03838, 0x00000000);
etna_set_state(stream, VIVS_GL_UNK03854, 0x00000000);
etna_set_state(stream, VIVS_VS_UNIFORM_CACHE, 0x00000011);
etna_set_state(stream, VIVS_PS_RANGE, 0x01ff01ff);
etna_set_state(stream, VIVS_VS_ICACHE_CONTROL, 0x00000020);
//etna_set_state(stream, VIVS_PS_INST_ADDR, 0x00000000);
etna_set_state(stream, VIVS_PS_UNIFORM_BASE, 0x0000013f);
etna_set_state(stream, VIVS_SH_INST_MEM_MIRROR(2044), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM_MIRROR(2045), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM_MIRROR(2046), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM_MIRROR(2047), 0x00000000);
etna_set_state(stream, VIVS_PS_INPUT_COUNT, 0x00001f02);
etna_set_state(stream, VIVS_PS_TEMP_REGISTER_CONTROL, 0x00000002);
etna_set_state(stream, VIVS_PS_CONTROL, 0x00000002);
etna_set_state(stream, VIVS_PA_ATTRIBUTE_ELEMENT_COUNT, 0x00000100);
etna_set_state(stream, VIVS_GL_VARYING_TOTAL_COMPONENTS, 0x00000004);
etna_set_state(stream, VIVS_PS_CONTROL_EXT, 0x00000000);
etna_set_state(stream, VIVS_VS_LOAD_BALANCING, 0x0f3f022a);
etna_set_state(stream, VIVS_VS_OUTPUT_COUNT, 0x00000002);
etna_stall(stream, SYNC_RECIPIENT_RA, SYNC_RECIPIENT_PE);
etna_set_state(stream, VIVS_GL_VERTEX_ELEMENT_CONFIG, 0x00000011);
/* command DRAW_INSTANCED (12) OP=DRAW_INSTANCED,INDEXED=0,TYPE=TRIANGLE_STRIP,INSTANCE_COUNT_LO=0x1 */
/* command COUNT INSTANCE_COUNT_HI=0x0,VERTEX_COUNT=0x3 */
/* command START INDEX=0x0 */
/* command PAD */
etna_cmd_stream_reserve(stream, 4);
etna_cmd_stream_emit(stream, 0x60050001);
etna_cmd_stream_emit(stream, 0x00000003);
etna_cmd_stream_emit(stream, 0x00000000);
etna_cmd_stream_emit(stream, 0x00000000);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000020);
etna_stall(stream, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_TS_FLUSH_CACHE, 0x00000001);
etna_set_state(stream, VIVS_TS_FLUSH_CACHE, 0x00000001);
etna_stall(stream, SYNC_RECIPIENT_RA, SYNC_RECIPIENT_PE);
etna_set_state_reloc(stream, VIVS_TS_COLOR_STATUS_BASE, &at->color_status_base);
etna_set_state_reloc(stream, VIVS_TS_COLOR_SURFACE_BASE, &at->color_surface_base);
etna_set_state(stream, VIVS_TS_COLOR_CLEAR_VALUE, 0xff808080);
etna_set_state(stream, VIVS_TS_COLOR_CLEAR_VALUE_EXT, 0xff808080);
etna_set_state(stream, VIVS_RS_EXTRA_CONFIG, 0x10000000);
etna_set_state(stream, VIVS_RS_SOURCE_STRIDE, 0x80005000);
etna_set_state(stream, VIVS_RS_KICKER_INPLACE, 0x00010400);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000002);
etna_set_state(stream, VIVS_DUMMY_DUMMY, 0x00000000);
etna_set_state(stream, VIVS_TS_MEM_CONFIG, 0x00000041);
}
/* flush cmdbuf from blob */
static void build_flush_cmdbuf(struct etna_cmd_stream *stream, struct attachments *at)
{
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_TS_FLUSH_CACHE, 0x00000001);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000001);
etna_set_state(stream, VIVS_DUMMY_DUMMY, 0x00000000);
etna_set_state(stream, VIVS_TS_MEM_CONFIG, 0x00000000);
}
/* render frame from etnaviv */
static void build_etna_cmdbuf(struct etna_cmd_stream *stream, struct attachments *at)
{
etna_set_state(stream, VIVS_GL_API_MODE, 0x00000000);
etna_set_state(stream, VIVS_GL_VERTEX_ELEMENT_CONFIG, 0x00000001);
etna_set_state(stream, VIVS_RA_EARLY_DEPTH, 0x00000031);
etna_set_state(stream, VIVS_PA_W_CLIP_LIMIT, 0x34000001);
etna_set_state(stream, VIVS_PA_FLAGS, 0x00000000);
etna_set_state(stream, VIVS_RS_SINGLE_BUFFER, 0x00000001);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_GL_SEMAPHORE_TOKEN, 0x00000705);
etna_set_state(stream, VIVS_GL_STALL_TOKEN, 0x00000705);
etna_set_state(stream, VIVS_TS_FLUSH_CACHE, 0x00000001);
etna_set_state(stream, VIVS_RS_CONFIG, 0x00004606);
etna_set_state(stream, VIVS_RS_SOURCE_STRIDE, 0x00000000);
etna_set_state(stream, VIVS_RS_DEST_STRIDE, 0x00000100);
etna_set_state_reloc(stream, VIVS_RS_PIPE_DEST_ADDR(0), &at->color_status_base);
etna_set_state(stream, VIVS_RS_PIPE_OFFSET(0), 0x00000000);
etna_set_state(stream, VIVS_RS_PIPE_OFFSET(1), 0x00000000);
etna_set_state(stream, VIVS_RS_WINDOW_SIZE, 0x01080010);
etna_set_state(stream, VIVS_RS_DITHER(0), 0xffffffff);
etna_set_state(stream, VIVS_RS_DITHER(1), 0xffffffff);
etna_set_state(stream, VIVS_RS_CLEAR_CONTROL, 0x0001ffff);
etna_set_state(stream, VIVS_RS_FILL_VALUE(0), 0x55555555);
etna_set_state(stream, VIVS_RS_FILL_VALUE(1), 0x00000000);
etna_set_state(stream, VIVS_RS_FILL_VALUE(2), 0x00000000);
etna_set_state(stream, VIVS_RS_FILL_VALUE(3), 0x00000000);
etna_set_state(stream, VIVS_RS_EXTRA_CONFIG, 0x00000000);
etna_set_state(stream, VIVS_RS_KICKER, 0xbeebbeeb);
etna_set_state(stream, VIVS_GL_SEMAPHORE_TOKEN, 0x00000705);
etna_set_state(stream, VIVS_GL_STALL_TOKEN, 0x00000705);
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000007);
etna_set_state(stream, VIVS_GL_SEMAPHORE_TOKEN, 0x00000705);
etna_set_state(stream, VIVS_GL_STALL_TOKEN, 0x00000705);
etna_set_state(stream, VIVS_FE_VERTEX_ELEMENT_CONFIG(0), 0x10000008);
etna_set_state(stream, VIVS_FE_VERTEX_ELEMENT_CONFIG(1), 0x20100088);
etna_set_state(stream, VIVS_GL_MULTI_SAMPLE_CONFIG, 0x000000f0);
etna_set_state(stream, VIVS_FE_INDEX_STREAM_CONTROL, 0x00000000);
etna_set_state_reloc(stream, VIVS_FE_VERTEX_STREAM_BASE_ADDR, &at->stream_base);
etna_set_state(stream, VIVS_FE_VERTEX_STREAM_CONTROL, 0x00000020);
etna_set_state(stream, VIVS_FE_PRIMITIVE_RESTART_INDEX, 0x00000000);
etna_set_state(stream, VIVS_VS_END_PC, 0x00000001);
etna_set_state(stream, VIVS_VS_OUTPUT_COUNT, 0x00000002);
etna_set_state(stream, VIVS_VS_INPUT_COUNT, 0x00000102);
etna_set_state(stream, VIVS_VS_TEMP_REGISTER_CONTROL, 0x00000002);
etna_set_state(stream, VIVS_VS_OUTPUT(0), 0x00000100);
etna_set_state(stream, VIVS_VS_OUTPUT(1), 0x00000000);
etna_set_state(stream, VIVS_VS_OUTPUT(2), 0x00000000);
etna_set_state(stream, VIVS_VS_OUTPUT(3), 0x00000000);
etna_set_state(stream, VIVS_VS_INPUT(0), 0x00000100);
etna_set_state(stream, VIVS_VS_INPUT(1), 0x00000000);
etna_set_state(stream, VIVS_VS_INPUT(2), 0x00000000);
etna_set_state(stream, VIVS_VS_INPUT(3), 0x00000000);
etna_set_state(stream, VIVS_VS_LOAD_BALANCING, 0x0f3f0221);
etna_set_state(stream, VIVS_VS_START_PC, 0x00000000);
etna_set_state_fixp(stream, VIVS_PA_VIEWPORT_SCALE_X, 0x02800000);
etna_set_state_fixp(stream, VIVS_PA_VIEWPORT_SCALE_Y, 0xfe700000);
etna_set_state(stream, VIVS_PA_VIEWPORT_SCALE_Z, 0x3f800000);
etna_set_state_fixp(stream, VIVS_PA_VIEWPORT_OFFSET_X, 0x02800000);
etna_set_state_fixp(stream, VIVS_PA_VIEWPORT_OFFSET_Y, 0x01900000);
etna_set_state(stream, VIVS_PA_VIEWPORT_OFFSET_Z, 0x00000000);
etna_set_state(stream, VIVS_PA_LINE_WIDTH, 0x3f000000);
etna_set_state(stream, VIVS_PA_POINT_SIZE, 0x3f000000);
etna_set_state(stream, VIVS_PA_SYSTEM_MODE, 0x00000011);
etna_set_state(stream, VIVS_PA_ATTRIBUTE_ELEMENT_COUNT, 0x00000100);
etna_set_state(stream, VIVS_PA_CONFIG, 0x00412110);
etna_set_state(stream, VIVS_PA_WIDE_LINE_WIDTH0, 0x3f000000);
etna_set_state(stream, VIVS_PA_WIDE_LINE_WIDTH1, 0x3f000000);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(0), 0x000002f1);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(1), 0x00000000);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(2), 0x00000000);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(3), 0x00000000);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(4), 0x00000000);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(5), 0x00000000);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(6), 0x00000000);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(7), 0x00000000);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(8), 0x00000000);
etna_set_state(stream, VIVS_PA_SHADER_ATTRIBUTES(9), 0x00000000);
etna_set_state_fixp(stream, VIVS_SE_SCISSOR_LEFT, 0x00000000);
etna_set_state_fixp(stream, VIVS_SE_SCISSOR_TOP, 0x00000000);
etna_set_state_fixp(stream, VIVS_SE_SCISSOR_RIGHT, 0x05001119);
etna_set_state_fixp(stream, VIVS_SE_SCISSOR_BOTTOM, 0x03201111);
etna_set_state(stream, VIVS_SE_DEPTH_SCALE, 0x00000000);
etna_set_state(stream, VIVS_SE_DEPTH_BIAS, 0x00000000);
etna_set_state(stream, VIVS_SE_CONFIG, 0x00000000);
etna_set_state_fixp(stream, VIVS_SE_CLIP_RIGHT, 0x0500ffff);
etna_set_state_fixp(stream, VIVS_SE_CLIP_BOTTOM, 0x0320ffff);
etna_set_state(stream, VIVS_RA_CONTROL, 0x00000001);
etna_set_state(stream, VIVS_RA_MULTISAMPLE_UNK00E04, 0x00000000);
etna_set_state(stream, VIVS_RA_MULTISAMPLE_UNK00E10(0), 0x00000000);
etna_set_state(stream, VIVS_RA_MULTISAMPLE_UNK00E10(1), 0x00000000);
etna_set_state(stream, VIVS_RA_MULTISAMPLE_UNK00E10(2), 0x00000000);
etna_set_state(stream, VIVS_RA_MULTISAMPLE_UNK00E10(3), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(0), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(1), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(2), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(3), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(4), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(5), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(6), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(7), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(8), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(9), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(10), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(11), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(12), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(13), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(14), 0x00000000);
etna_set_state(stream, VIVS_RA_CENTROID_TABLE(15), 0x00000000);
etna_set_state(stream, VIVS_PS_END_PC, 0x00000001);
etna_set_state(stream, VIVS_PS_OUTPUT_REG, 0x00000001);
etna_set_state(stream, VIVS_PS_INPUT_COUNT, 0x00001f02);
etna_set_state(stream, VIVS_PS_TEMP_REGISTER_CONTROL, 0x00000002);
etna_set_state(stream, VIVS_PS_CONTROL, 0x00000002);
etna_set_state(stream, VIVS_PS_START_PC, 0x00000000);
etna_set_state(stream, VIVS_PE_DEPTH_CONFIG, 0x05000711);
etna_set_state(stream, VIVS_PE_DEPTH_NEAR, 0x00000000);
etna_set_state(stream, VIVS_PE_DEPTH_FAR, 0x3f800000);
etna_set_state(stream, VIVS_PE_DEPTH_NORMALIZE, 0x4b7fffff);
etna_set_state(stream, VIVS_PE_DEPTH_STRIDE, 0x00001400);
etna_set_state(stream, VIVS_PE_STENCIL_OP, 0x00000000);
etna_set_state(stream, VIVS_PE_STENCIL_CONFIG, 0x00000000);
etna_set_state(stream, VIVS_PE_ALPHA_OP, 0x00000000);
etna_set_state(stream, VIVS_PE_ALPHA_BLEND_COLOR, 0x00000000);
etna_set_state(stream, VIVS_PE_ALPHA_CONFIG, 0x00000000);
etna_set_state(stream, VIVS_PE_COLOR_FORMAT, 0x00110f05);
etna_set_state(stream, VIVS_PE_COLOR_STRIDE, 0x00001400);
etna_set_state(stream, VIVS_PE_HDEPTH_CONTROL, 0x00000000);
etna_set_state_reloc(stream, VIVS_PE_PIPE_COLOR_ADDR(0), &at->color_surface_base);
etna_set_state_reloc(stream, VIVS_PE_PIPE_COLOR_ADDR(1), &at->color_surface_base);
etna_set_state_reloc(stream, VIVS_PE_PIPE_DEPTH_ADDR(0), &at->depth_surface_base);
etna_set_state_reloc(stream, VIVS_PE_PIPE_DEPTH_ADDR(1), &at->depth_surface_base);
etna_set_state(stream, VIVS_PE_STENCIL_CONFIG_EXT, 0x00000000);
etna_set_state(stream, VIVS_PE_LOGIC_OP, 0x000e420c);
etna_set_state(stream, VIVS_PE_DITHER(0), 0x6e4ca280);
etna_set_state(stream, VIVS_PE_DITHER(1), 0x5d7f91b3);
etna_set_state(stream, VIVS_TS_MEM_CONFIG, 0x00000003);
etna_set_state_reloc(stream, VIVS_TS_COLOR_STATUS_BASE, &at->color_status_base);
etna_set_state_reloc(stream, VIVS_TS_COLOR_SURFACE_BASE, &at->color_surface_base);
etna_set_state(stream, VIVS_TS_COLOR_CLEAR_VALUE, 0xff808080);
etna_set_state_reloc(stream, VIVS_TS_DEPTH_STATUS_BASE, &at->depth_status_base);
etna_set_state_reloc(stream, VIVS_TS_DEPTH_SURFACE_BASE, &at->depth_surface_base);
etna_set_state(stream, VIVS_TS_DEPTH_CLEAR_VALUE, 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(0), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(1), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(2), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(3), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(4), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(5), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(6), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(7), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(8), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(9), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(10), 0x00000000);
etna_set_state(stream, VIVS_TE_SAMPLER_CONFIG0(11), 0x00000000);
etna_set_state(stream, VIVS_GL_VARYING_TOTAL_COMPONENTS, 0x00000004);
etna_set_state(stream, VIVS_GL_VARYING_NUM_COMPONENTS, 0x00000004);
etna_set_state(stream, VIVS_GL_VARYING_COMPONENT_USE(0), 0x00000000);
etna_set_state(stream, VIVS_GL_VARYING_COMPONENT_USE(1), 0x00000000);
etna_set_state(stream, VIVS_GL_SEMAPHORE_TOKEN, 0x00000701);
etna_cmd_stream_emit(stream, 0x48000000); /* command STALL (9) OP=STALL */
etna_cmd_stream_emit(stream, 0x00000701); /* command TOKEN FROM=FE,TO=PE */
etna_set_state(stream, VIVS_VS_ICACHE_CONTROL, 0x00000030);
etna_set_state(stream, VIVS_VS_RANGE, 0x00000000);
etna_set_state(stream, VIVS_PS_RANGE, 0x01000100);
etna_set_state(stream, VIVS_SH_INST_MEM(0), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM(1), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM(2), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM(3), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM_MIRROR(1024), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM_MIRROR(1025), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM_MIRROR(1026), 0x00000000);
etna_set_state(stream, VIVS_SH_INST_MEM_MIRROR(1027), 0x00000000);
etna_set_state(stream, VIVS_VS_UNIFORM_BASE, 0x00000000);
etna_set_state(stream, VIVS_PS_UNIFORM_BASE, 0x000000a8);
etna_set_state(stream, VIVS_VS_UNIFORM_CACHE, 0x00000001);
etna_set_state(stream, VIVS_VS_UNIFORM_CACHE, 0x00000011);
etna_cmd_stream_emit(stream, 0x28000000); /* command DRAW_PRIMITIVES (5) OP=DRAW_PRIMITIVES */
etna_cmd_stream_emit(stream, 0x00000005); /* command COMMAND TYPE=TRIANGLE_STRIP */
etna_cmd_stream_emit(stream, 0x00000000); /* command START 0x0 */
etna_cmd_stream_emit(stream, 0x00000001); /* command COUNT 0x1 */
etna_set_state(stream, VIVS_GL_FLUSH_CACHE, 0x00000003);
etna_set_state(stream, VIVS_GL_SEMAPHORE_TOKEN, 0x00000705);
etna_set_state(stream, VIVS_GL_STALL_TOKEN, 0x00000705);
etna_set_state(stream, VIVS_TS_FLUSH_CACHE, 0x00000001);
etna_set_state(stream, VIVS_TS_MEM_CONFIG, 0x00000002);
etna_set_state_reloc(stream, VIVS_TS_COLOR_STATUS_BASE, &at->color_status_base);
etna_set_state_reloc(stream, VIVS_TS_COLOR_SURFACE_BASE, &at->color_surface_base);
etna_set_state(stream, VIVS_TS_COLOR_CLEAR_VALUE, 0xff808080);
etna_set_state(stream, VIVS_RS_CONFIG, 0x00000686);
etna_set_state(stream, VIVS_RS_SOURCE_STRIDE, 0x80005000);
etna_set_state(stream, VIVS_RS_DEST_STRIDE, 0x00001400);
etna_set_state_reloc(stream, VIVS_RS_PIPE_SOURCE_ADDR(0), &at->color_surface_base);
etna_set_state_reloc(stream, VIVS_RS_PIPE_DEST_ADDR(0), &at->color_surface_base);
etna_set_state(stream, VIVS_RS_PIPE_OFFSET(0), 0x00000000);
etna_set_state(stream, VIVS_RS_PIPE_OFFSET(1), 0x00000000);
etna_set_state(stream, VIVS_RS_WINDOW_SIZE, 0x03200500);
etna_set_state(stream, VIVS_RS_DITHER(0), 0xffffffff);
etna_set_state(stream, VIVS_RS_DITHER(1), 0xffffffff);
etna_set_state(stream, VIVS_RS_CLEAR_CONTROL, 0x00000000);
etna_set_state(stream, VIVS_RS_FILL_VALUE(0), 0x00000000);
etna_set_state(stream, VIVS_RS_FILL_VALUE(1), 0x00000000);
etna_set_state(stream, VIVS_RS_FILL_VALUE(2), 0x00000000);
etna_set_state(stream, VIVS_RS_FILL_VALUE(3), 0x00000000);
etna_set_state(stream, VIVS_RS_EXTRA_CONFIG, 0x00000000);
etna_set_state(stream, VIVS_RS_KICKER, 0xbeebbeeb);
}
static void process_output(struct attachments *at)
{
void *mapped = etna_bo_map(at->color_surface);
printf("* Writing output\n");
/** Write to disk or something */
int fd = open("triangle_out.dat", O_RDWR|O_CREAT|O_TRUNC, 0644);
if(fd >= 0) {
write(fd, mapped, color_surface_size);
close(fd);
} else {
fprintf(stderr, "Unable to write output\n");
}
}
int main(int argc, char *argv[])
{
struct drm_test_info *info;
if ((info = drm_test_setup(argc, argv)) == NULL) {
return 1;
}
enum hardware_type hwt = drm_cl_get_hardware_type(info);
if (hwt != HWT_GC3000) {
fprintf(stderr, "This test only runs on GC3000\n");
goto out;
}
struct attachments at = {};
if (!initialize_attachments(info->dev, &at)) {
fprintf(stderr, "Failed to initialize attachments\n");
goto out;
}
#if 1 /* use command buffer from blob */
build_frame_cmdbuf(info->stream, &at);
printf("* Rendering\n");
etna_cmd_stream_finish(info->stream);
build_flush_cmdbuf(info->stream, &at);
printf("* Flushing\n");
etna_cmd_stream_finish(info->stream);
#else
build_etna_cmdbuf(info->stream, &at);
printf("* Etna rendering\n");
etna_cmd_stream_finish(info->stream);
#endif
process_output(&at);
free_attachments(info->dev, &at);
drm_test_teardown(info);
return 0;
out:
drm_test_teardown(info);
return 1;
}