filename | test/testrend.c |
changeset | 346:9b495cc4db65 |
prev | 307:a357a469f5ff |
next | 561:533f6b478071 |
author | nkeynes |
date | Tue Feb 13 08:34:27 2007 +0000 (16 years ago) |
permissions | -rw-r--r-- |
last change | Add tests for FLOAT and FTRC Comment out user-mode exception test (broken) |
view | annotate | diff | log | raw |
1 /**
2 * $Id: testrend.c,v 1.4 2007-01-31 11:02:50 nkeynes Exp $
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 }
.