00001 #include "dxlibp.h"
00002 #include <pspgu.h>
00003 #include <valloc.h>
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #define VRAM_BASE (0x44000000)
00024 #define VRAM_OFFSET2ADDRESS(OFFSET) (VRAM_BASE | OFFSET)
00025
00026 #define GULIST_LEN 262144
00027 #define GULIST_LIM 200000
00028
00029
00030 #define DXP_DRAWSTATE_EITHER 0xffffffff
00031 #define DXP_DRAWSTATE_NONTEX2D 0
00032 #define DXP_DRAWSTATE_TEX2D 1
00033 #define DXP_DRAWSTATE_NONTEX3D 2
00034 #define DXP_DRAWSTATE_TEX3D 3
00035 #define DXP_DRAWSTATE_INTRAFONT 4
00036
00037 #define GUENABLE(STATUS) {if(!sceGuGetStatus(STATUS))sceGuEnable(STATUS);}
00038 #define GUDISABLE(STATUS) {if(sceGuGetStatus(STATUS))sceGuDisable(STATUS);}
00039 #define GUINITCHECK {if(!dxpGraphicsData.init)return -1;}
00040 #define GUSTART {if(!dxpGraphicsData.gustarted){sceGuStart(GU_DIRECT,dxpGuList);dxpGraphicsData.gustarted = 1;}}
00041 #define GUFINISH {if(dxpGraphicsData.gustarted){sceGuFinish();dxpGraphicsData.gustarted = 0;}}
00042 #define GUSYNC {GUFINISH;sceGuSync(0,0);}
00043
00044 #define MIN(a,b) (a < b ? a : b)
00045 #define GHANDLE2GPTR(PTR,HANDLE) {if(HANDLE < 0 || HANDLE >= DXP_BUILDOPTION_GHANDLE_MAXNUM)return -1;PTR = dxpGraphicsData.grapharray[HANDLE];if(!PTR)return -1;if(!PTR->tex)return -1;}
00046
00047 static inline int dxpN_2(int num)
00048 {
00049 unsigned int i;
00050 num -= 1;
00051 __asm__(
00052 "clz %0, %1¥n"
00053 :"=r"(i):"r"(num)
00054 );
00055 return 1 << (32-i);
00056 }
00057
00058 static inline u32 dxpGraphics4444_8888(u32 src)
00059 {
00060 return ((src & 0xf000) << 28) | ((src & 0xf000) << 24) | ((src & 0x0f00) << 20) | ((src & 0x0f00) << 16) | ((src & 0x00f0) << 12) | ((src & 0x00f0) << 8 ) | ((src & 0x000f) << 4 ) | ((src & 0x000f) << 0 );
00061 }
00062
00063 static inline u32 dxpGraphics5551_8888(u32 src)
00064 {
00065 return ((src & 0x8000) << 16) | ((src & 0x8000) << 15) | ((src & 0x8000) << 14) | ((src & 0x8000) << 13) | ((src & 0x8000) << 12) | ((src & 0x8000) << 11) | ((src & 0x8000) << 10) | ((src & 0x8000) << 9) |
00066 ((src & 0x7c00) << 9) | ((src & 0x7000) << 4) | ((src & 0x03e0) << 6) | ((src & 0x0380) << 1) | ((src & 0x001f) << 3) | ((src & 0x001c) >> 2);
00067 }
00068
00069 static inline u32 dxpGraphics5650_8888(u32 src)
00070 {
00071 return 0xff000000 | ((src & 0xf800) << 8) | ((src & 0xe000) << 3) | ((src & 0x07e0) << 5) | ((src & 0x0600) >> 1) | ((src & 0x001f) << 3) | ((src & 0x001c) >> 2);
00072 }
00073
00074 static inline u32 dxpGraphics8888_4444(u32 src)
00075 {
00076 return ((src & 0xf0000000) >> 16) | ((src & 0x00f00000) >> 12) | ((src & 0x0000f000) >> 8 ) | ((src & 0x000000f0) >> 4 );
00077 }
00078
00079 static inline u32 dxpGraphics8888_5551(u32 src)
00080 {
00081 return ((src & 0x80000000) >> 16) | ((src & 0x00f80000) >> 9 ) | ((src & 0x0000f800) >> 6 ) | ((src & 0x000000f8) >> 3 );
00082 }
00083
00084 static inline u32 dxpGraphics8888_5650(u32 src)
00085 {
00086 return ((src & 0x00f80000) >> 8) | ((src & 0x0000fc00) >> 5) | ((src & 0x000000f8) >> 3);
00087 }
00088
00089
00090
00091
00092 #define DXP_VTYPE_2D (GU_VERTEX_16BIT)
00093 typedef struct DXP_FVF_2D
00094 {
00095 s16 x,y,z;
00096 }DXP_FVF_2D;
00097
00098 #define DXP_VTYPE_2DTEX (GU_VERTEX_16BIT | GU_TEXTURE_16BIT)
00099 typedef struct DXP_FVF_2DTEX
00100 {
00101 u16 u,v;
00102 s16 x,y,z;
00103 }DXP_FVF_2DTEX;
00104
00105 #define DXP_VTYPE_2DTEX_F (GU_VERTEX_32BITF | GU_TEXTURE_16BIT)
00106 typedef struct DXP_FVF_2DTEX_F
00107 {
00108 u16 u,v;
00109 float x,y,z;
00110 }DXP_FVF_2DTEX_F;
00111
00112 typedef struct DXPTEXTURE3
00113 {
00114 int psm;
00115 u32 *ppalette;
00116 void* texdata;
00117 void* texvram;
00118 u16 width;
00119 u16 height;
00120 u16 pitch;
00121 u16 umax,vmax;
00122 u32 colorkey;
00123
00124 unsigned size2_nflag:1;
00125 unsigned swizzledflag:1;
00126 unsigned reloadflag:1;
00127 unsigned alphabit:1;
00128 u32 refcount;
00129 struct DXPTEXTURE3 **thisptrptr;
00130 }DXPTEXTURE3;
00131
00132 typedef struct DXPGRAPHICSHANDLE
00133 {
00134 DXPTEXTURE3 *tex;
00135 u16 u0,v0,u1,v1;
00136 int handle;
00137 }DXPGRAPHICSHANDLE;
00138
00139 typedef struct DXPMATERIAL
00140 {
00141 const char *name;
00142 u32 emissive;
00143 u32 ambient;
00144 u32 diffuse;
00145 u32 specular;
00146 }DXPMATERIAL;
00147
00148 typedef struct DXPMESH
00149 {
00150 const char *name;
00151 }DXPMESH;
00152
00153 typedef struct DXPMODEL
00154 {
00155 }DXPMODEL;
00156
00157
00158 typedef struct DXPGRAPHICSDATA
00159 {
00160 unsigned init : 1;
00161 u32 display_psm;
00162 DXPTEXTURE3 displaybuffer[2];
00163 DXPTEXTURE3 *displaybuffer_back;
00164 DXPTEXTURE3 depthbuffer;
00165 DXPTEXTURE3 *rendertarget;
00166 DXPTEXTURE3 *texture;
00167
00168 void (*debugScreenCallback)();
00169
00170 u32 clear_color_value;
00171 u32 clear_depth_value;
00172 u32 clear_stencil_value;
00173
00174 unsigned gustarted : 1;
00175 unsigned clear_depth : 1;
00176 unsigned clear_stencil : 1;
00177 unsigned bilinear_enable : 1;
00178 unsigned create_vram_graph: 1;
00179 unsigned create_swizzled_graph: 1;
00180 unsigned usestencil:1;
00181 unsigned writestencil:1;
00182 unsigned waitvsinc:1;
00183
00184 u32 colorkey;
00185 int blendmode;
00186 u32 drawstate;
00187 int flag;
00188 unsigned forceupdate : 1;
00189 u16 z_2d;
00190 u32 color;
00191
00192 u32 gucolor;
00193 int op;
00194 int src;
00195 int dest;
00196 u32 srcfix;
00197 u32 destfix;
00198 int tfx,tcc;
00199 unsigned usedepth:1;
00200 unsigned writedepth:1;
00201 unsigned usedepth3d:1;
00202 unsigned writedepth3d:1;
00203 float fog_near,fog_far;
00204 u32 fog_color;
00205
00206 int intrafont_statebuf;
00207 int intrafont_scissor[4];
00208
00209
00210 DXPTEXTURE3 *texarray[DXP_BUILDOPTION_TEXTURE_MAXNUM];
00211 DXPGRAPHICSHANDLE *grapharray[DXP_BUILDOPTION_GHANDLE_MAXNUM];
00212 }DXPGRAPHICSDATA;
00213
00214 int dxpGraphicsInit();
00215 int dxpGraphicsEnd();
00216
00217 int dxpGraphicsCalcTexSize(int width,int height,int psm);
00218
00219 DXPTEXTURE3* dxpGraphicsCreateTexture();
00220 int dxpGraphicsReleseTexture(DXPTEXTURE3* texptr);
00221
00222 DXPGRAPHICSHANDLE* dxpGraphicsCreateGraphicHandle();
00223 int dxpGraphicsReleseGraphicHandle(DXPGRAPHICSHANDLE* gptr);
00224
00225 DXPTEXTURE3* dxpGraphHandle2TexPtr(int gh);
00226
00227 int dxpGraphicsSetup2DTex(DXPTEXTURE3 *texptr,int flag);
00228 int dxpGraphicsSetup2D(u32 color);
00229 void* dxpGuGetMemory(u32 size);
00230
00231 #define PSM2BYTEX2(PSM) (PSM == GU_PSM_5650 || PSM == GU_PSM_5551 || PSM == GU_PSM_4444 ? 4 : (PSM == GU_PSM_8888 ? 8 : (PSM == GU_PSM_T8 ? 2 : 1)))
00232
00233 void dxpGraphicsWaitVSync();
00234
00235
00236
00237 extern DXPGRAPHICSDATA dxpGraphicsData;
00238 extern u32 dxpGuList[GULIST_LEN];
00239 extern u8 dxpPsm2SliceSize[11][2];
00240