Search
lxdream.org :: lxdream/src/pvr2/pvr2.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/pvr2/pvr2.h
changeset 222:541d9d899aba
prev221:cf5c6d326162
next282:01e53698ff38
author nkeynes
date Wed Jan 03 09:00:17 2007 +0000 (17 years ago)
permissions -rw-r--r--
last change Adjust timers when they're read rather than waiting until the next time
slice. Also temporarily cut the CPU time by 4.
Initialize the FRQCR register to 0x0E0A for convenience
view annotate diff log raw
     1 /**
     2  * $Id: pvr2.h,v 1.18 2006-09-12 11:54:19 nkeynes Exp $
     3  *
     4  * PVR2 (video chip) functions and macros.
     5  *
     6  * Copyright (c) 2005 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  */
    19 #include "dream.h"
    20 #include "mem.h"
    21 #include "display.h"
    22 #include "pvr2/pvr2mmio.h"
    23 #include <GL/gl.h>
    25 typedef unsigned int pvraddr_t;
    26 typedef unsigned int pvr64addr_t;
    28 #define DISPMODE_DE  0x00000001 /* Display enable */
    29 #define DISPMODE_SD  0x00000002 /* Scan double */
    30 #define DISPMODE_COL 0x0000000C /* Colour mode */
    31 #define DISPMODE_CD  0x08000000 /* Clock double */
    33 #define COLFMT_RGB15 0x00000000
    34 #define COLFMT_RGB16 0x00000004
    35 #define COLFMT_RGB24 0x00000008
    36 #define COLFMT_RGB32 0x0000000C
    38 #define DISPSIZE_MODULO 0x3FF00000 /* line skip +1 (32-bit words)*/
    39 #define DISPSIZE_LPF    0x000FFC00 /* lines per field */
    40 #define DISPSIZE_PPL    0x000003FF /* pixel words (32 bit) per line */
    42 #define DISPCFG_VP 0x00000001 /* V-sync polarity */
    43 #define DISPCFG_HP 0x00000002 /* H-sync polarity */
    44 #define DISPCFG_I  0x00000010 /* Interlace enable */
    45 #define DISPCFG_BS 0x000000C0 /* Broadcast standard */
    46 #define DISPCFG_VO 0x00000100 /* Video output enable */
    48 #define BS_NTSC 0x00000000
    49 #define BS_PAL  0x00000040
    50 #define BS_PALM 0x00000080 /* ? */
    51 #define BS_PALN 0x000000C0 /* ? */
    53 #define PVR2_RAM_BASE 0x05000000
    54 #define PVR2_RAM_BASE_INT 0x04000000
    55 #define PVR2_RAM_SIZE (8 * 1024 * 1024)
    56 #define PVR2_RAM_PAGES (PVR2_RAM_SIZE>>12)
    57 #define PVR2_RAM_MASK 0x7FFFFF
    59 #define RENDER_ZONLY  0
    60 #define RENDER_NORMAL 1     /* Render non-modified polygons */
    61 #define RENDER_CHEAPMOD 2   /* Render cheap-modified polygons */
    62 #define RENDER_FULLMOD 3    /* Render the fully-modified version of the polygons */
    64 void pvr2_next_frame( void );
    65 void pvr2_set_base_address( uint32_t );
    66 int pvr2_get_frame_count( void );
    68 #define PVR2_CMD_END_OF_LIST 0x00
    69 #define PVR2_CMD_USER_CLIP   0x20
    70 #define PVR2_CMD_POLY_OPAQUE 0x80
    71 #define PVR2_CMD_MOD_OPAQUE  0x81
    72 #define PVR2_CMD_POLY_TRANS  0x82
    73 #define PVR2_CMD_MOD_TRANS   0x83
    74 #define PVR2_CMD_POLY_PUNCHOUT 0x84
    75 #define PVR2_CMD_VERTEX      0xE0
    76 #define PVR2_CMD_VERTEX_LAST 0xF0
    78 #define PVR2_POLY_TEXTURED 0x00000008
    79 #define PVR2_POLY_SPECULAR 0x00000004
    80 #define PVR2_POLY_SHADED   0x00000002
    81 #define PVR2_POLY_UV_16BIT 0x00000001
    83 #define PVR2_POLY_MODE_CLAMP_RGB 0x00200000
    84 #define PVR2_POLY_MODE_ALPHA    0x00100000
    85 #define PVR2_POLY_MODE_TEXALPHA 0x00080000
    86 #define PVR2_POLY_MODE_FLIP_S   0x00040000
    87 #define PVR2_POLY_MODE_FLIP_T   0x00020000
    88 #define PVR2_POLY_MODE_CLAMP_S  0x00010000
    89 #define PVR2_POLY_MODE_CLAMP_T  0x00008000
    91 #define PVR2_TEX_FORMAT_ARGB1555 0x00000000
    92 #define PVR2_TEX_FORMAT_RGB565   0x08000000
    93 #define PVR2_TEX_FORMAT_ARGB4444 0x10000000
    94 #define PVR2_TEX_FORMAT_YUV422   0x18000000
    95 #define PVR2_TEX_FORMAT_BUMPMAP  0x20000000
    96 #define PVR2_TEX_FORMAT_IDX4     0x28000000
    97 #define PVR2_TEX_FORMAT_IDX8     0x30000000
    99 #define PVR2_TEX_MIPMAP      0x80000000
   100 #define PVR2_TEX_COMPRESSED  0x40000000
   101 #define PVR2_TEX_FORMAT_MASK 0x38000000
   102 #define PVR2_TEX_UNTWIDDLED  0x04000000
   104 #define PVR2_TEX_ADDR(x) ( ((x)&0x01FFFFF)<<3 );
   105 #define PVR2_TEX_IS_MIPMAPPED(x) ( (x) & PVR2_TEX_MIPMAP )
   106 #define PVR2_TEX_IS_COMPRESSED(x) ( (x) & PVR2_TEX_COMPRESSED )
   107 #define PVR2_TEX_IS_TWIDDLED(x) (((x) & PVR2_TEX_UNTWIDDLED) == 0)
   109 /****************************** Frame Buffer *****************************/
   111 /**
   112  * Write to the interleaved memory address space (aka 64-bit address space).
   113  */
   114 void pvr2_vram64_write( sh4addr_t dest, char *src, uint32_t length );
   116 /**
   117  * Read from the interleaved memory address space (aka 64-bit address space)
   118  */
   119 void pvr2_vram64_read( char *dest, sh4addr_t src, uint32_t length );
   121 /**
   122  * Dump a portion of vram to a stream from the interleaved memory address 
   123  * space.
   124  */
   125 void pvr2_vram64_dump( sh4addr_t addr, uint32_t length, FILE *f );
   127 /**************************** Tile Accelerator ***************************/
   128 /**
   129  * Process the data in the supplied buffer as an array of TA command lists.
   130  * Any excess bytes are held pending until a complete list is sent
   131  */
   132 void pvr2_ta_write( char *buf, uint32_t length );
   135 /**
   136  * (Re)initialize the tile accelerator in preparation for the next scene.
   137  * Normally called immediately before commencing polygon transmission.
   138  */
   139 void pvr2_ta_init( void );
   141 /********************************* Renderer ******************************/
   143 /**
   144  * Initialize the rendering pipeline.
   145  * @return TRUE on success, FALSE on failure.
   146  */
   147 gboolean pvr2_render_init( void );
   149 /**
   150  * Invalidate any caching on the supplied SH4 address
   151  */
   152 gboolean pvr2_render_invalidate( sh4addr_t addr );
   154 /**
   155  * Render the current scene stored in PVR ram to the GL back buffer.
   156  */
   157 void pvr2_render_scene( void );
   159 /**
   160  * Display the scene rendered to the supplied address.
   161  * @return TRUE if there was an available render that was displayed,
   162  * otherwise FALSE (and no action was taken)
   163  */
   164 gboolean pvr2_render_display_frame( uint32_t address );
   167 void render_backplane( uint32_t *polygon, uint32_t width, uint32_t height, uint32_t mode );
   169 void render_set_context( uint32_t *context, int render_mode );
   171 void pvr2_render_tilebuffer( int width, int height, int clipx1, int clipy1, 
   172 			     int clipx2, int clipy2 );
   174 /****************************** Texture Cache ****************************/
   176 /**
   177  * Initialize the texture cache.
   178  */
   179 void texcache_init( void );
   181 /**
   182  * Initialize the GL side of the texture cache (texture ids and such).
   183  */
   184 void texcache_gl_init( void );
   186 /**
   187  * Flush all textures and delete. The cache will be non-functional until
   188  * the next call to texcache_init(). This would typically be done if
   189  * switching GL targets.
   190  */    
   191 void texcache_shutdown( void );
   193 /**
   194  * Evict all textures contained in the page identified by a texture address.
   195  */
   196 void texcache_invalidate_page( uint32_t texture_addr );
   198 /**
   199  * Return a texture ID for the texture specified at the supplied address
   200  * and given parameters (the same sequence of bytes could in theory have
   201  * multiple interpretations). We use the texture address as the primary
   202  * index, but allow for multiple instances at each address. The texture
   203  * will be bound to the GL_TEXTURE_2D target before being returned.
   204  * 
   205  * If the texture has already been bound, return the ID to which it was
   206  * bound. Otherwise obtain an unused texture ID and set it up appropriately.
   207  */
   208 GLuint texcache_get_texture( uint32_t texture_addr, int width, int height,
   209 			     int mode );
   211 /************************* Rendering support macros **************************/
   212 #define POLY1_DEPTH_MODE(poly1) ( pvr2_poly_depthmode[(poly1)>>29] )
   213 #define POLY1_DEPTH_ENABLE(poly1) (((poly1)&0x04000000) == 0 )
   214 #define POLY1_CULL_MODE(poly1) (((poly1)>>27)&0x03)
   215 #define POLY1_TEXTURED(poly1) (((poly1)&0x02000000))
   216 #define POLY1_SPECULAR(poly1) (((poly1)&0x01000000))
   217 #define POLY1_SHADE_MODEL(poly1) (((poly1)&0x00800000) ? GL_SMOOTH : GL_FLAT)
   218 #define POLY1_UV16(poly1)   (((poly1)&0x00400000))
   219 #define POLY1_SINGLE_TILE(poly1) (((poly1)&0x00200000))
   221 #define POLY2_SRC_BLEND(poly2) ( pvr2_poly_srcblend[(poly2) >> 29] )
   222 #define POLY2_DEST_BLEND(poly2) ( pvr2_poly_dstblend[((poly2)>>26)&0x07] )
   223 #define POLY2_SRC_BLEND_ENABLE(poly2) ((poly2)&0x02000000)
   224 #define POLY2_DEST_BLEND_ENABLE(poly2) ((poly2)&0x01000000)
   225 #define POLY2_COLOUR_CLAMP_ENABLE(poly2) ((poly2)&0x00200000)
   226 #define POLY2_ALPHA_ENABLE(poly2) ((poly2)&0x001000000)
   227 #define POLY2_TEX_ALPHA_ENABLE(poly2) (((poly2)&0x00080000) == 0 )
   228 #define POLY2_TEX_WIDTH(poly2) ( 1<< ((((poly2) >> 3) & 0x07 ) + 3) )
   229 #define POLY2_TEX_HEIGHT(poly2) ( 1<< (((poly2) & 0x07 ) + 3) )
   230 #define POLY2_TEX_BLEND(poly2) ( pvr2_poly_texblend[((poly2) >> 6)&0x03] )
   231 extern int pvr2_poly_depthmode[8];
   232 extern int pvr2_poly_srcblend[8];
   233 extern int pvr2_poly_dstblend[8];
   234 extern int pvr2_poly_texblend[4];
   235 extern int pvr2_render_colour_format[8];
   237 float halftofloat(uint16_t half);
.