Path: blob/master/libmupen64plus/mupen64plus-video-z64/src/rdp.h
2 views
/*1* z642*3* Copyright (C) 2007 ziggy4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License as published by7* the Free Software Foundation; either version 2 of the License, or8* (at your option) any later version.9*10* This program is distributed in the hope that it will be useful,11* but WITHOUT ANY WARRANTY; without even the implied warranty of12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13* GNU General Public License for more details.14*15* You should have received a copy of the GNU General Public License along16* with this program; if not, write to the Free Software Foundation, Inc.,17* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.18*19**/2021#ifndef _RDP_H_22#define _RDP_H_2324#include <stdint.h>25#include <stdio.h>26#include <stdlib.h>27#include <string.h>2829#define M64P_PLUGIN_PROTOTYPES 130#include "m64p_types.h"31#include "m64p_common.h"32#include "m64p_plugin.h"33#include "m64p_vidext.h"34#include "m64p_config.h"3536#define LSB_FIRST 1 // TODO : check for platform37#ifdef LSB_FIRST38#define BYTE_ADDR_XOR 339#define WORD_ADDR_XOR 140#define BYTE4_XOR_BE(a) ((a) ^ 3) /* read/write a byte to a 32-bit space */41#else42#define BYTE_ADDR_XOR 043#define WORD_ADDR_XOR 044#define BYTE4_XOR_BE(a) (a)45#endif46474849#define RDP_PIXEL_SIZE_4BIT 050#define RDP_PIXEL_SIZE_8BIT 151#define RDP_PIXEL_SIZE_16BIT 252#define RDP_PIXEL_SIZE_32BIT 35354#define RDP_FORMAT_RGBA 055#define RDP_FORMAT_YUV 156#define RDP_FORMAT_CI 257#define RDP_FORMAT_IA 358#define RDP_FORMAT_I 45960#define RDP_CYCLE_TYPE_1 061#define RDP_CYCLE_TYPE_2 162#define RDP_CYCLE_TYPE_COPY 263#define RDP_CYCLE_TYPE_FILL 36465typedef uint32_t rdpColor_t;6667#define RDP_GETC32_R(c) ( ((c)>>24) & 0xff )68#define RDP_GETC32_G(c) ( ((c)>>16) & 0xff )69#define RDP_GETC32_B(c) ( ((c)>> 8) & 0xff )70#define RDP_GETC32_A(c) ( ((c)>> 0) & 0xff )7172#define RDP_GETC16_R(c) ( ((c)>>11) & 0x1f )73#define RDP_GETC16_G(c) ( ((c)>> 6) & 0x1f )74#define RDP_GETC16_B(c) ( ((c)>> 1) & 0x1f )75#define RDP_GETC16_A(c) ( ((c)>> 0) & 0x1 )7677struct rdpRect_t {78uint16_t xl, yl, xh, yh; // 10.2 fixed-point79};8081struct rdpTexRect_t {82int tilenum;83uint16_t xl, yl, xh, yh; // 10.2 fixed-point84int16_t s, t; // 10.5 fixed-point85int16_t dsdx, dtdy; // 5.10 fixed-point86};8788extern const char *rdpImageFormats[];8990// TODO put ct ... palette in a bitfield91struct rdpTile_t {92uint16_t line;93uint16_t tmem;94uint16_t sl, tl, sh, th; // 10.2 fixed-point95uint16_t w, h;96int8_t format, size;97int8_t mask_t, shift_t, mask_s, shift_s;98int8_t ct, mt, cs, ms;99int8_t palette;100};101102struct rdpCombineModes_t {103uint32_t w1, w2;104};105106#define RDP_GETCM_SUB_A_RGB0(cm) (((cm).w1 >> 20) & 0xf)107#define RDP_GETCM_MUL_RGB0(cm) (((cm).w1 >> 15) & 0x1f)108#define RDP_GETCM_SUB_A_A0(cm) (((cm).w1 >> 12) & 0x7)109#define RDP_GETCM_MUL_A0(cm) (((cm).w1 >> 9) & 0x7)110#define RDP_GETCM_SUB_A_RGB1(cm) (((cm).w1 >> 5) & 0xf)111#define RDP_GETCM_MUL_RGB1(cm) (((cm).w1 >> 0) & 0x1f)112113#define RDP_GETCM_SUB_B_RGB0(cm) (((cm).w2 >> 28) & 0xf)114#define RDP_GETCM_SUB_B_RGB1(cm) (((cm).w2 >> 24) & 0xf)115#define RDP_GETCM_SUB_A_A1(cm) (((cm).w2 >> 21) & 0x7)116#define RDP_GETCM_MUL_A1(cm) (((cm).w2 >> 18) & 0x7)117#define RDP_GETCM_ADD_RGB0(cm) (((cm).w2 >> 15) & 0x7)118#define RDP_GETCM_SUB_B_A0(cm) (((cm).w2 >> 12) & 0x7)119#define RDP_GETCM_ADD_A0(cm) (((cm).w2 >> 9) & 0x7)120#define RDP_GETCM_ADD_RGB1(cm) (((cm).w2 >> 6) & 0x7)121#define RDP_GETCM_SUB_B_A1(cm) (((cm).w2 >> 3) & 0x7)122#define RDP_GETCM_ADD_A1(cm) (((cm).w2 >> 0) & 0x7)123124#define RDP_COMBINE_MASK11 ((0xfu<<20)|(0x1fu<<15)|(0x7u<<12)|(0x7u<<9))125#define RDP_COMBINE_MASK12 ((0xfu<<28)|(0x7u<<15)|(0x7u<<12)|(0x7u<<9))126#define RDP_COMBINE_MASK21 ((0xfu<<5)|(0x1fu<<0))127#define RDP_COMBINE_MASK22 ((0xfu<<24)|(0x7u<<21)|(0x7u<<18)|(0x7u<<6)|(0x7u<<3)|(0x7u<<0))128129static const rdpCombineModes_t rdpCombineMasks[4] = {130{ ~RDP_COMBINE_MASK21, ~RDP_COMBINE_MASK22 },131{ ~0u, ~0u },132{ ~(RDP_COMBINE_MASK11|RDP_COMBINE_MASK21), ~(RDP_COMBINE_MASK12|RDP_COMBINE_MASK22) },133{ ~(RDP_COMBINE_MASK11|RDP_COMBINE_MASK21), ~(RDP_COMBINE_MASK12|RDP_COMBINE_MASK22) },134};135136struct rdpOtherModes_t {137uint32_t w1, w2;138};139140#define RDP_OM_MISSING1 (~((3<<20)|0x80000|0x40000|0x20000|0x10000|0x08000| \1410x04000|0x02000|0x01000|0x00800|0x00400|0x00200| \1420x00100|(3<<6)|(3<<4)))143#define RDP_OM_MISSING2 (~(0xffff0000|0x4000|0x2000|0x1000|(3<<10)|(3<<8)| \1440x80|0x40|0x20|0x10|0x08|0x04|0x02|0x01))145146#define RDP_GETOM_CYCLE_TYPE(om) (((om).w1 >> 20) & 0x3)147#define RDP_GETOM_PERSP_TEX_EN(om) (((om).w1 & 0x80000) ? 1 : 0)148#define RDP_GETOM_DETAIL_TEX_EN(om) (((om).w1 & 0x40000) ? 1 : 0)149#define RDP_GETOM_SHARPEN_TEX_EN(om) (((om).w1 & 0x20000) ? 1 : 0)150#define RDP_GETOM_TEX_LOD_EN(om) (((om).w1 & 0x10000) ? 1 : 0)151#define RDP_GETOM_EN_TLUT(om) (((om).w1 & 0x08000) ? 1 : 0)152#define RDP_GETOM_TLUT_TYPE(om) (((om).w1 & 0x04000) ? 1 : 0)153#define RDP_GETOM_SAMPLE_TYPE(om) (((om).w1 & 0x02000) ? 1 : 0)154#define RDP_GETOM_MID_TEXEL(om) (((om).w1 & 0x01000) ? 1 : 0)155#define RDP_GETOM_BI_LERP0(om) (((om).w1 & 0x00800) ? 1 : 0)156#define RDP_GETOM_BI_LERP1(om) (((om).w1 & 0x00400) ? 1 : 0)157#define RDP_GETOM_CONVERT_ONE(om) (((om).w1 & 0x00200) ? 1 : 0)158#define RDP_GETOM_KEY_EN(om) (((om).w1 & 0x00100) ? 1 : 0)159#define RDP_GETOM_RGB_DITHER_SEL(om) (((om).w1 >> 6) & 0x3)160#define RDP_GETOM_ALPHA_DITHER_SEL(om) (((om).w1 >> 4) & 0x3)161#define RDP_GETOM_BLEND_M1A_0(om) (((om).w2 >> 30) & 0x3)162#define RDP_GETOM_BLEND_M1A_1(om) (((om).w2 >> 28) & 0x3)163#define RDP_GETOM_BLEND_M1B_0(om) (((om).w2 >> 26) & 0x3)164#define RDP_GETOM_BLEND_M1B_1(om) (((om).w2 >> 24) & 0x3)165#define RDP_GETOM_BLEND_M2A_0(om) (((om).w2 >> 22) & 0x3)166#define RDP_GETOM_BLEND_M2A_1(om) (((om).w2 >> 20) & 0x3)167#define RDP_GETOM_BLEND_M2B_0(om) (((om).w2 >> 18) & 0x3)168#define RDP_GETOM_BLEND_M2B_1(om) (((om).w2 >> 16) & 0x3)169#define RDP_GETOM_FORCE_BLEND(om) (((om).w2 & 0x4000) ? 1 : 0)170#define RDP_GETOM_ALPHA_CVG_SELECT(om) (((om).w2 & 0x2000) ? 1 : 0)171#define RDP_GETOM_CVG_TIMES_ALPHA(om) (((om).w2 & 0x1000) ? 1 : 0)172#define RDP_GETOM_Z_MODE(om) (((om).w2 >> 10) & 0x3)173#define RDP_GETOM_CVG_DEST(om) (((om).w2 >> 8) & 0x3)174#define RDP_GETOM_COLOR_ON_CVG(om) (((om).w2 & 0x80) ? 1 : 0)175#define RDP_GETOM_IMAGE_READ_EN(om) (((om).w2 & 0x40) ? 1 : 0)176#define RDP_GETOM_Z_UPDATE_EN(om) (((om).w2 & 0x20) ? 1 : 0)177#define RDP_GETOM_Z_COMPARE_EN(om) (((om).w2 & 0x10) ? 1 : 0)178#define RDP_GETOM_ANTIALIAS_EN(om) (((om).w2 & 0x08) ? 1 : 0)179#define RDP_GETOM_Z_SOURCE_SEL(om) (((om).w2 & 0x04) ? 1 : 0)180#define RDP_GETOM_DITHER_ALPHA_EN(om) (((om).w2 & 0x02) ? 1 : 0)181#define RDP_GETOM_ALPHA_COMPARE_EN(om) (((om).w2 & 0x01) ? 1 : 0)182183#define RDP_BLEND_MASK1 ((3u<<30)|(3u<<26)|(3u<<22)|(3u<<18))184#define RDP_BLEND_MASK2 ((3u<<28)|(3u<<24)|(3u<<20)|(3u<<16))185186static const rdpOtherModes_t rdpBlendMasks[4] = {187{ ~0u, ~RDP_BLEND_MASK2 },188{ ~0u, ~0u },189{ ~0u, ~(RDP_BLEND_MASK1|RDP_BLEND_MASK2) },190{ ~0u, ~(RDP_BLEND_MASK1|RDP_BLEND_MASK2) },191};192193struct rdpState_t {194rdpCombineModes_t combineModes;195rdpOtherModes_t otherModes;196rdpColor_t blendColor;197rdpColor_t primColor;198rdpColor_t envColor;199rdpColor_t fogColor;200rdpColor_t fillColor;201int primitiveZ;202int primitiveDeltaZ;203rdpRect_t clip;204uint8_t k5, clipMode;205};206207extern rdpState_t rdpState;208extern uint32_t rdpChanged;209//extern rdpColor_t rdpTlut[];210#define rdpTlut ((uint16_t *) (rdpTmem + 0x800))211extern uint8_t rdpTmem[];212extern int rdpFbFormat;213extern int rdpFbSize;214extern int rdpFbWidth;215extern uint32_t rdpFbAddress;216extern uint32_t rdpZbAddress;217extern int rdpTiFormat;218extern int rdpTiSize;219extern int rdpTiWidth;220extern uint32_t rdpTiAddress;221extern rdpTile_t rdpTiles[8];222extern int rdpTileSet;223224#define RDP_BITS_COMBINE_MODES (1<<0)225#define RDP_BITS_OTHER_MODES (1<<1)226#define RDP_BITS_CLIP (1<<2)227#define RDP_BITS_BLEND_COLOR (1<<3)228#define RDP_BITS_PRIM_COLOR (1<<4)229#define RDP_BITS_ENV_COLOR (1<<5)230#define RDP_BITS_FOG_COLOR (1<<6)231#define RDP_BITS_FB_SETTINGS (1<<7)232#define RDP_BITS_ZB_SETTINGS (1<<8)233#define RDP_BITS_TI_SETTINGS (1<<9)234#define RDP_BITS_TMEM (1<<10)235#define RDP_BITS_TLUT (1<<11)236#define RDP_BITS_TILE_SETTINGS (1<<12)237#define RDP_BITS_FILL_COLOR (1<<13)238#define RDP_BITS_MISC (1<<14)239240// return where the data in rdram came from at this address in tmem241uint32_t rdpGetTmemOrigin(int tmem, int * line, int * stop, int * fromFormat, int * size);242243244int rdp_init();245int rdp_dasm(uint32_t * rdp_cmd_data, int rdp_cmd_cur, int length, char *buffer);246void rdp_process_list(void);247int rdp_store_list(void);248249void rdp_log(m64p_msg_level level, const char *msg, ...);250251#ifdef RDP_DEBUG252253extern uint32_t rdpTraceBuf[];254extern int rdpTracePos;255256extern int rdp_dump;257258#define DUMP if (!rdp_dump) ; else LOG259260static void LOG(const char * s, ...)261{262va_list ap;263va_start(ap, s);264vfprintf(stderr, s, ap);265va_end(ap);266}267#define LOGERROR LOG268269#else // RDP_DEBUG270271#define DUMP(...) rdp_log(M64MSG_VERBOSE, __VA_ARGS__)272#define LOG(...) rdp_log(M64MSG_VERBOSE, __VA_ARGS__)273#define LOGERROR(...) rdp_log(M64MSG_WARNING, __VA_ARGS__)274275#endif // RDP_DEBUG276277278#endif // _RDP_H_279280281