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 Wed Nov 10 08:37:42 2010 +1000 (13 years ago)
permissions -rw-r--r--
last change Add chain pointer to the xlat cache, so that we can maintain multiple blocks
for the same address. This prevents thrashing in cases where we would other
keep retranslating the same blocks over and over again due to varying
xlat_sh4_mode values
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 }
.