ps2sdk  1.1
A collection of Open Source libraries used for developing applications on Sony's PlayStation 2® (PS2).
draw.c
Go to the documentation of this file.
1 /*
2 # _____ ___ ____ ___ ____
3 # ____| | ____| | | |____|
4 # | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5 #-----------------------------------------------------------------------
6 # (c) 2009 Lion
7 # Licenced under Academic Free License version 2.0
8 # Review ps2sdk README & LICENSE files for further details.
9 */
10 
11 #include <errno.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <sys/fcntl.h>
15 #include <sys/unistd.h>
16 #include <kernel.h>
17 #include <libgs.h>
18 
19 #include "internal.h"
20 
21 extern QWORD GsPrimWorkArea[];
22 
23 void GsSetDefaultDrawEnv(GS_DRAWENV *drawenv, u16 psm, u16 w, u16 h)
24 {
25  drawenv->offset_x = 2048-w/2;
26  drawenv->offset_y = 2048-h/2;
27  drawenv->clip.x = 0;
28  drawenv->clip.y = 0;
29  drawenv->clip.w = w;
30  drawenv->clip.h = h;
31  drawenv->draw_mask = 0;
32  drawenv->auto_clear = 1;
33 
34  drawenv->bg_color.r = 0x01;
35  drawenv->bg_color.g = 0x01;
36  drawenv->bg_color.b = 0x01;
37  drawenv->bg_color.a = 0x80;
38  drawenv->bg_color.q = 0.0f;
39 
40  drawenv->fbw = (w+63)/64;
41  drawenv->psm = psm;
42  drawenv->vram_addr = 0;
43  drawenv->vram_x = 0;
44  drawenv->vram_y = 0;
45 }
46 
47 void GsSetDefaultDrawEnvAddress(GS_DRAWENV *drawenv, u16 vram_addr)
48 {
49  drawenv->vram_addr=vram_addr;
50 }
51 
53 {
54  int fd, result, i;
55  char data[256], *pData;
56 
57  if((fd=open("rom0:ROMVER", O_RDONLY))>=0)
58  {
59  for(pData=data,i=0; i<sizeof(data); i++)
60  {
61  read(fd, pData, 1);
62  if(*pData++=='\0') break;
63  }
64  close(fd);
65 
66  //ROMVER string format: VVVVRTYYYYMMDD\n
67  result=(20010608<atoi(data+i-9));
68  }
69  else result=-1;
70 
71  return result;
72 }
73 
74 void GsSetDefaultDisplayEnv(GS_DISPENV *dispenv, u16 psm, u16 w, u16 h, u16 dx, u16 dy)
75 {
76  GsGParam_t *pGParams;
77  int gs_DH, gs_DW, gs_DY, gs_DX;
78 
79  pGParams=GsGetGParam();
80  dispenv->disp.pad1=dispenv->disp.pad2=0;
81 
82  if(pGParams->omode >= GS_MODE_NTSC && pGParams->omode <= GS_MODE_PAL)
83  {
84  gs_DH=0;
85  gs_DW=0;
86  gs_DY=0;
87  gs_DX=0;
88  } else {
89  if(checkModelVersion())
90  _GetGsDxDyOffset(pGParams->omode, &gs_DX, &gs_DY, &gs_DW, &gs_DH);
91  else{
92  gs_DH=0;
93  gs_DW=0;
94  gs_DY=0;
95  gs_DX=0;
96  }
97  }
98 
99  dispenv->dispfb.pad1=dispenv->dispfb.pad2=0;
100  dispenv->dispfb.x=0;
101  dispenv->dispfb.y=0;
102  dispenv->dispfb.address=0;
103  dispenv->dispfb.fbw=(w+63)/64;
104  dispenv->dispfb.psm=psm;
105  switch(pGParams->omode)
106  {
107  case GS_MODE_NTSC:
108  if(pGParams->interlace)
109  {
110  dispenv->disp.display_y = dy+gs_DY+0x32;
111  dispenv->disp.display_x = (gs_DX+0x27C) + dx*((w+0x9FF)/w);
112  dispenv->disp.magnify_h = (w+0x9FF)/w - 1;
113  dispenv->disp.magnify_v = 0;
114  dispenv->disp.display_w = (w+0x9FF)/w*w - 1;
115 
116  if(pGParams->ffmode)
117  dispenv->disp.display_h = (h<<1) - 1;
118  else
119  dispenv->disp.display_h = h - 1;
120  } else {
121  dispenv->disp.display_h = h-1;
122  dispenv->disp.display_x = gs_DX+0x27C + dx*((w+0x9FF)/w);
123  dispenv->disp.display_y = gs_DY+dy+0x19;
124  dispenv->disp.magnify_h = (w+0x9FF)/w - 1;
125  dispenv->disp.magnify_v = 0;
126  dispenv->disp.display_w = (w+0x9FF)/w*w - 1;
127  }
128  break;
129  case GS_MODE_PAL:
130  if(pGParams->interlace)
131  {
132  dispenv->disp.display_y = gs_DY+dy+0x48;
133  dispenv->disp.display_x = gs_DX+0x290 + dx*((w+0x9FF)/w);
134  dispenv->disp.magnify_h = (w+0x9FF)/w - 1;
135  dispenv->disp.magnify_v = 0;
136  dispenv->disp.display_w = (w+0x9FF)/w*w - 1;
137 
138  if(pGParams->ffmode)
139  dispenv->disp.display_h = (h<<1) - 1;
140  else
141  dispenv->disp.display_h = h - 1;
142  } else {
143  dispenv->disp.display_h = h-1;
144  dispenv->disp.display_x = gs_DX+0x290 + dx*((w+0x9FF)/w);
145  dispenv->disp.display_y = dy+gs_DY+0x48;
146  dispenv->disp.magnify_h = (w+0x9FF)/w - 1;
147  dispenv->disp.magnify_v = 0;
148  dispenv->disp.display_w = (w+0x9FF)/w*w - 1;
149  }
150  break;
151  case GS_MODE_DTV_480P:
152  dispenv->disp.display_x = gs_DX+((0x2D0-w) + ((0x2D0-w)>>31))/2*2 + (dx<<1)+0xE8;
153  dispenv->disp.display_h = h-1;
154  dispenv->disp.display_w = (w<<1) - 1;
155  dispenv->disp.display_y = gs_DY+dy+0x23;
156  dispenv->disp.magnify_h = 1;
157  dispenv->disp.magnify_v = 0;
158  break;
159  default:
160  printf("GsSetDefaultDisplayEnv: Unsupported video mode: 0x%x\n", pGParams->omode);
161  }
162 }
163 
164 void GsSetDefaultDisplayEnvAddress(GS_DISPENV *dispenv, unsigned short vram_addr)
165 {
166  dispenv->dispfb.address=vram_addr;
167 }
168 
169 void GsPutDrawEnv1(GS_DRAWENV *drawenv)
170 {
171  GsSetXYOffset1(drawenv->offset_x<<4, drawenv->offset_y<<4);
172  GsSetScissor1(drawenv->clip.x, drawenv->clip.y, drawenv->clip.x+drawenv->clip.w, drawenv->clip.y+drawenv->clip.h);
173  GsSetFrame1(drawenv->vram_addr, drawenv->fbw, drawenv->psm, drawenv->draw_mask);
174 
175  //use a sprite to clear background
176  if(drawenv->auto_clear)
177  {
178  GsClearDrawEnv1(drawenv);
179  }
180 }
181 
183 {
184  unsigned char context;
185  QWORD *p;
186 
187  // use a sprite to clear background
188  context =0; // contex 1
189 
191  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 4,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
192  gs_setR_PRIM(((GS_R_PRIM *)&p[1]), GS_PRIM_SPRITE,0, 0, 0, 1, 0, 1, context, 0);
193  gs_setR_RGBAQ(((GS_R_RGBAQ *)&p[2]), drawenv->bg_color.r, drawenv->bg_color.g, drawenv->bg_color.b, drawenv->bg_color.a, drawenv->bg_color.q);
194  gs_setR_XYZ2(((GS_R_XYZ *)&p[3]), (drawenv->offset_x+drawenv->clip.x)<<4, (drawenv->offset_y+drawenv->clip.y)<<4, 0x00000000);
195  gs_setR_XYZ2(((GS_R_XYZ *)&p[4]), (drawenv->offset_x+drawenv->clip.x+drawenv->clip.w)<<4, (drawenv->offset_y+drawenv->clip.y+drawenv->clip.h)<<4, 0x00000000);
196 
198  GsDmaWait();
199 }
200 
202 {
203  *((volatile GS_DISPLAY *)(gs_p_display1)) = dispenv->disp;
204  *((volatile GS_DISPFB *)(gs_p_dispfb1)) = dispenv->dispfb;
205 }
206 
207 void GsPutDrawEnv2(GS_DRAWENV *drawenv)
208 {
209  GsSetXYOffset2(drawenv->offset_x<<4, drawenv->offset_y<<4);
210  GsSetScissor2(drawenv->clip.x, drawenv->clip.y, drawenv->clip.x+drawenv->clip.w, drawenv->clip.y+drawenv->clip.h);
211  GsSetFrame2(drawenv->vram_addr, drawenv->fbw, drawenv->psm, drawenv->draw_mask);
212 
213  if(drawenv->auto_clear)
214  {
215  GsClearDrawEnv2(drawenv);
216  }
217 }
218 
220 {
221  unsigned char context;
222  QWORD *p;
223 
224  // use a sprite to clear background
225  context =1; // contex 2
226 
228  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 4,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
229  gs_setR_PRIM(((GS_R_PRIM *)&p[1]), GS_PRIM_SPRITE,0, 0, 0, 1, 0, 1, context, 0);
230  gs_setR_RGBAQ(((GS_R_RGBAQ *)&p[2]), drawenv->bg_color.r, drawenv->bg_color.g, drawenv->bg_color.b, drawenv->bg_color.a, drawenv->bg_color.q);
231  gs_setR_XYZ2(((GS_R_XYZ *)&p[3]), (drawenv->offset_x+drawenv->clip.x)<<4, (drawenv->offset_y+drawenv->clip.y)<<4, 0x00000000);
232  gs_setR_XYZ2(((GS_R_XYZ *)&p[4]), (drawenv->offset_x+drawenv->clip.x+drawenv->clip.w)<<4, (drawenv->offset_y+drawenv->clip.y+drawenv->clip.h)<<4, 0x00000000);
233 
235  GsDmaWait();
236 }
237 
239 {
240  *((volatile GS_DISPLAY *)(gs_p_display2)) = dispenv->disp;
241  *((volatile GS_DISPFB *)(gs_p_dispfb2)) = dispenv->dispfb;
242 }
u8 context
Definition: main.c:71
#define UNCACHED_SEG(x)
Definition: kernel.h:35
void _GetGsDxDyOffset(int mode, int *dx, int *dy, int *dw, int *dh)
void GsDmaWait(void)
Definition: dma.c:148
void GsDmaSend(const void *addr, u32 qwords)
Definition: dma.c:88
void GsSetDefaultDrawEnvAddress(GS_DRAWENV *drawenv, u16 vram_addr)
Definition: draw.c:47
void GsPutDisplayEnv1(GS_DISPENV *dispenv)
Definition: draw.c:201
void GsPutDisplayEnv2(GS_DISPENV *dispenv)
Definition: draw.c:238
QWORD GsPrimWorkArea[]
Definition: packets.c:18
void GsClearDrawEnv2(GS_DRAWENV *drawenv)
Definition: draw.c:219
int checkModelVersion(void)
Definition: draw.c:52
void GsSetDefaultDisplayEnv(GS_DISPENV *dispenv, u16 psm, u16 w, u16 h, u16 dx, u16 dy)
Definition: draw.c:74
void GsPutDrawEnv2(GS_DRAWENV *drawenv)
Definition: draw.c:207
void GsSetDefaultDisplayEnvAddress(GS_DISPENV *dispenv, unsigned short vram_addr)
Definition: draw.c:164
void GsSetDefaultDrawEnv(GS_DRAWENV *drawenv, u16 psm, u16 w, u16 h)
Definition: draw.c:23
void GsPutDrawEnv1(GS_DRAWENV *drawenv)
Definition: draw.c:169
void GsClearDrawEnv1(GS_DRAWENV *drawenv)
Definition: draw.c:182
#define gs_p_display2
Definition: libgs.h:202
@ GS_MODE_PAL
Definition: libgs.h:57
@ GS_MODE_DTV_480P
Definition: libgs.h:59
@ GS_MODE_NTSC
Definition: libgs.h:56
int GsSetFrame2(u16 framebuffer_addr, u8 framebuffer_width, u8 psm, u32 draw_mask)
Definition: lowlevel.c:101
#define gs_setR_RGBAQ(p, _r, _g, _b, _a, _q)
Definition: libgs.h:1631
int GsSetXYOffset2(u16 x, u16 y)
Definition: lowlevel.c:49
#define gs_setR_XYZ2(p, _x, _y, _z)
Definition: libgs.h:1651
#define gs_p_dispfb1
Definition: libgs.h:196
int GsSetXYOffset1(u16 x, u16 y)
Definition: lowlevel.c:36
#define gs_setGIF_TAG(p, _nloop, _eop, _pre, _prim, _flg, _nreg, _reg)
Definition: libgs.h:1870
#define gif_rd_ad
Definition: libgs.h:326
int GsSetScissor1(u16 upper_x, u16 upper_y, u16 lower_x, u16 lower_y)
Definition: lowlevel.c:62
int GsSetFrame1(u16 framebuffer_addr, u8 framebuffer_width, u8 psm, u32 draw_mask)
Definition: lowlevel.c:88
#define gs_p_dispfb2
Definition: libgs.h:200
int GsSetScissor2(u16 upper_x, u16 upper_y, u16 lower_x, u16 lower_y)
Definition: lowlevel.c:75
#define gs_p_display1
Definition: libgs.h:198
GsGParam_t * GsGetGParam(void)
Definition: libgs.c:24
@ GS_GIF_PACKED
Definition: libgs.h:181
#define gs_setR_PRIM(p, _prim_type, _iip, _tme, _fge, _abe, _aa1, _fst, _ctxt, _fix)
Definition: libgs.h:1627
@ GS_PRIM_SPRITE
Definition: libgs.h:73
u32 data
Definition: libmouse.c:36
s32 result
Definition: rpc_client.c:23
GS_DISPFB dispfb
Definition: libgs.h:1969
GS_DISPLAY disp
Definition: libgs.h:1968
u32 fbw
Definition: libgs.h:409
u32 pad2
Definition: libgs.h:419
u32 x
Definition: libgs.h:415
u32 psm
Definition: libgs.h:411
u32 y
Definition: libgs.h:417
u32 address
Definition: libgs.h:407
u32 pad1
Definition: libgs.h:413
u32 display_w
Definition: libgs.h:434
u32 display_x
Definition: libgs.h:424
u32 pad2
Definition: libgs.h:438
u32 pad1
Definition: libgs.h:432
u32 display_y
Definition: libgs.h:426
u32 magnify_h
Definition: libgs.h:428
u32 display_h
Definition: libgs.h:436
u32 magnify_v
Definition: libgs.h:430
u8 psm
Definition: libgs.h:1952
u16 offset_y
Definition: libgs.h:1944
GS_RGBAQ bg_color
Definition: libgs.h:1962
u8 auto_clear
Definition: libgs.h:1960
u16 vram_y
Definition: libgs.h:1956
u16 vram_x
Definition: libgs.h:1954
u8 fbw
Definition: libgs.h:1950
u16 vram_addr
Definition: libgs.h:1948
u32 draw_mask
Definition: libgs.h:1958
u16 offset_x
Definition: libgs.h:1942
GS_URECT clip
Definition: libgs.h:1946
u8 a
Definition: libgs.h:598
u8 r
Definition: libgs.h:595
u8 b
Definition: libgs.h:597
u8 g
Definition: libgs.h:596
float q
Definition: libgs.h:599
u16 w
Definition: libgs.h:1916
u16 x
Definition: libgs.h:1914
u16 h
Definition: libgs.h:1917
u16 y
Definition: libgs.h:1915
u8 interlace
Definition: libgs.h:23
u8 ffmode
Definition: libgs.h:27
u8 omode
Definition: libgs.h:25
Definition: libgs.h:333
unsigned short u16
Definition: tamtypes.h:24