nkeynes@31: /** nkeynes@108: * $Id: pvr2.h,v 1.10 2006-03-15 13:16:50 nkeynes Exp $ nkeynes@31: * nkeynes@103: * PVR2 (video chip) functions and macros. nkeynes@31: * nkeynes@31: * Copyright (c) 2005 Nathan Keynes. nkeynes@31: * nkeynes@31: * This program is free software; you can redistribute it and/or modify nkeynes@31: * it under the terms of the GNU General Public License as published by nkeynes@31: * the Free Software Foundation; either version 2 of the License, or nkeynes@31: * (at your option) any later version. nkeynes@31: * nkeynes@31: * This program is distributed in the hope that it will be useful, nkeynes@31: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@31: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@31: * GNU General Public License for more details. nkeynes@31: */ nkeynes@31: nkeynes@103: #include "dream.h" nkeynes@103: #include "mem.h" nkeynes@103: #include "video.h" nkeynes@103: #include "pvr2/pvr2mmio.h" nkeynes@103: #include nkeynes@1: nkeynes@1: nkeynes@1: #define DISPMODE_DE 0x00000001 /* Display enable */ nkeynes@1: #define DISPMODE_SD 0x00000002 /* Scan double */ nkeynes@1: #define DISPMODE_COL 0x0000000C /* Colour mode */ nkeynes@1: #define DISPMODE_CD 0x08000000 /* Clock double */ nkeynes@1: nkeynes@94: #define COLFMT_RGB15 0x00000000 nkeynes@94: #define COLFMT_RGB16 0x00000004 nkeynes@94: #define COLFMT_RGB24 0x00000008 nkeynes@94: #define COLFMT_RGB32 0x0000000C nkeynes@1: nkeynes@1: #define DISPSIZE_MODULO 0x3FF00000 /* line skip +1 (32-bit words)*/ nkeynes@1: #define DISPSIZE_LPF 0x000FFC00 /* lines per field */ nkeynes@1: #define DISPSIZE_PPL 0x000003FF /* pixel words (32 bit) per line */ nkeynes@1: nkeynes@103: #define DISPCFG_VP 0x00000001 /* V-sync polarity */ nkeynes@103: #define DISPCFG_HP 0x00000002 /* H-sync polarity */ nkeynes@103: #define DISPCFG_I 0x00000010 /* Interlace enable */ nkeynes@103: #define DISPCFG_BS 0x000000C0 /* Broadcast standard */ nkeynes@103: #define DISPCFG_VO 0x00000100 /* Video output enable */ nkeynes@1: nkeynes@1: #define BS_NTSC 0x00000000 nkeynes@1: #define BS_PAL 0x00000040 nkeynes@1: #define BS_PALM 0x00000080 /* ? */ nkeynes@1: #define BS_PALN 0x000000C0 /* ? */ nkeynes@1: nkeynes@103: #define PVR2_RAM_BASE 0x05000000 nkeynes@103: #define PVR2_RAM_BASE_INT 0x04000000 nkeynes@103: #define PVR2_RAM_SIZE (8 * 1024 * 1024) nkeynes@103: #define PVR2_RAM_PAGES (PVR2_RAM_SIZE>>12) nkeynes@103: nkeynes@1: void pvr2_next_frame( void ); nkeynes@19: void pvr2_set_base_address( uint32_t ); nkeynes@56: nkeynes@103: #define PVR2_CMD_END_OF_LIST 0x00 nkeynes@103: #define PVR2_CMD_USER_CLIP 0x20 nkeynes@103: #define PVR2_CMD_POLY_OPAQUE 0x80 nkeynes@103: #define PVR2_CMD_MOD_OPAQUE 0x81 nkeynes@103: #define PVR2_CMD_POLY_TRANS 0x82 nkeynes@103: #define PVR2_CMD_MOD_TRANS 0x83 nkeynes@103: #define PVR2_CMD_POLY_PUNCHOUT 0x84 nkeynes@103: #define PVR2_CMD_VERTEX 0xE0 nkeynes@103: #define PVR2_CMD_VERTEX_LAST 0xF0 nkeynes@103: nkeynes@103: #define PVR2_POLY_TEXTURED 0x00000008 nkeynes@103: #define PVR2_POLY_SPECULAR 0x00000004 nkeynes@103: #define PVR2_POLY_SHADED 0x00000002 nkeynes@103: #define PVR2_POLY_UV_16BIT 0x00000001 nkeynes@103: nkeynes@103: #define PVR2_TEX_FORMAT_ARGB1555 0x00000000 nkeynes@103: #define PVR2_TEX_FORMAT_RGB565 0x08000000 nkeynes@103: #define PVR2_TEX_FORMAT_ARGB4444 0x10000000 nkeynes@103: #define PVR2_TEX_FORMAT_YUV422 0x18000000 nkeynes@103: #define PVR2_TEX_FORMAT_BUMPMAP 0x20000000 nkeynes@103: #define PVR2_TEX_FORMAT_IDX4 0x28000000 nkeynes@103: #define PVR2_TEX_FORMAT_IDX8 0x30000000 nkeynes@103: nkeynes@103: #define PVR2_TEX_MIPMAP 0x80000000 nkeynes@103: #define PVR2_TEX_COMPRESSED 0x40000000 nkeynes@103: #define PVR2_TEX_FORMAT_MASK 0x38000000 nkeynes@103: #define PVR2_TEX_UNTWIDDLED 0x04000000 nkeynes@103: nkeynes@108: #define PVR2_TEX_ADDR(x) ( ((x)&0x01FFFFF)<<3 ); nkeynes@103: #define PVR2_TEX_IS_MIPMAPPED(x) ( (x) & PVR2_TEX_MIPMAP ) nkeynes@103: #define PVR2_TEX_IS_COMPRESSED(x) ( (x) & PVR2_TEX_COMPRESSED ) nkeynes@103: #define PVR2_TEX_IS_TWIDDLED(x) (((x) & PVR2_TEX_UNTWIDDLED) == 0) nkeynes@103: nkeynes@103: extern video_driver_t video_driver; nkeynes@103: nkeynes@103: /****************************** Frame Buffer *****************************/ nkeynes@103: nkeynes@103: /** nkeynes@103: * Write to the interleaved memory address space (aka 64-bit address space). nkeynes@103: */ nkeynes@103: void pvr2_vram64_write( sh4addr_t dest, char *src, uint32_t length ); nkeynes@103: nkeynes@103: /** nkeynes@103: * Read from the interleaved memory address space (aka 64-bit address space) nkeynes@103: */ nkeynes@103: void pvr2_vram64_read( char *dest, sh4addr_t src, uint32_t length ); nkeynes@103: nkeynes@103: /**************************** Tile Accelerator ***************************/ nkeynes@56: /** nkeynes@56: * Process the data in the supplied buffer as an array of TA command lists. nkeynes@56: * Any excess bytes are held pending until a complete list is sent nkeynes@56: */ nkeynes@100: void pvr2_ta_write( char *buf, uint32_t length ); nkeynes@100: nkeynes@100: nkeynes@103: /** nkeynes@103: * (Re)initialize the tile accelerator in preparation for the next scene. nkeynes@103: * Normally called immediately before commencing polygon transmission. nkeynes@103: */ nkeynes@103: void pvr2_ta_init( void ); nkeynes@103: nkeynes@103: /********************************* Renderer ******************************/ nkeynes@103: nkeynes@103: /** nkeynes@103: * Initialize the rendering pipeline. nkeynes@103: * @return TRUE on success, FALSE on failure. nkeynes@103: */ nkeynes@103: gboolean pvr2_render_init( void ); nkeynes@103: nkeynes@103: /** nkeynes@103: * Render the current scene stored in PVR ram to the GL back buffer. nkeynes@103: */ nkeynes@100: void pvr2_render_scene( void ); nkeynes@103: nkeynes@103: /** nkeynes@103: * Display the scene rendered to the supplied address. nkeynes@103: * @return TRUE if there was an available render that was displayed, nkeynes@103: * otherwise FALSE (and no action was taken) nkeynes@103: */ nkeynes@103: gboolean pvr2_render_display_frame( uint32_t address ); nkeynes@103: nkeynes@103: /****************************** Texture Cache ****************************/ nkeynes@103: nkeynes@103: /** nkeynes@108: * Initialize the texture cache. nkeynes@103: */ nkeynes@103: void texcache_init( void ); nkeynes@103: nkeynes@108: /** nkeynes@108: * Initialize the GL side of the texture cache (texture ids and such). nkeynes@108: */ nkeynes@108: void texcache_gl_init( void ); nkeynes@103: nkeynes@103: /** nkeynes@103: * Flush all textures and delete. The cache will be non-functional until nkeynes@103: * the next call to texcache_init(). This would typically be done if nkeynes@103: * switching GL targets. nkeynes@103: */ nkeynes@103: void texcache_shutdown( void ); nkeynes@103: nkeynes@103: /** nkeynes@103: * Evict all textures contained in the page identified by a texture address. nkeynes@103: */ nkeynes@103: void texcache_invalidate_page( uint32_t texture_addr ); nkeynes@103: nkeynes@103: /** nkeynes@103: * Return a texture ID for the texture specified at the supplied address nkeynes@103: * and given parameters (the same sequence of bytes could in theory have nkeynes@103: * multiple interpretations). We use the texture address as the primary nkeynes@103: * index, but allow for multiple instances at each address. The texture nkeynes@103: * will be bound to the GL_TEXTURE_2D target before being returned. nkeynes@103: * nkeynes@103: * If the texture has already been bound, return the ID to which it was nkeynes@103: * bound. Otherwise obtain an unused texture ID and set it up appropriately. nkeynes@103: */ nkeynes@103: GLuint texcache_get_texture( uint32_t texture_addr, int width, int height, nkeynes@103: int mode );