/* * Copyright (c) 2012-2013 Etnaviv Project * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sub license, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* Draw 256 random lines. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "write_bmp.h" int main(int argc, char **argv) { int rv; int width = 256; int height = 256; int padded_width = etna_align_up(width, 8); int padded_height = etna_align_up(height, 1); printf("padded_width %i padded_height %i\n", padded_width, padded_height); struct viv_conn *conn = 0; rv = viv_open(VIV_HW_2D, &conn); if(rv!=0) { fprintf(stderr, "Error opening device\n"); exit(1); } printf("Succesfully opened device\n"); struct etna_bo *bmp = 0; /* bitmap */ struct etna_bo *src = 0; /* source */ size_t bmp_size = width * height * 4; size_t src_size = width * height * 4; if((bmp=etna_bo_new(conn, bmp_size, DRM_ETNA_GEM_TYPE_BMP))==NULL || (src=etna_bo_new(conn, src_size, DRM_ETNA_GEM_TYPE_BMP))==NULL) { fprintf(stderr, "Error allocating video memory\n"); exit(1); } struct etna_ctx *ctx = 0; if(etna_create(conn, &ctx) != ETNA_OK) { printf("Unable to create context\n"); exit(1); } /* switch to 2D pipe */ etna_set_pipe(ctx, ETNA_PIPE_2D); /* pre-clear surface. Could use the 2D engine for this, * but we're lazy. */ memset(etna_bo_map(src), 255, src_size); memset(etna_bo_map(bmp), 0, bmp_size); for(int frame=0; frame<1; ++frame) { printf("*** FRAME %i ****\n", frame); etna_set_state(ctx, VIVS_DE_SRC_ADDRESS, 0); etna_set_state(ctx, VIVS_DE_SRC_STRIDE, width*4); etna_set_state(ctx, VIVS_DE_SRC_ROTATION_CONFIG, 0); etna_set_state(ctx, VIVS_DE_SRC_CONFIG, VIVS_DE_SRC_CONFIG_UNK16 | VIVS_DE_SRC_CONFIG_SOURCE_FORMAT(DE_FORMAT_MONOCHROME) | VIVS_DE_SRC_CONFIG_LOCATION_MEMORY | VIVS_DE_SRC_CONFIG_PACK_PACKED8 | VIVS_DE_SRC_CONFIG_PE10_SOURCE_FORMAT(DE_FORMAT_MONOCHROME)); etna_set_state(ctx, VIVS_DE_SRC_ORIGIN, 0); etna_set_state(ctx, VIVS_DE_SRC_SIZE, 0); etna_set_state(ctx, VIVS_DE_SRC_COLOR_BG, 0xff44ff44); etna_set_state(ctx, VIVS_DE_SRC_COLOR_FG, 0xff44ff44); etna_set_state(ctx, VIVS_DE_STRETCH_FACTOR_LOW, 0); etna_set_state(ctx, VIVS_DE_STRETCH_FACTOR_HIGH, 0); etna_set_state(ctx, VIVS_DE_DEST_ADDRESS, etna_bo_gpu_address(bmp)); etna_set_state(ctx, VIVS_DE_DEST_STRIDE, width*4); etna_set_state(ctx, VIVS_DE_DEST_ROTATION_CONFIG, 0); etna_set_state(ctx, VIVS_DE_DEST_CONFIG, VIVS_DE_DEST_CONFIG_FORMAT(DE_FORMAT_A8R8G8B8) | VIVS_DE_DEST_CONFIG_COMMAND_LINE | VIVS_DE_DEST_CONFIG_SWIZZLE(DE_SWIZZLE_ARGB) | VIVS_DE_DEST_CONFIG_TILED_DISABLE | VIVS_DE_DEST_CONFIG_MINOR_TILED_DISABLE ); etna_set_state(ctx, VIVS_DE_ROP, VIVS_DE_ROP_ROP_FG(0xcc) | VIVS_DE_ROP_ROP_BG(0xcc) | VIVS_DE_ROP_TYPE_ROP4); etna_set_state(ctx, VIVS_DE_CLIP_TOP_LEFT, VIVS_DE_CLIP_TOP_LEFT_X(0) | VIVS_DE_CLIP_TOP_LEFT_Y(0) ); etna_set_state(ctx, VIVS_DE_CLIP_BOTTOM_RIGHT, VIVS_DE_CLIP_BOTTOM_RIGHT_X(width) | VIVS_DE_CLIP_BOTTOM_RIGHT_Y(height) ); etna_set_state(ctx, VIVS_DE_CONFIG, 0); /* TODO */ etna_set_state(ctx, VIVS_DE_SRC_ORIGIN_FRACTION, 0); etna_set_state(ctx, VIVS_DE_ALPHA_CONTROL, 0); etna_set_state(ctx, VIVS_DE_ALPHA_MODES, 0); etna_set_state(ctx, VIVS_DE_DEST_ROTATION_HEIGHT, 0); etna_set_state(ctx, VIVS_DE_SRC_ROTATION_HEIGHT, 0); etna_set_state(ctx, VIVS_DE_ROT_ANGLE, 0); /* Clear color PE20 */ etna_set_state(ctx, VIVS_DE_CLEAR_PIXEL_VALUE32, 0xff40ff40); /* Clear color PE10 */ etna_set_state(ctx, VIVS_DE_CLEAR_BYTE_MASK, 0xff); etna_set_state(ctx, VIVS_DE_CLEAR_PIXEL_VALUE_LOW, 0xff40ff40); etna_set_state(ctx, VIVS_DE_CLEAR_PIXEL_VALUE_HIGH, 0xff40ff40); etna_set_state(ctx, VIVS_DE_DEST_COLOR_KEY, 0); etna_set_state(ctx, VIVS_DE_GLOBAL_SRC_COLOR, 0); etna_set_state(ctx, VIVS_DE_GLOBAL_DEST_COLOR, 0); etna_set_state(ctx, VIVS_DE_COLOR_MULTIPLY_MODES, 0); etna_set_state(ctx, VIVS_DE_PE_TRANSPARENCY, 0); etna_set_state(ctx, VIVS_DE_PE_CONTROL, 0); etna_set_state(ctx, VIVS_DE_PE_DITHER_LOW, 0xffffffff); etna_set_state(ctx, VIVS_DE_PE_DITHER_HIGH, 0xffffffff); #define NUM_RECTS (256) /* Queue DE command */ etna_reserve(ctx, 256*2 + 2); (ctx)->buf[(ctx)->offset++] = VIV_FE_DRAW_2D_HEADER_OP_DRAW_2D | VIV_FE_DRAW_2D_HEADER_COUNT(NUM_RECTS); (ctx)->offset++; /* rectangles start aligned */ for(int rec=0; recbuf[(ctx)->offset++] = VIV_FE_DRAW_2D_TOP_LEFT_X(x1) | VIV_FE_DRAW_2D_TOP_LEFT_Y(y1); (ctx)->buf[(ctx)->offset++] = VIV_FE_DRAW_2D_BOTTOM_RIGHT_X(x2) | VIV_FE_DRAW_2D_BOTTOM_RIGHT_Y(y2); } etna_set_state(ctx, 1, 0); etna_set_state(ctx, 1, 0); etna_set_state(ctx, 1, 0); etna_set_state(ctx, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_PE2D); etna_finish(ctx); } bmp_dump32(etna_bo_map(bmp), width, height, false, "/tmp/fb.bmp"); printf("Dump complete\n"); etna_free(ctx); viv_close(conn); return 0; }