nkeynes@213: /** nkeynes@213: * $Id: testrend.c,v 1.1 2006-08-18 09:33:19 nkeynes Exp $ nkeynes@213: * nkeynes@213: * Renderer test cases nkeynes@213: * nkeynes@213: * Copyright (c) 2006 Nathan Keynes. nkeynes@213: * nkeynes@213: * This program is free software; you can redistribute it and/or modify nkeynes@213: * it under the terms of the GNU General Public License as published by nkeynes@213: * the Free Software Foundation; either version 2 of the License, or nkeynes@213: * (at your option) any later version. nkeynes@213: * nkeynes@213: * This program is distributed in the hope that it will be useful, nkeynes@213: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@213: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@213: * GNU General Public License for more details. nkeynes@213: */ nkeynes@213: #include nkeynes@213: #include "testdata.h" nkeynes@213: #include "pvr.h" nkeynes@213: #include "lib.h" nkeynes@213: #include "asic.h" nkeynes@213: nkeynes@213: #define OBJ_START 0x00010000 nkeynes@213: #define OBJ_LENGTH 0x00010000 nkeynes@213: #define TILE_START 0x00060000 nkeynes@213: #define TILE_LENGTH 0x00010000 nkeynes@213: #define TILEMAP_ADDR 0x050B2C8 nkeynes@213: #define RENDER_ADDR 0x00600000 nkeynes@213: nkeynes@213: struct ta_config default_ta_config = { 0x00111111, GRID_SIZE(640,480), OBJ_START, nkeynes@213: OBJ_START+OBJ_LENGTH, TILE_START+TILE_LENGTH, nkeynes@213: TILE_START, TILE_START+TILE_LENGTH }; nkeynes@213: nkeynes@213: struct render_config default_render_config = { TILEMAP_ADDR, RENDER_ADDR, 640, 480, nkeynes@213: 0x00000009, 0.2, 1.0 }; nkeynes@213: nkeynes@213: int test_render( test_data_t test_case ) nkeynes@213: { nkeynes@213: int i; nkeynes@213: nkeynes@213: /* Check input */ nkeynes@213: test_data_block_t input = get_test_data(test_case, "input"); nkeynes@213: test_data_block_t event = get_test_data(test_case, "event"); nkeynes@213: test_data_block_t backplane = get_test_data(test_case, "backplane"); nkeynes@213: if( input == NULL ) { nkeynes@213: fprintf( stderr, "Skipping test '%s' - no input\n", test_case->test_name ); nkeynes@213: return -1; nkeynes@213: } nkeynes@213: if( event == NULL ) { nkeynes@213: fprintf( stderr, "Skipping test '%s' - no event list\n", test_case->test_name ); nkeynes@213: } nkeynes@213: nkeynes@213: test_data_block_t config_data = get_test_data( test_case, "config" ); nkeynes@213: struct ta_config *config = &default_ta_config; nkeynes@213: if( config_data != NULL ) { nkeynes@213: if( config_data->length != sizeof(struct ta_config) ) { nkeynes@213: fprintf( stderr, "Invalid config data length %d - aborting test %s\n", nkeynes@213: config_data->length, test_case->test_name ); nkeynes@213: return -1; nkeynes@213: } nkeynes@213: config = (struct ta_config *)config_data->data; nkeynes@213: } nkeynes@213: nkeynes@213: /* Send TA data */ nkeynes@213: asic_clear(); nkeynes@213: pvr_init(); nkeynes@213: ta_init(config); nkeynes@213: default_render_config.polybuf = config->obj_start & 0x00F00000; nkeynes@213: if( pvr_dma_write( 0x10000000, input->data, input->length, 0 ) == -1 ) { nkeynes@213: return -1; nkeynes@213: } nkeynes@213: nkeynes@213: /* Wait for events */ nkeynes@213: for( i=0; ilength; i++ ) { nkeynes@213: if( asic_wait( event->data[i] ) == -1 ) { nkeynes@213: fprintf( stderr, "Test %s: failed (Timeout waiting for event %d)\n", nkeynes@213: test_case->test_name, event->data[i] ); nkeynes@213: asic_dump( stderr ); nkeynes@213: return -1; nkeynes@213: } nkeynes@213: } nkeynes@213: nkeynes@213: /* Write backplane (if any) */ nkeynes@213: if( backplane != NULL ) { nkeynes@213: uint32_t bgplane = pvr_get_objbuf_posn(); nkeynes@213: memcpy( (char *)(PVR_VRAM_BASE + bgplane), backplane->data, backplane->length ); nkeynes@213: bgplane -= default_render_config.polybuf; nkeynes@213: render_set_backplane( (bgplane << 1) | 0x01000000 ); nkeynes@213: } else { nkeynes@213: render_set_backplane( 0 ); nkeynes@213: } nkeynes@213: /* Setup the tilemap */ nkeynes@213: pvr_build_tilemap1( TILEMAP_ADDR, config, 0x20000000 ); nkeynes@213: render_start( &default_render_config ); nkeynes@213: if( asic_wait( EVENT_PVR_RENDER_DONE ) == -1 ) { nkeynes@213: fprintf( stderr, "Test %s: failed (timeout waiting for render)\n", nkeynes@213: test_case->test_name ); nkeynes@213: asic_dump( stderr ); nkeynes@213: return -1; nkeynes@213: } nkeynes@213: asic_wait( EVENT_RETRACE ); nkeynes@213: display_render( &default_render_config ); nkeynes@213: return 0; nkeynes@213: nkeynes@213: } nkeynes@213: nkeynes@213: int main( int argc, char *argv[] ) nkeynes@213: { nkeynes@213: int test_cases = 0; nkeynes@213: int test_failures = 0; nkeynes@213: test_data_t test_data = load_test_dataset(stdin); nkeynes@213: test_data_t test_case = test_data; nkeynes@213: nkeynes@213: asic_mask_all(); nkeynes@213: pvr_init(); nkeynes@213: nkeynes@213: while( test_case != NULL ) { nkeynes@213: test_cases++; nkeynes@213: int result = test_render(test_case); nkeynes@213: if( result != 0 ) { nkeynes@213: test_failures++; nkeynes@213: } nkeynes@213: test_case = test_case->next; nkeynes@213: } nkeynes@213: free_test_dataset(test_data); nkeynes@213: if( test_failures != 0 ) { nkeynes@213: fprintf( stderr, "%d/%d test failures!\n", test_failures, test_cases ); nkeynes@213: return 1; nkeynes@213: } else { nkeynes@213: fprintf( stderr, "%d tests OK\n", test_cases ); nkeynes@213: return 0; nkeynes@213: } nkeynes@213: }