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