Search
lxdream.org :: lxdream/test/testrend.c
lxdream 0.9.1
released Jun 29
Download Now
filename test/testrend.c
changeset 561:533f6b478071
prev346:9b495cc4db65
author nkeynes
date Tue Jan 01 05:08:38 2008 +0000 (12 years ago)
branchlxdream-mmu
permissions -rw-r--r--
last change Enable Id keyword on all source files
view annotate diff log raw
     1 /**
     2  * $Id$
     3  * 
     4  * Renderer test cases
     5  *
     6  * Copyright (c) 2006 Nathan Keynes.
     7  *
     8  * This program is free software; you can redistribute it and/or modify
     9  * it under the terms of the GNU General Public License as published by
    10  * the Free Software Foundation; either version 2 of the License, or
    11  * (at your option) any later version.
    12  *
    13  * This program is distributed in the hope that it will be useful,
    14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    16  * GNU General Public License for more details.
    17  */
    18 #include <stdio.h>
    19 #include "testdata.h"
    20 #include "pvr.h"
    21 #include "lib.h"
    22 #include "asic.h"
    24 #define OBJ_START 0x00010000
    25 #define OBJ_LENGTH 0x00010000
    26 #define TILE_START 0x00060000
    27 #define TILE_LENGTH 0x00010000
    28 #define TILEMAP_ADDR 0x050B2C8
    29 #define RENDER_ADDR 0x00600000
    31 struct ta_config default_ta_config = { 0x00111111, GRID_SIZE(640,480), OBJ_START,
    32 				       OBJ_START+OBJ_LENGTH, TILE_START+TILE_LENGTH,
    33 				       TILE_START, TILE_START+TILE_LENGTH };
    35 struct render_config default_render_config = { OBJ_START, TILEMAP_ADDR, RENDER_ADDR, 640, 480, 
    36 					       0x00000009, 0.2, 1.0 };
    38 int test_render( test_data_t test_case )
    39 {
    40     int i;
    42     /* Check input */
    43     test_data_block_t input = get_test_data(test_case, "input");
    44     test_data_block_t event = get_test_data(test_case, "event");
    45     test_data_block_t backplane = get_test_data(test_case, "backplane");
    46     if( input == NULL ) {
    47 	fprintf( stderr, "Skipping test '%s' - no input\n", test_case->test_name );
    48 	return -1;
    49     }
    50     if( event == NULL ) {
    51 	fprintf( stderr, "Skipping test '%s' - no event list\n", test_case->test_name );
    52     }
    54     test_data_block_t tex = get_test_data(test_case, "textures");
    55     if( tex != NULL ) {
    56 	uint32_t addr = 0xA4000000 + *(uint32_t *)tex->data;
    58 	memcpy( (char *)addr, tex->data+4, tex->length-4 );
    59 	fprintf( stderr, "Loaded %d bytes to %08X\n", tex->length-4, addr );
    60     }
    62     test_data_block_t config_data = get_test_data( test_case, "config" );
    63     struct ta_config *config = &default_ta_config;
    64     if( config_data != NULL ) {
    65 	if( config_data->length != sizeof(struct ta_config) ) {
    66 	    fprintf( stderr, "Invalid config data length %d - aborting test %s\n",
    67 		     config_data->length, test_case->test_name );
    68 	    return -1;
    69 	}
    70 	config = (struct ta_config *)config_data->data;
    71     }
    73     /* Send TA data */
    74     asic_clear();
    75     pvr_init();
    76     ta_init(config);
    77     default_render_config.polybuf = config->obj_start & 0x00F00000;
    78     if( pvr_dma_write( 0x10000000, input->data, input->length, 0 ) == -1 ) {
    79 	return -1;
    80     }
    82     /* Wait for events */
    83     for( i=0; i<event->length; i++ ) {
    84 	if( asic_wait( event->data[i] ) == -1 ) {
    85 	    fprintf( stderr, "Test %s: failed (Timeout waiting for event %d)\n",
    86 		     test_case->test_name, event->data[i] );
    87 	    asic_dump( stderr );
    88 	    return -1;
    89 	}
    90     }
    92     /* Write backplane (if any) */
    93     if( backplane != NULL ) {
    94 	uint32_t bgplane = pvr_get_objbuf_posn();
    95 	memcpy( (char *)(PVR_VRAM_BASE + bgplane), backplane->data+4, backplane->length-4 );
    96 	bgplane -= default_render_config.polybuf;
    97 	render_set_backplane( (bgplane << 1) | *(uint32_t *)backplane->data );
    98     } else {
    99 	render_set_backplane( 0 );
   100     }
   101     /* Setup the tilemap */
   102     pvr_build_tilemap1( TILEMAP_ADDR, config, 0x20000000 );
   103     render_start( &default_render_config );
   104     if( asic_wait( EVENT_PVR_RENDER_DONE ) == -1 ) {
   105 	fprintf( stderr, "Test %s: failed (timeout waiting for render)\n",
   106 		 test_case->test_name );
   107 	asic_dump( stderr );
   108 	return -1;
   109     }
   110     asic_wait( EVENT_RETRACE );
   111     display_render( &default_render_config );
   112     return 0;
   114 }
   116 int main( int argc, char *argv[] ) 
   117 {
   118     int test_cases = 0;
   119     int test_failures = 0;
   120     test_data_t test_data = load_test_dataset(stdin);
   121     test_data_t test_case = test_data;
   123     asic_mask_all();
   124     pvr_init();
   126     while( test_case != NULL ) {
   127 	test_cases++;
   128 	int result = test_render(test_case);
   129 	if( result != 0 ) {
   130 	    test_failures++;
   131 	}
   132 	test_case = test_case->next;
   133     }
   135     asic_clear();
   136     asic_wait(EVENT_RETRACE);
   137     asic_clear();
   138     asic_wait(EVENT_RETRACE);
   140     free_test_dataset(test_data);
   141     if( test_failures != 0 ) {
   142 	fprintf( stderr, "%d/%d test failures!\n", test_failures, test_cases );
   143 	return 1;
   144     } else {
   145 	fprintf( stderr, "%d tests OK\n", test_cases );
   146 	return 0;
   147     }
   149 }
.