PS2SDK
PS2 Homebrew Libraries
draw.c
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 #include <syscallnr.h>
19 
20 #include "internal.h"
21 
22 extern QWORD GsPrimWorkArea[];
23 
24 void GsSetDefaultDrawEnv(GS_DRAWENV *drawenv, u16 psm, u16 w, u16 h)
25 {
26  drawenv->offset_x = 2048-w/2;
27  drawenv->offset_y = 2048-h/2;
28  drawenv->clip.x = 0;
29  drawenv->clip.y = 0;
30  drawenv->clip.w = w;
31  drawenv->clip.h = h;
32  drawenv->draw_mask = 0;
33  drawenv->auto_clear = 1;
34 
35  drawenv->bg_color.r = 0x01;
36  drawenv->bg_color.g = 0x01;
37  drawenv->bg_color.b = 0x01;
38  drawenv->bg_color.a = 0x80;
39  drawenv->bg_color.q = 0.0f;
40 
41  drawenv->fbw = (w+63)/64;
42  drawenv->psm = psm;
43  drawenv->vram_addr = 0;
44  drawenv->vram_x = 0;
45  drawenv->vram_y = 0;
46 }
47 
48 void GsSetDefaultDrawEnvAddress(GS_DRAWENV *drawenv, u16 vram_addr)
49 {
50  drawenv->vram_addr=vram_addr;
51 }
52 
53 void GsSetDefaultDisplayEnv(GS_DISPENV *dispenv, u16 psm, u16 w, u16 h, u16 dx, u16 dy)
54 {
55  GsGParam_t *pGParams;
56  int gs_DH, gs_DW, gs_DY, gs_DX;
57 
58  pGParams=GsGetGParam();
59  dispenv->disp.pad1=dispenv->disp.pad2=0;
60 
61  if(pGParams->omode >= GS_MODE_NTSC && pGParams->omode <= GS_MODE_PAL)
62  {
63  gs_DH=0;
64  gs_DW=0;
65  gs_DY=0;
66  gs_DX=0;
67  } else {
68  if(GetSyscallHandler(__NR__GetGsDxDyOffset))
69  _GetGsDxDyOffset(pGParams->omode, &gs_DX, &gs_DY, &gs_DW, &gs_DH);
70  else{
71  gs_DH=0;
72  gs_DW=0;
73  gs_DY=0;
74  gs_DX=0;
75  }
76  }
77 
78  dispenv->dispfb.pad1=dispenv->dispfb.pad2=0;
79  dispenv->dispfb.x=0;
80  dispenv->dispfb.y=0;
81  dispenv->dispfb.address=0;
82  dispenv->dispfb.fbw=(w+63)/64;
83  dispenv->dispfb.psm=psm;
84  switch(pGParams->omode)
85  {
86  case GS_MODE_NTSC:
87  if(pGParams->interlace)
88  {
89  dispenv->disp.display_y = dy+gs_DY+0x32;
90  dispenv->disp.display_x = (gs_DX+0x27C) + dx*((w+0x9FF)/w);
91  dispenv->disp.magnify_h = (w+0x9FF)/w - 1;
92  dispenv->disp.magnify_v = 0;
93  dispenv->disp.display_w = (w+0x9FF)/w*w - 1;
94 
95  if(pGParams->ffmode)
96  dispenv->disp.display_h = (h<<1) - 1;
97  else
98  dispenv->disp.display_h = h - 1;
99  } else {
100  dispenv->disp.display_h = h-1;
101  dispenv->disp.display_x = gs_DX+0x27C + dx*((w+0x9FF)/w);
102  dispenv->disp.display_y = gs_DY+dy+0x19;
103  dispenv->disp.magnify_h = (w+0x9FF)/w - 1;
104  dispenv->disp.magnify_v = 0;
105  dispenv->disp.display_w = (w+0x9FF)/w*w - 1;
106  }
107  break;
108  case GS_MODE_PAL:
109  if(pGParams->interlace)
110  {
111  dispenv->disp.display_y = gs_DY+dy+0x48;
112  dispenv->disp.display_x = gs_DX+0x290 + dx*((w+0x9FF)/w);
113  dispenv->disp.magnify_h = (w+0x9FF)/w - 1;
114  dispenv->disp.magnify_v = 0;
115  dispenv->disp.display_w = (w+0x9FF)/w*w - 1;
116 
117  if(pGParams->ffmode)
118  dispenv->disp.display_h = (h<<1) - 1;
119  else
120  dispenv->disp.display_h = h - 1;
121  } else {
122  dispenv->disp.display_h = h-1;
123  dispenv->disp.display_x = gs_DX+0x290 + dx*((w+0x9FF)/w);
124  dispenv->disp.display_y = dy+gs_DY+0x48;
125  dispenv->disp.magnify_h = (w+0x9FF)/w - 1;
126  dispenv->disp.magnify_v = 0;
127  dispenv->disp.display_w = (w+0x9FF)/w*w - 1;
128  }
129  break;
130  case GS_MODE_DTV_480P:
131  dispenv->disp.display_x = gs_DX+((0x2D0-w) + ((0x2D0-w)>>31))/2*2 + (dx<<1)+0xE8;
132  dispenv->disp.display_h = h-1;
133  dispenv->disp.display_w = (w<<1) - 1;
134  dispenv->disp.display_y = gs_DY+dy+0x23;
135  dispenv->disp.magnify_h = 1;
136  dispenv->disp.magnify_v = 0;
137  break;
138  default:
139  printf("GsSetDefaultDisplayEnv: Unsupported video mode: 0x%x\n", pGParams->omode);
140  }
141 }
142 
143 void GsSetDefaultDisplayEnvAddress(GS_DISPENV *dispenv, unsigned short vram_addr)
144 {
145  dispenv->dispfb.address=vram_addr;
146 }
147 
148 void GsPutDrawEnv1(GS_DRAWENV *drawenv)
149 {
150  GsSetXYOffset1(drawenv->offset_x<<4, drawenv->offset_y<<4);
151  GsSetScissor1(drawenv->clip.x, drawenv->clip.y, drawenv->clip.x+drawenv->clip.w, drawenv->clip.y+drawenv->clip.h);
152  GsSetFrame1(drawenv->vram_addr, drawenv->fbw, drawenv->psm, drawenv->draw_mask);
153 
154  //use a sprite to clear background
155  if(drawenv->auto_clear)
156  {
157  GsClearDrawEnv1(drawenv);
158  }
159 }
160 
162 {
163  unsigned char context;
164  QWORD *p;
165 
166  // use a sprite to clear background
167  context =0; // contex 1
168 
169  p=UNCACHED_SEG(GsPrimWorkArea);
170  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 4,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
171  gs_setR_PRIM(((GS_R_PRIM *)&p[1]), GS_PRIM_SPRITE,0, 0, 0, 1, 0, 1, context, 0);
172  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);
173  gs_setR_XYZ2(((GS_R_XYZ *)&p[3]), (drawenv->offset_x+drawenv->clip.x)<<4, (drawenv->offset_y+drawenv->clip.y)<<4, 0x00000000);
174  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);
175 
176  GsDmaSend(GsPrimWorkArea, 5);
177  GsDmaWait();
178 }
179 
180 void GsPutDisplayEnv1(GS_DISPENV *dispenv)
181 {
182  *((volatile GS_DISPLAY *)(gs_p_display1)) = dispenv->disp;
183  *((volatile GS_DISPFB *)(gs_p_dispfb1)) = dispenv->dispfb;
184 }
185 
186 void GsPutDrawEnv2(GS_DRAWENV *drawenv)
187 {
188  GsSetXYOffset2(drawenv->offset_x<<4, drawenv->offset_y<<4);
189  GsSetScissor2(drawenv->clip.x, drawenv->clip.y, drawenv->clip.x+drawenv->clip.w, drawenv->clip.y+drawenv->clip.h);
190  GsSetFrame2(drawenv->vram_addr, drawenv->fbw, drawenv->psm, drawenv->draw_mask);
191 
192  if(drawenv->auto_clear)
193  {
194  GsClearDrawEnv2(drawenv);
195  }
196 }
197 
199 {
200  unsigned char context;
201  QWORD *p;
202 
203  // use a sprite to clear background
204  context =1; // contex 2
205 
206  p=UNCACHED_SEG(GsPrimWorkArea);
207  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 4,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
208  gs_setR_PRIM(((GS_R_PRIM *)&p[1]), GS_PRIM_SPRITE,0, 0, 0, 1, 0, 1, context, 0);
209  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);
210  gs_setR_XYZ2(((GS_R_XYZ *)&p[3]), (drawenv->offset_x+drawenv->clip.x)<<4, (drawenv->offset_y+drawenv->clip.y)<<4, 0x00000000);
211  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);
212 
213  GsDmaSend(GsPrimWorkArea, 5);
214  GsDmaWait();
215 }
216 
217 void GsPutDisplayEnv2(GS_DISPENV *dispenv)
218 {
219  *((volatile GS_DISPLAY *)(gs_p_display2)) = dispenv->disp;
220  *((volatile GS_DISPFB *)(gs_p_dispfb2)) = dispenv->dispfb;
221 }
kernel.h
GS_DISPFB::pad2
u32 pad2
Definition: libgs.h:419
GS_DISPLAY::display_h
u32 display_h
Definition: libgs.h:436
GsGParam_t
Definition: libgs.h:21
GS_DISPLAY::display_y
u32 display_y
Definition: libgs.h:426
GS_DISPENV
Definition: libgs.h:1967
GsGParam_t::ffmode
u8 ffmode
Definition: libgs.h:27
GS_R_RGBAQ
Definition: libgs.h:945
GS_R_XYZ
Definition: libgs.h:965
GS_DISPFB::fbw
u32 fbw
Definition: libgs.h:409
GS_PRIM_SPRITE
#define GS_PRIM_SPRITE
Definition: gs_gp.h:163
GS_GIF_TAG
Definition: libgs.h:1859
gif_rd_ad
#define gif_rd_ad
Definition: libgs.h:326
GS_DISPLAY::pad1
u32 pad1
Definition: libgs.h:432
GS_DISPLAY::pad2
u32 pad2
Definition: libgs.h:438
GS_DISPFB::pad1
u32 pad1
Definition: libgs.h:413
gs_p_display2
#define gs_p_display2
Definition: libgs.h:202
GS_DISPFB
Definition: libgs.h:405
syscallnr.h
gs_p_display1
#define gs_p_display1
Definition: libgs.h:198
stdio.h
GsClearDrawEnv1
void GsClearDrawEnv1(GS_DRAWENV *drawenv)
Definition: draw.c:161
GS_DISPFB::psm
u32 psm
Definition: libgs.h:411
GS_DISPLAY
Definition: libgs.h:422
gs_p_dispfb2
#define gs_p_dispfb2
Definition: libgs.h:200
libgs.h
GS_DISPFB::x
u32 x
Definition: libgs.h:415
GsClearDrawEnv2
void GsClearDrawEnv2(GS_DRAWENV *drawenv)
Definition: draw.c:198
GS_DISPLAY::display_w
u32 display_w
Definition: libgs.h:434
GS_DISPLAY::display_x
u32 display_x
Definition: libgs.h:424
gs_p_dispfb1
#define gs_p_dispfb1
Definition: libgs.h:196
GS_DISPFB::address
u32 address
Definition: libgs.h:407
GS_DISPLAY::magnify_v
u32 magnify_v
Definition: libgs.h:430
stdlib.h
QWORD
Definition: libgs.h:333
GsGParam_t::omode
u8 omode
Definition: libgs.h:25
GS_DISPFB::y
u32 y
Definition: libgs.h:417
GS_DISPLAY::magnify_h
u32 magnify_h
Definition: libgs.h:428
errno.h
GsGParam_t::interlace
u8 interlace
Definition: libgs.h:23
GS_R_PRIM
Definition: libgs.h:940
GS_DRAWENV
Definition: libgs.h:1940