filename | src/pvr2/rendsave.c |
changeset | 669:ab344e42bca9 |
prev | 561:533f6b478071 |
next | 677:3ee62740ff8f |
author | nkeynes |
date | Mon May 12 10:00:13 2008 +0000 (15 years ago) |
permissions | -rw-r--r-- |
last change | Cleanup most of the -Wall warnings (getting a bit sloppy...) Convert FP code to use fixed banks rather than indirect pointer (3-4% faster this way now) |
file | annotate | diff | log | raw |
nkeynes@295 | 1 | /** |
nkeynes@561 | 2 | * $Id$ |
nkeynes@295 | 3 | * |
nkeynes@295 | 4 | * Scene-save support. This is mainly for test/debug purposes. |
nkeynes@295 | 5 | * |
nkeynes@295 | 6 | * Copyright (c) 2005 Nathan Keynes. |
nkeynes@295 | 7 | * |
nkeynes@295 | 8 | * This program is free software; you can redistribute it and/or modify |
nkeynes@295 | 9 | * it under the terms of the GNU General Public License as published by |
nkeynes@295 | 10 | * the Free Software Foundation; either version 2 of the License, or |
nkeynes@295 | 11 | * (at your option) any later version. |
nkeynes@295 | 12 | * |
nkeynes@295 | 13 | * This program is distributed in the hope that it will be useful, |
nkeynes@295 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
nkeynes@295 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
nkeynes@295 | 16 | * GNU General Public License for more details. |
nkeynes@295 | 17 | */ |
nkeynes@295 | 18 | |
nkeynes@295 | 19 | #include <stdio.h> |
nkeynes@295 | 20 | #include <errno.h> |
nkeynes@295 | 21 | #include <time.h> |
nkeynes@669 | 22 | #include <string.h> |
nkeynes@295 | 23 | #include "pvr2/pvr2.h" |
nkeynes@295 | 24 | #include "dreamcast.h" |
nkeynes@295 | 25 | |
nkeynes@295 | 26 | /** |
nkeynes@295 | 27 | * Size of pages for the purposes of saving - this has nothing to do with the |
nkeynes@295 | 28 | * actual page size, of course. |
nkeynes@295 | 29 | */ |
nkeynes@295 | 30 | #define SAVE_PAGE_SIZE 1024 |
nkeynes@295 | 31 | #define SAVE_PAGE_COUNT 8192 |
nkeynes@295 | 32 | |
nkeynes@295 | 33 | extern char *video_base; |
nkeynes@295 | 34 | |
nkeynes@295 | 35 | /* Determine pages of memory to save. Start walking from the render tilemap |
nkeynes@295 | 36 | * data and build up a page list |
nkeynes@295 | 37 | */ |
nkeynes@295 | 38 | static void pvr2_find_referenced_pages( char *pages ) |
nkeynes@295 | 39 | { |
nkeynes@295 | 40 | /* Dummy implementation - save everything */ |
nkeynes@295 | 41 | memset( pages, 1, SAVE_PAGE_COUNT ); |
nkeynes@295 | 42 | } |
nkeynes@295 | 43 | |
nkeynes@295 | 44 | /** |
nkeynes@295 | 45 | * Save the current rendering data to a file for later analysis. |
nkeynes@295 | 46 | * @return 0 on success, non-zero on failure. |
nkeynes@295 | 47 | */ |
nkeynes@295 | 48 | int pvr2_render_save_scene( const gchar *filename ) |
nkeynes@295 | 49 | { |
nkeynes@295 | 50 | struct header { |
nkeynes@295 | 51 | char magic[16]; |
nkeynes@295 | 52 | uint32_t version; |
nkeynes@295 | 53 | uint32_t timestamp; |
nkeynes@295 | 54 | uint32_t frame_count; |
nkeynes@295 | 55 | } scene_header; |
nkeynes@295 | 56 | |
nkeynes@295 | 57 | char page_map[SAVE_PAGE_COUNT]; |
nkeynes@295 | 58 | int i,j; |
nkeynes@295 | 59 | pvr2_find_referenced_pages(page_map); |
nkeynes@295 | 60 | |
nkeynes@295 | 61 | FILE *f = fopen( filename, "wo" ); |
nkeynes@295 | 62 | if( f == NULL ) { |
nkeynes@295 | 63 | ERROR( "Unable to open file '%s' to write scene data: %s", filename, strerror(errno) ); |
nkeynes@295 | 64 | return -1; |
nkeynes@295 | 65 | } |
nkeynes@295 | 66 | |
nkeynes@295 | 67 | /* Header */ |
nkeynes@295 | 68 | memcpy( scene_header.magic, SCENE_SAVE_MAGIC, 16 ); |
nkeynes@295 | 69 | scene_header.version = SCENE_SAVE_VERSION; |
nkeynes@295 | 70 | scene_header.timestamp = time(NULL); |
nkeynes@295 | 71 | scene_header.frame_count = pvr2_get_frame_count(); |
nkeynes@295 | 72 | fwrite( &scene_header, sizeof(scene_header), 1, f ); |
nkeynes@295 | 73 | |
nkeynes@295 | 74 | /* PVR2 registers - could probably be more specific, but doesn't |
nkeynes@295 | 75 | * really use a lot of space. Loader is assumed to know which |
nkeynes@295 | 76 | * registers actually need to be set. |
nkeynes@295 | 77 | */ |
nkeynes@295 | 78 | fwrite( mmio_region_PVR2.mem, 0x1000, 1, f ); |
nkeynes@295 | 79 | fwrite( mmio_region_PVR2PAL.mem, 0x1000, 1, f ); |
nkeynes@295 | 80 | |
nkeynes@295 | 81 | /* Write out the VRAM pages we care about */ |
nkeynes@295 | 82 | for( i=0; i<SAVE_PAGE_COUNT; i++ ) { |
nkeynes@295 | 83 | if( page_map[i] != 0 ) { |
nkeynes@295 | 84 | for( j=i+1; j<SAVE_PAGE_COUNT && page_map[j] != 0; j++ ); |
nkeynes@295 | 85 | /* Write region from i..j-1 */ |
nkeynes@295 | 86 | uint32_t start = i * SAVE_PAGE_SIZE; |
nkeynes@295 | 87 | uint32_t length = (j-i) * SAVE_PAGE_SIZE; |
nkeynes@295 | 88 | fwrite( &start, sizeof(uint32_t), 1, f ); |
nkeynes@295 | 89 | fwrite( &length, sizeof(uint32_t), 1, f ); |
nkeynes@295 | 90 | fwrite( video_base + start, 1, length, f ); |
nkeynes@295 | 91 | i = j-1; |
nkeynes@295 | 92 | } |
nkeynes@295 | 93 | } |
nkeynes@295 | 94 | /* Write out the EOF marker */ |
nkeynes@295 | 95 | uint32_t eof = 0xFFFFFFFF; |
nkeynes@295 | 96 | fwrite( &eof, sizeof(uint32_t), 1, f ); |
nkeynes@295 | 97 | fclose( f ); |
nkeynes@429 | 98 | return 0; |
nkeynes@295 | 99 | } |
.