Search
lxdream.org :: lxdream/src/pvr2/pvr2.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/pvr2/pvr2.h
changeset 931:430048ea8b71
prev886:2bc6d2329cce
next934:3acd3b3ee6d1
author nkeynes
date Tue Dec 23 05:48:05 2008 +0000 (15 years ago)
branchlxdream-mem
permissions -rw-r--r--
last change More refactoring and general cleanup. Most things should be working again now.
Split off cache and start real implementation, breaking save states in the process
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 void pvr2_next_frame( void );
    75 void pvr2_set_base_address( uint32_t );
    76 int pvr2_get_frame_count( void );
    77 void pvr2_redraw_display();
    78 gboolean pvr2_save_next_scene( const gchar *filename );
    80 #define PVR2_CMD_END_OF_LIST 0x00
    81 #define PVR2_CMD_USER_CLIP   0x20
    82 #define PVR2_CMD_POLY_OPAQUE 0x80
    83 #define PVR2_CMD_MOD_OPAQUE  0x81
    84 #define PVR2_CMD_POLY_TRANS  0x82
    85 #define PVR2_CMD_MOD_TRANS   0x83
    86 #define PVR2_CMD_POLY_PUNCHOUT 0x84
    87 #define PVR2_CMD_VERTEX      0xE0
    88 #define PVR2_CMD_VERTEX_LAST 0xF0
    90 #define PVR2_VOLUME_NORMAL 0x00000000
    91 #define PVR2_VOLUME_REGION1 0x20000000
    92 #define PVR2_VOLUME_REGION0 0x40000000
    94 #define PVR2_POLY_TEXTURED 0x00000008
    95 #define PVR2_POLY_SPECULAR 0x00000004
    96 #define PVR2_POLY_SHADED   0x00000002
    97 #define PVR2_POLY_UV_16BIT 0x00000001
    99 #define PVR2_POLY_MODE_CLAMP_RGB 0x00200000
   100 #define PVR2_POLY_MODE_ALPHA    0x00100000
   101 #define PVR2_POLY_MODE_TEXALPHA 0x00080000
   102 #define PVR2_POLY_MODE_FLIP_S   0x00040000
   103 #define PVR2_POLY_MODE_FLIP_T   0x00020000
   104 #define PVR2_POLY_MODE_CLAMP_S  0x00010000
   105 #define PVR2_POLY_MODE_CLAMP_T  0x00008000
   107 #define PVR2_POLY_FOG_LOOKUP    0x00000000
   108 #define PVR2_POLY_FOG_VERTEX    0x00400000
   109 #define PVR2_POLY_FOG_DISABLED  0x00800000
   110 #define PVR2_POLY_FOG_LOOKUP2   0x00C00000
   113 #define PVR2_TEX_FORMAT_ARGB1555 0x00000000
   114 #define PVR2_TEX_FORMAT_RGB565   0x08000000
   115 #define PVR2_TEX_FORMAT_ARGB4444 0x10000000
   116 #define PVR2_TEX_FORMAT_YUV422   0x18000000
   117 #define PVR2_TEX_FORMAT_BUMPMAP  0x20000000
   118 #define PVR2_TEX_FORMAT_IDX4     0x28000000
   119 #define PVR2_TEX_FORMAT_IDX8     0x30000000
   121 #define PVR2_TEX_MIPMAP      0x80000000
   122 #define PVR2_TEX_COMPRESSED  0x40000000
   123 #define PVR2_TEX_FORMAT_MASK 0x38000000
   124 #define PVR2_TEX_UNTWIDDLED  0x04000000
   125 #define PVR2_TEX_STRIDE      0x02000000
   126 #define PVR2_TEX_IS_PALETTE(mode) ( (mode & PVR2_TEX_FORMAT_MASK) == PVR2_TEX_FORMAT_IDX4 || (mode&PVR2_TEX_FORMAT_MASK) == PVR2_TEX_FORMAT_IDX8 )
   129 #define PVR2_TEX_ADDR(x) ( ((x)&0x01FFFFF)<<3 );
   130 #define PVR2_TEX_IS_MIPMAPPED(x) ( ((x) & 0x84000000) == 0x80000000 )
   131 #define PVR2_TEX_IS_COMPRESSED(x) ( (x) & PVR2_TEX_COMPRESSED )
   132 #define PVR2_TEX_IS_TWIDDLED(x) (((x) & PVR2_TEX_UNTWIDDLED) == 0)
   133 #define PVR2_TEX_IS_STRIDE(x) (((x) & 0x06000000) == 0x06000000)
   135 /****************************** Frame Buffer *****************************/
   137 /**
   138  * Write a block of data to an address in the DMA range (0x10000000 -
   139  * 0x13FFFFFF), ie TA, YUV, or texture ram.
   140  */
   141 void pvr2_dma_write( sh4addr_t dest, unsigned char *src, uint32_t length );
   143 /**
   144  * Write to the interleaved memory address space (aka 64-bit address space).
   145  */
   146 void pvr2_vram64_write( sh4addr_t dest, unsigned char *src, uint32_t length );
   148 /**
   149  * Write to the interleaved memory address space (aka 64-bit address space),
   150  * using a line length and stride.
   151  */
   152 void pvr2_vram64_write_stride( sh4addr_t dest, unsigned char *src, uint32_t line_bytes,
   153                                uint32_t line_stride_bytes, uint32_t line_count );
   155 /**
   156  * Read from the interleaved memory address space (aka 64-bit address space)
   157  */
   158 void pvr2_vram64_read( unsigned char *dest, sh4addr_t src, uint32_t length );
   160 /**
   161  * Read a twiddled image from interleaved memory address space (aka 64-bit address
   162  * space), writing the image to the destination buffer in detwiddled format.
   163  * Width and height must be powers of 2
   164  * This version reads 4-bit pixels.
   165  */
   166 void pvr2_vram64_read_twiddled_4( unsigned char *dest, sh4addr_t src, uint32_t width, uint32_t height );
   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 8-bit pixels.
   174  */
   175 void pvr2_vram64_read_twiddled_8( unsigned char *dest, sh4addr_t src, uint32_t width, uint32_t height );
   177 /**
   178  * Read a twiddled image from interleaved memory address space (aka 64-bit address
   179  * space), writing the image to the destination buffer in detwiddled format.
   180  * Width and height must be powers of 2, and src must be 16-bit aligned.
   181  * This version reads 16-bit pixels.
   182  */
   183 void pvr2_vram64_read_twiddled_16( unsigned char *dest, sh4addr_t src, uint32_t width, uint32_t height );
   185 /**
   186  * Read an image from the interleaved memory address space (aka 64-bit address space)
   187  * where the source and destination line sizes may differ. Note that both byte
   188  * counts must be a multiple of 4, and the src address must be 32-bit aligned.
   189  */
   190 void pvr2_vram64_read_stride( unsigned char *dest, uint32_t dest_line_bytes, sh4addr_t srcaddr,
   191                               uint32_t src_line_bytes, uint32_t line_count );
   192 /**
   193  * Dump a portion of vram to a stream from the interleaved memory address
   194  * space.
   195  */
   196 void pvr2_vram64_dump( sh4addr_t addr, uint32_t length, FILE *f );
   198 /**
   199  * Flush the indicated render buffer back to PVR. Caller is responsible for
   200  * tracking whether there is actually anything in the buffer.
   201  *
   202  * @param buffer A render buffer indicating the address to store to, and the
   203  * format the data needs to be in.
   204  * @param backBuffer TRUE to flush the back buffer, FALSE for
   205  * the front buffer.
   206  */
   207 void pvr2_render_buffer_copy_to_sh4( render_buffer_t buffer );
   209 /**
   210  * Invalidate any caching on the supplied SH4 address
   211  */
   212 gboolean pvr2_render_buffer_invalidate( sh4addr_t addr, gboolean isWrite );
   215 /**************************** Tile Accelerator ***************************/
   216 /**
   217  * Process the data in the supplied buffer as an array of TA command lists.
   218  * Any excess bytes are held pending until a complete list is sent
   219  */
   220 void pvr2_ta_write( unsigned char *buf, uint32_t length );
   222 void FASTCALL pvr2_ta_write_burst( sh4addr_t addr, unsigned char *buf );
   224 /**
   225  * Find the first polygon or sprite context in the supplied buffer of TA
   226  * data.
   227  * @return A pointer to the context, or NULL if it cannot be found
   228  */
   229 uint32_t *pvr2_ta_find_polygon_context( uint32_t *buf, uint32_t length );
   231 /**
   232  * (Re)initialize the tile accelerator in preparation for the next scene.
   233  * Normally called immediately before commencing polygon transmission.
   234  */
   235 void pvr2_ta_init( void );
   237 void pvr2_ta_reset( void );
   239 void pvr2_ta_save_state( FILE *f );
   241 int pvr2_ta_load_state( FILE *f );
   243 /****************************** YUV Converter ****************************/
   245 /**
   246  * Process a block of YUV data.
   247  */
   248 void pvr2_yuv_write( unsigned char *buf, uint32_t length );
   250 /**
   251  * Initialize the YUV converter.
   252  */
   253 void pvr2_yuv_init( uint32_t target_addr );
   255 void pvr2_yuv_set_config( uint32_t config );
   257 void pvr2_yuv_save_state( FILE *f );
   259 int pvr2_yuv_load_state( FILE *f );
   261 /********************************* Renderer ******************************/
   263 /**
   264  * Render the current scene stored in PVR ram to the GL back buffer.
   265  */
   266 void pvr2_scene_render( render_buffer_t buffer );
   268 /**
   269  * Perform the initial once-off GL setup, usually immediately after the GL
   270  * context is first bound.
   271  */
   272 void pvr2_setup_gl_context();
   274 void render_backplane( uint32_t *polygon, uint32_t width, uint32_t height, uint32_t mode );
   276 void render_autosort_tile( pvraddr_t tile_entry, int render_mode );
   278 void render_set_context( uint32_t *context, GLint depth_mode );
   280 void gl_render_tilelist( pvraddr_t tile_entry, GLint depth_mode );
   282 render_buffer_t pvr2_create_render_buffer( sh4addr_t addr, int width, int height, GLuint tex_id );
   284 void pvr2_finish_render_buffer( render_buffer_t buffer );
   286 void pvr2_destroy_render_buffer( render_buffer_t buffer );
   289 /**
   290  * Structure to hold a complete unpacked vertex (excluding modifier
   291  * volume parameters - generate separate vertexes in that case).
   292  */
   293 struct vertex_unpacked {
   294     float x,y,z;
   295     float u,v;            /* Texture coordinates */
   296     float rgba[4];        /* Fragment colour (RGBA order) */
   297     float offset_rgba[4]; /* Offset color (RGBA order) */
   298 };
   300 /****************************** Texture Cache ****************************/
   302 /**
   303  * Initialize the texture cache.
   304  */
   305 void texcache_init( void );
   307 /**
   308  * Initialize the GL side of the texture cache (texture ids and such).
   309  */
   310 void texcache_gl_init( void );
   312 /**
   313  * Flush all textures and delete. The cache will be non-functional until
   314  * the next call to texcache_init(). This would typically be done if
   315  * switching GL targets.
   316  */
   317 void texcache_shutdown( void );
   319 /**
   320  * Flush (ie free) all textures.
   321  */
   322 void texcache_flush( void );
   324 /**
   325  * Flush all palette-based textures (if any)
   326  */
   327 void texcache_invalidate_palette(void);
   329 /**
   330  * Evict all textures contained in the page identified by a texture address.
   331  */
   332 void texcache_invalidate_page( uint32_t texture_addr );
   334 /**
   335  * Set the global texture parameters for the scene (possibly invalidating
   336  * some existing textures)
   337  */
   338 void texcache_set_config( uint32_t palette_mode, uint32_t stride_width );
   340 /**
   341  * Return a texture ID for the texture specified at the supplied address
   342  * and given parameters (the same sequence of bytes could in theory have
   343  * multiple interpretations). We use the texture address as the primary
   344  * index, but allow for multiple instances at each address. The texture
   345  * will be bound to the GL_TEXTURE_2D target before being returned.
   346  *
   347  * If the texture has already been bound, return the ID to which it was
   348  * bound. Otherwise obtain an unused texture ID and set it up appropriately.
   349  */
   350 GLuint texcache_get_texture( uint32_t texture_word, int width, int height );
   352 render_buffer_t texcache_get_render_buffer( uint32_t texture_addr, int mode, int width, int height );
   354 void pvr2_check_palette_changed(void);
   356 int pvr2_render_save_scene( const gchar *filename );
   358 /**
   359  * Queue a gun position event to occur at the specified position. Unless
   360  * cancelled, when the display reaches the position:
   361  *   GUNPOS is updated with the position, and
   362  *   EVENT_MAPLE_DMA is fired.
   363  */
   364 void pvr2_queue_gun_event( int xpos, int ypos );
   366 /************************* Rendering support macros **************************/
   367 #define POLY1_VOLUME_MODE(poly1) ((poly1)&0xE0000000)
   368 #define POLY1_DEPTH_MODE(poly1) ( pvr2_poly_depthmode[(poly1)>>29] )
   369 #define POLY1_DEPTH_WRITE(poly1) (((poly1)&0x04000000) == 0 )
   370 #define POLY1_CULL_MODE(poly1) (((poly1)>>27)&0x03)
   371 #define POLY1_CULL_ENABLE(poly1) (((poly1)>>28)&0x01)
   372 #define POLY1_TEXTURED(poly1) (((poly1)&0x02000000))
   373 #define POLY1_SPECULAR(poly1) (((poly1)&0x01000000))
   374 #define POLY1_GOURAUD_SHADED(poly1) ((poly1)&0x00800000)
   375 #define POLY1_SHADE_MODEL(poly1) (((poly1)&0x00800000) ? GL_SMOOTH : GL_FLAT)
   376 #define POLY1_UV16(poly1)   (((poly1)&0x00400000))
   377 #define POLY1_SINGLE_TILE(poly1) (((poly1)&0x00200000))
   379 #define POLY2_SRC_BLEND(poly2) ( pvr2_poly_srcblend[(poly2) >> 29] )
   380 #define POLY2_DEST_BLEND(poly2) ( pvr2_poly_dstblend[((poly2)>>26)&0x07] )
   381 #define POLY2_SRC_BLEND_TARGET(poly2)    ((poly2)&0x02000000)
   382 #define POLY2_DEST_BLEND_TARGET(poly2)   ((poly2)&0x01000000)
   383 #define POLY2_FOG_MODE(poly2)            ((poly2)&0x00C00000)
   384 #define POLY2_COLOUR_CLAMP_ENABLE(poly2) ((poly2)&0x00200000)
   385 #define POLY2_ALPHA_ENABLE(poly2)        ((poly2)&0x00100000)
   386 #define POLY2_TEX_ALPHA_ENABLE(poly2)   (((poly2)&0x00080000) == 0 )
   387 #define POLY2_TEX_MIRROR_U(poly2)        ((poly2)&0x00040000)
   388 #define POLY2_TEX_MIRROR_V(poly2)        ((poly2)&0x00020000)
   389 #define POLY2_TEX_CLAMP_U(poly2)         ((poly2)&0x00010000)
   390 #define POLY2_TEX_CLAMP_V(poly2)         ((poly2)&0x00008000)
   391 #define POLY2_TEX_WIDTH(poly2) ( 1<< ((((poly2) >> 3) & 0x07 ) + 3) )
   392 #define POLY2_TEX_HEIGHT(poly2) ( 1<< (((poly2) & 0x07 ) + 3) )
   393 #define POLY2_TEX_BLEND(poly2) (((poly2) >> 6)&0x03)
   394 extern int pvr2_poly_depthmode[8];
   395 extern int pvr2_poly_srcblend[8];
   396 extern int pvr2_poly_dstblend[8];
   397 extern int pvr2_poly_texblend[4];
   398 extern int pvr2_render_colour_format[8];
   400 #define CULL_NONE 0
   401 #define CULL_SMALL 1
   402 #define CULL_CCW 2
   403 #define CULL_CW 3
   405 #define SEGMENT_END         0x80000000
   406 #define SEGMENT_ZCLEAR      0x40000000
   407 #define SEGMENT_SORT_TRANS  0x20000000
   408 #define SEGMENT_START       0x10000000
   409 #define SEGMENT_X(c)        (((c) >> 2) & 0x3F)
   410 #define SEGMENT_Y(c)        (((c) >> 8) & 0x3F)
   411 #define NO_POINTER          0x80000000
   412 #define IS_TILE_PTR(p)      ( ((p)&NO_POINTER) == 0 )
   413 #define IS_LAST_SEGMENT(s)  (((s)->control) & SEGMENT_END)
   415 struct tile_segment {
   416     uint32_t control;
   417     pvraddr_t opaque_ptr;
   418     pvraddr_t opaquemod_ptr;
   419     pvraddr_t trans_ptr;
   420     pvraddr_t transmod_ptr;
   421     pvraddr_t punchout_ptr;
   422 };
   424 #ifdef __cplusplus
   425 }
   426 #endif
   428 #endif /* !lxdream_pvr2_H */
.