Search
lxdream.org :: lxdream/src/pvr2/pvr2.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/pvr2/pvr2.h
changeset 1135:68daed8f38af
prev1076:18c164e8aec4
next1137:4799d64b3478
author nkeynes
date Sun Oct 24 11:50:17 2010 +1000 (10 years ago)
permissions -rw-r--r--
last change Set gl texture parameters at texture load time rather than render time.
(This does mean that if the texture is used with variant parameters it will be
loaded multiple times). 3-4% faster this way
view annotate diff log raw
     1 /**
     2  * $Id$
     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 #ifndef lxdream_pvr2_H
    20 #define lxdream_pvr2_H 1
    22 #include <stdio.h>
    23 #include "lxdream.h"
    24 #include "mem.h"
    25 #include "display.h"
    27 #ifdef __cplusplus
    28 extern "C" {
    29 #endif
    31 typedef unsigned int pvraddr_t;
    32 typedef unsigned int pvr64addr_t;
    34 #define DISPMODE_ENABLE      0x00000001 /* Display enable */
    35 #define DISPMODE_LINEDOUBLE  0x00000002 /* scanline double */
    36 #define DISPMODE_COLFMT      0x0000000C /* Colour mode */
    37 #define DISPMODE_CLOCKDIV    0x08000000 /* Clock divide-by-2 */
    39 #define DISPSIZE_MODULO 0x3FF00000 /* line skip +1 (32-bit words)*/
    40 #define DISPSIZE_LPF    0x000FFC00 /* lines per field */
    41 #define DISPSIZE_PPL    0x000003FF /* pixel words (32 bit) per line */
    43 #define DISPCFG_VP 0x00000001 /* V-sync polarity */
    44 #define DISPCFG_HP 0x00000002 /* H-sync polarity */
    45 #define DISPCFG_I  0x00000010 /* Interlace enable */
    46 #define DISPCFG_BS 0x000000C0 /* Broadcast standard */
    47 #define DISPCFG_VO 0x00000100 /* Video output enable */
    49 #define DISPSYNC_LINE_MASK  0x000003FF
    50 #define DISPSYNC_EVEN_FIELD 0x00000000
    51 #define DISPSYNC_ODD_FIELD  0x00000400
    52 #define DISPSYNC_ACTIVE     0x00000800
    53 #define DISPSYNC_HSYNC      0x00001000
    54 #define DISPSYNC_VSYNC      0x00002000
    56 #define BS_NTSC 0x00000000
    57 #define BS_PAL  0x00000040
    58 #define BS_PALM 0x00000080 /* ? */
    59 #define BS_PALN 0x000000C0 /* ? */
    61 #define SCALER_HSCALE 0x00010000
    63 #define PVR2_RAM_BASE 0x05000000
    64 #define PVR2_RAM_BASE_INT 0x04000000
    65 #define PVR2_RAM_SIZE (8 * 1024 * 1024)
    66 #define PVR2_RAM_PAGES (PVR2_RAM_SIZE>>12)
    67 #define PVR2_RAM_MASK 0x7FFFFF
    69 #define RENDER_ZONLY  0
    70 #define RENDER_NORMAL 1     /* Render non-modified polygons */
    71 #define RENDER_CHEAPMOD 2   /* Render cheap-modified polygons */
    72 #define RENDER_FULLMOD 3    /* Render the fully-modified version of the polygons */
    74 /**
    75  * Advance to the next frame
    76  */
    77 void pvr2_next_frame( void );
    79 /**
    80  * Draw the current frame on the output window.
    81  */
    82 void pvr2_draw_frame();
    83 void pvr2_set_base_address( uint32_t );
    84 int pvr2_get_frame_count( void );
    85 gboolean pvr2_save_next_scene( const gchar *filename );
    87 #define PVR2_CMD_END_OF_LIST 0x00
    88 #define PVR2_CMD_USER_CLIP   0x20
    89 #define PVR2_CMD_POLY_OPAQUE 0x80
    90 #define PVR2_CMD_MOD_OPAQUE  0x81
    91 #define PVR2_CMD_POLY_TRANS  0x82
    92 #define PVR2_CMD_MOD_TRANS   0x83
    93 #define PVR2_CMD_POLY_PUNCHOUT 0x84
    94 #define PVR2_CMD_VERTEX      0xE0
    95 #define PVR2_CMD_VERTEX_LAST 0xF0
    97 #define PVR2_VOLUME_NORMAL 0x00000000
    98 #define PVR2_VOLUME_REGION1 0x20000000
    99 #define PVR2_VOLUME_REGION0 0x40000000
   101 #define PVR2_POLY_TEXTURED 0x00000008
   102 #define PVR2_POLY_SPECULAR 0x00000004
   103 #define PVR2_POLY_SHADED   0x00000002
   104 #define PVR2_POLY_UV_16BIT 0x00000001
   106 #define PVR2_POLY_MODE_CLAMP_RGB 0x00200000
   107 #define PVR2_POLY_MODE_ALPHA    0x00100000
   108 #define PVR2_POLY_MODE_TEXALPHA 0x00080000
   109 #define PVR2_POLY_MODE_FLIP_S   0x00040000
   110 #define PVR2_POLY_MODE_FLIP_T   0x00020000
   111 #define PVR2_POLY_MODE_CLAMP_S  0x00010000
   112 #define PVR2_POLY_MODE_CLAMP_T  0x00008000
   114 #define PVR2_POLY_FOG_LOOKUP    0x00000000
   115 #define PVR2_POLY_FOG_VERTEX    0x00400000
   116 #define PVR2_POLY_FOG_DISABLED  0x00800000
   117 #define PVR2_POLY_FOG_LOOKUP2   0x00C00000
   120 #define PVR2_TEX_FORMAT_ARGB1555 0x00000000
   121 #define PVR2_TEX_FORMAT_RGB565   0x08000000
   122 #define PVR2_TEX_FORMAT_ARGB4444 0x10000000
   123 #define PVR2_TEX_FORMAT_YUV422   0x18000000
   124 #define PVR2_TEX_FORMAT_BUMPMAP  0x20000000
   125 #define PVR2_TEX_FORMAT_IDX4     0x28000000
   126 #define PVR2_TEX_FORMAT_IDX8     0x30000000
   128 #define PVR2_TEX_MIPMAP      0x80000000
   129 #define PVR2_TEX_COMPRESSED  0x40000000
   130 #define PVR2_TEX_FORMAT_MASK 0x38000000
   131 #define PVR2_TEX_UNTWIDDLED  0x04000000
   132 #define PVR2_TEX_STRIDE      0x02000000
   133 #define PVR2_TEX_IS_PALETTE(mode) ( (mode & PVR2_TEX_FORMAT_MASK) == PVR2_TEX_FORMAT_IDX4 || (mode&PVR2_TEX_FORMAT_MASK) == PVR2_TEX_FORMAT_IDX8 )
   136 #define PVR2_TEX_ADDR(x) ( ((x)&0x01FFFFF)<<3 );
   137 #define PVR2_TEX_IS_MIPMAPPED(x) ( ((x) & 0x84000000) == 0x80000000 )
   138 #define PVR2_TEX_IS_COMPRESSED(x) ( (x) & PVR2_TEX_COMPRESSED )
   139 #define PVR2_TEX_IS_TWIDDLED(x) (((x) & PVR2_TEX_UNTWIDDLED) == 0)
   140 #define PVR2_TEX_IS_STRIDE(x) (((x) & 0x06000000) == 0x06000000)
   142 /****************************** Frame Buffer *****************************/
   144 extern unsigned char pvr2_main_ram[];
   146 /**
   147  * Write a block of data to an address in the DMA range (0x10000000 -
   148  * 0x13FFFFFF), ie TA, YUV, or texture ram.
   149  */
   150 void pvr2_dma_write( sh4addr_t dest, unsigned char *src, uint32_t length );
   152 /**
   153  * Write to the interleaved memory address space (aka 64-bit address space).
   154  */
   155 void pvr2_vram64_write( sh4addr_t dest, unsigned char *src, uint32_t length );
   157 /**
   158  * Write to the interleaved memory address space (aka 64-bit address space),
   159  * using a line length and stride.
   160  */
   161 void pvr2_vram64_write_stride( sh4addr_t dest, unsigned char *src, uint32_t line_bytes,
   162                                uint32_t line_stride_bytes, uint32_t line_count );
   164 /**
   165  * Read from the interleaved memory address space (aka 64-bit address space)
   166  */
   167 void pvr2_vram64_read( unsigned char *dest, sh4addr_t src, uint32_t length );
   169 /**
   170  * Read a twiddled image from interleaved memory address space (aka 64-bit address
   171  * space), writing the image to the destination buffer in detwiddled format.
   172  * Width and height must be powers of 2
   173  * This version reads 4-bit pixels.
   174  */
   175 void pvr2_vram64_read_twiddled_4( unsigned char *dest, sh4addr_t src, uint32_t width, uint32_t height );
   178 /**
   179  * Read a twiddled image from interleaved memory address space (aka 64-bit address
   180  * space), writing the image to the destination buffer in detwiddled format.
   181  * Width and height must be powers of 2
   182  * This version reads 8-bit pixels.
   183  */
   184 void pvr2_vram64_read_twiddled_8( unsigned char *dest, sh4addr_t src, uint32_t width, uint32_t height );
   186 /**
   187  * Read a twiddled image from interleaved memory address space (aka 64-bit address
   188  * space), writing the image to the destination buffer in detwiddled format.
   189  * Width and height must be powers of 2, and src must be 16-bit aligned.
   190  * This version reads 16-bit pixels.
   191  */
   192 void pvr2_vram64_read_twiddled_16( unsigned char *dest, sh4addr_t src, uint32_t width, uint32_t height );
   194 /**
   195  * Read an image from the interleaved memory address space (aka 64-bit address space)
   196  * where the source and destination line sizes may differ. Note that both byte
   197  * counts must be a multiple of 4, and the src address must be 32-bit aligned.
   198  */
   199 void pvr2_vram64_read_stride( unsigned char *dest, uint32_t dest_line_bytes, sh4addr_t srcaddr,
   200                               uint32_t src_line_bytes, uint32_t line_count );
   201 /**
   202  * Dump a portion of vram to a stream from the interleaved memory address
   203  * space.
   204  */
   205 void pvr2_vram64_dump( sh4addr_t addr, uint32_t length, FILE *f );
   207 /**
   208  * Flush the indicated render buffer back to PVR. Caller is responsible for
   209  * tracking whether there is actually anything in the buffer.
   210  *
   211  * @param buffer A render buffer indicating the address to store to, and the
   212  * format the data needs to be in.
   213  * @param backBuffer TRUE to flush the back buffer, FALSE for
   214  * the front buffer.
   215  */
   216 void pvr2_render_buffer_copy_to_sh4( render_buffer_t buffer );
   218 /**
   219  * Invalidate any caching on the supplied SH4 address
   220  */
   221 gboolean pvr2_render_buffer_invalidate( sh4addr_t addr, gboolean isWrite );
   224 /**************************** Tile Accelerator ***************************/
   225 /**
   226  * Process the data in the supplied buffer as an array of TA command lists.
   227  * Any excess bytes are held pending until a complete list is sent
   228  */
   229 void pvr2_ta_write( unsigned char *buf, uint32_t length );
   231 void FASTCALL pvr2_ta_write_burst( sh4addr_t addr, unsigned char *buf );
   233 /**
   234  * Find the first polygon or sprite context in the supplied buffer of TA
   235  * data.
   236  * @return A pointer to the context, or NULL if it cannot be found
   237  */
   238 uint32_t *pvr2_ta_find_polygon_context( uint32_t *buf, uint32_t length );
   240 /**
   241  * (Re)initialize the tile accelerator in preparation for the next scene.
   242  * Normally called immediately before commencing polygon transmission.
   243  */
   244 void pvr2_ta_init( void );
   246 void pvr2_ta_reset( void );
   248 void pvr2_ta_save_state( FILE *f );
   250 int pvr2_ta_load_state( FILE *f );
   252 /****************************** YUV Converter ****************************/
   254 /**
   255  * Process a block of YUV data.
   256  */
   257 void pvr2_yuv_write( unsigned char *buf, uint32_t length );
   259 /**
   260  * Initialize the YUV converter.
   261  */
   262 void pvr2_yuv_init( uint32_t target_addr );
   264 void pvr2_yuv_set_config( uint32_t config );
   266 void pvr2_yuv_save_state( FILE *f );
   268 int pvr2_yuv_load_state( FILE *f );
   270 /********************************* Renderer ******************************/
   272 /**
   273  * Render the current scene stored in PVR ram to the GL back buffer.
   274  */
   275 void pvr2_scene_render( render_buffer_t buffer );
   277 /**
   278  * Perform the initial once-off GL setup, usually immediately after the GL
   279  * context is first bound.
   280  */
   281 void pvr2_setup_gl_context();
   283 void render_backplane( uint32_t *polygon, uint32_t width, uint32_t height, uint32_t mode );
   285 void render_autosort_tile( pvraddr_t tile_entry, int render_mode );
   287 void render_set_context( uint32_t *context, GLint depth_mode );
   289 void gl_render_tilelist( pvraddr_t tile_entry, GLint depth_mode );
   291 render_buffer_t pvr2_create_render_buffer( sh4addr_t addr, int width, int height, GLuint tex_id );
   293 void pvr2_finish_render_buffer( render_buffer_t buffer );
   295 void pvr2_destroy_render_buffer( render_buffer_t buffer );
   298 /**
   299  * Structure to hold a complete unpacked vertex (excluding modifier
   300  * volume parameters - generate separate vertexes in that case).
   301  */
   302 struct vertex_unpacked {
   303     float x,y,z;
   304     float u,v;            /* Texture coordinates */
   305     float rgba[4];        /* Fragment colour (RGBA order) */
   306     float offset_rgba[4]; /* Offset color (RGBA order) */
   307 };
   309 /****************************** Texture Cache ****************************/
   311 /**
   312  * Initialize the texture cache.
   313  */
   314 void texcache_init( void );
   316 /**
   317  * Initialize the GL side of the texture cache (texture ids and such).
   318  */
   319 void texcache_gl_init( void );
   321 /**
   322  * Flush all textures and delete. The cache will be non-functional until
   323  * the next call to texcache_init(). This would typically be done if
   324  * switching GL targets.
   325  */
   326 void texcache_shutdown( void );
   328 /**
   329  * Flush (ie free) all textures.
   330  */
   331 void texcache_flush( void );
   333 /**
   334  * Flush all palette-based textures (if any)
   335  */
   336 void texcache_invalidate_palette(void);
   338 /**
   339  * Evict all textures contained in the page identified by a texture address.
   340  */
   341 void texcache_invalidate_page( uint32_t texture_addr );
   343 /**
   344  * Set the global texture parameters for the scene (possibly invalidating
   345  * some existing textures)
   346  */
   347 void texcache_begin_scene( uint32_t palette_mode, uint32_t stride_width );
   349 /**
   350  * Return a texture ID for the texture specified at the supplied address
   351  * and given parameters (the same sequence of bytes could in theory have
   352  * multiple interpretations). We use the texture address as the primary
   353  * index, but allow for multiple instances at each address. The texture
   354  * will be bound to the GL_TEXTURE_2D target before being returned.
   355  *
   356  * If the texture has already been bound, return the ID to which it was
   357  * bound. Otherwise obtain an unused texture ID and set it up appropriately.
   358  */
   359 GLuint texcache_get_texture( uint32_t poly2_word, uint32_t texture_word );
   361 render_buffer_t texcache_get_render_buffer( uint32_t texture_addr, int mode, int width, int height );
   363 void pvr2_check_palette_changed(void);
   365 int pvr2_render_save_scene( const gchar *filename );
   367 /**
   368  * Queue a gun position event to occur at the specified position. Unless
   369  * cancelled, when the display reaches the position:
   370  *   GUNPOS is updated with the position, and
   371  *   EVENT_MAPLE_DMA is fired.
   372  */
   373 void pvr2_queue_gun_event( int xpos, int ypos );
   375 /************************* Rendering support macros **************************/
   376 #define POLY1_VOLUME_MODE(poly1) ((poly1)&0xE0000000)
   377 #define POLY1_DEPTH_MODE(poly1) ( pvr2_poly_depthmode[(poly1)>>29] )
   378 #define POLY1_DEPTH_WRITE(poly1) (((poly1)&0x04000000) == 0 )
   379 #define POLY1_CULL_MODE(poly1) (((poly1)>>27)&0x03)
   380 #define POLY1_CULL_ENABLE(poly1) (((poly1)>>28)&0x01)
   381 #define POLY1_TEXTURED(poly1) (((poly1)&0x02000000))
   382 #define POLY1_SPECULAR(poly1) (((poly1)&0x01000000))
   383 #define POLY1_GOURAUD_SHADED(poly1) ((poly1)&0x00800000)
   384 #define POLY1_SHADE_MODEL(poly1) (((poly1)&0x00800000) ? GL_SMOOTH : GL_FLAT)
   385 #define POLY1_UV16(poly1)   (((poly1)&0x00400000))
   386 #define POLY1_SINGLE_TILE(poly1) (((poly1)&0x00200000))
   388 #define POLY2_SRC_BLEND(poly2) ( pvr2_poly_srcblend[(poly2) >> 29] )
   389 #define POLY2_DEST_BLEND(poly2) ( pvr2_poly_dstblend[((poly2)>>26)&0x07] )
   390 #define POLY2_SRC_BLEND_TARGET(poly2)    ((poly2)&0x02000000)
   391 #define POLY2_DEST_BLEND_TARGET(poly2)   ((poly2)&0x01000000)
   392 #define POLY2_FOG_MODE(poly2)            ((poly2)&0x00C00000)
   393 #define POLY2_COLOUR_CLAMP_ENABLE(poly2) ((poly2)&0x00200000)
   394 #define POLY2_ALPHA_ENABLE(poly2)        ((poly2)&0x00100000)
   395 #define POLY2_TEX_ALPHA_ENABLE(poly2)   (((poly2)&0x00080000) == 0 )
   396 #define POLY2_TEX_MIRROR_U(poly2)        ((poly2)&0x00040000)
   397 #define POLY2_TEX_MIRROR_V(poly2)        ((poly2)&0x00020000)
   398 #define POLY2_TEX_CLAMP_U(poly2)         ((poly2)&0x00010000)
   399 #define POLY2_TEX_CLAMP_V(poly2)         ((poly2)&0x00008000)
   400 #define POLY2_TEX_WIDTH(poly2) ( 1<< ((((poly2) >> 3) & 0x07 ) + 3) )
   401 #define POLY2_TEX_HEIGHT(poly2) ( 1<< (((poly2) & 0x07 ) + 3) )
   402 #define POLY2_TEX_BLEND(poly2) (((poly2) >> 6)&0x03)
   403 extern int pvr2_poly_depthmode[8];
   404 extern int pvr2_poly_srcblend[8];
   405 extern int pvr2_poly_dstblend[8];
   406 extern int pvr2_poly_texblend[4];
   407 extern int pvr2_render_colour_format[8];
   409 #define CULL_NONE 0
   410 #define CULL_SMALL 1
   411 #define CULL_CCW 2
   412 #define CULL_CW 3
   414 #define SEGMENT_END         0x80000000
   415 #define SEGMENT_ZCLEAR      0x40000000
   416 #define SEGMENT_SORT_TRANS  0x20000000
   417 #define SEGMENT_START       0x10000000
   418 #define SEGMENT_X(c)        (((c) >> 2) & 0x3F)
   419 #define SEGMENT_Y(c)        (((c) >> 8) & 0x3F)
   420 #define NO_POINTER          0x80000000
   421 #define IS_TILE_PTR(p)      ( ((p)&NO_POINTER) == 0 )
   422 #define IS_LAST_SEGMENT(s)  (((s)->control) & SEGMENT_END)
   424 struct tile_segment {
   425     uint32_t control;
   426     pvraddr_t opaque_ptr;
   427     pvraddr_t opaquemod_ptr;
   428     pvraddr_t trans_ptr;
   429     pvraddr_t transmod_ptr;
   430     pvraddr_t punchout_ptr;
   431 };
   433 #ifdef __cplusplus
   434 }
   435 #endif
   437 #endif /* !lxdream_pvr2_H */
.