ps2sdk  1.1
A collection of Open Source libraries used for developing applications on Sony's PlayStation 2® (PS2).
draw.c File Reference
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/fcntl.h>
#include <sys/unistd.h>
#include <kernel.h>
#include <libgs.h>
#include "internal.h"
+ Include dependency graph for draw.c:

Go to the source code of this file.

Functions

void GsSetDefaultDrawEnv (GS_DRAWENV *drawenv, u16 psm, u16 w, u16 h)
 
void GsSetDefaultDrawEnvAddress (GS_DRAWENV *drawenv, u16 vram_addr)
 
int checkModelVersion (void)
 
void GsSetDefaultDisplayEnv (GS_DISPENV *dispenv, u16 psm, u16 w, u16 h, u16 dx, u16 dy)
 
void GsSetDefaultDisplayEnvAddress (GS_DISPENV *dispenv, unsigned short vram_addr)
 
void GsPutDrawEnv1 (GS_DRAWENV *drawenv)
 
void GsClearDrawEnv1 (GS_DRAWENV *drawenv)
 
void GsPutDisplayEnv1 (GS_DISPENV *dispenv)
 
void GsPutDrawEnv2 (GS_DRAWENV *drawenv)
 
void GsClearDrawEnv2 (GS_DRAWENV *drawenv)
 
void GsPutDisplayEnv2 (GS_DISPENV *dispenv)
 

Variables

QWORD GsPrimWorkArea []
 

Function Documentation

◆ checkModelVersion()

int checkModelVersion ( void  )

Definition at line 52 of file draw.c.

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 }
u32 data
Definition: libmouse.c:36
s32 result
Definition: rpc_client.c:23

References data, and result.

Referenced by GsSetDefaultDisplayEnv().

◆ GsClearDrawEnv1()

void GsClearDrawEnv1 ( GS_DRAWENV drawenv)

clear draw buffer with GS_DRAWENV->bg_color color (contex 1)

Definition at line 182 of file draw.c.

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 }
u8 context
Definition: main.c:71
#define UNCACHED_SEG(x)
Definition: kernel.h:35
void GsDmaWait(void)
Definition: dma.c:148
void GsDmaSend(const void *addr, u32 qwords)
Definition: dma.c:88
QWORD GsPrimWorkArea[]
Definition: packets.c:18
#define gs_setR_RGBAQ(p, _r, _g, _b, _a, _q)
Definition: libgs.h:1631
#define gs_setR_XYZ2(p, _x, _y, _z)
Definition: libgs.h:1651
#define gs_setGIF_TAG(p, _nloop, _eop, _pre, _prim, _flg, _nreg, _reg)
Definition: libgs.h:1870
#define gif_rd_ad
Definition: libgs.h:326
@ 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
u16 offset_y
Definition: libgs.h:1944
GS_RGBAQ bg_color
Definition: libgs.h:1962
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
Definition: libgs.h:333

References GS_RGBAQ::a, GS_RGBAQ::b, GS_DRAWENV::bg_color, GS_DRAWENV::clip, context, GS_RGBAQ::g, gif_rd_ad, GS_GIF_PACKED, GS_PRIM_SPRITE, gs_setGIF_TAG, gs_setR_PRIM, gs_setR_RGBAQ, gs_setR_XYZ2, GsDmaSend(), GsDmaWait(), GsPrimWorkArea, GS_URECT::h, GS_DRAWENV::offset_x, GS_DRAWENV::offset_y, GS_RGBAQ::q, GS_RGBAQ::r, UNCACHED_SEG, GS_URECT::w, GS_URECT::x, and GS_URECT::y.

Referenced by ClearDrawingContext(), GsPutDrawEnv1(), and main().

◆ GsClearDrawEnv2()

void GsClearDrawEnv2 ( GS_DRAWENV drawenv)

clear draw buffer with GS_DRAWENV->bg_color color (contex 2)

Definition at line 219 of file draw.c.

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 }

References GS_RGBAQ::a, GS_RGBAQ::b, GS_DRAWENV::bg_color, GS_DRAWENV::clip, context, GS_RGBAQ::g, gif_rd_ad, GS_GIF_PACKED, GS_PRIM_SPRITE, gs_setGIF_TAG, gs_setR_PRIM, gs_setR_RGBAQ, gs_setR_XYZ2, GsDmaSend(), GsDmaWait(), GsPrimWorkArea, GS_URECT::h, GS_DRAWENV::offset_x, GS_DRAWENV::offset_y, GS_RGBAQ::q, GS_RGBAQ::r, UNCACHED_SEG, GS_URECT::w, GS_URECT::x, and GS_URECT::y.

Referenced by ClearDrawingContext(), and GsPutDrawEnv2().

◆ GsPutDisplayEnv1()

void GsPutDisplayEnv1 ( GS_DISPENV dispenv)

Definition at line 201 of file draw.c.

202 {
203  *((volatile GS_DISPLAY *)(gs_p_display1)) = dispenv->disp;
204  *((volatile GS_DISPFB *)(gs_p_dispfb1)) = dispenv->dispfb;
205 }
#define gs_p_dispfb1
Definition: libgs.h:196
#define gs_p_display1
Definition: libgs.h:198
GS_DISPFB dispfb
Definition: libgs.h:1969
GS_DISPLAY disp
Definition: libgs.h:1968

References GS_DISPENV::disp, GS_DISPENV::dispfb, gs_p_dispfb1, and gs_p_display1.

Referenced by InitGraphics().

◆ GsPutDisplayEnv2()

void GsPutDisplayEnv2 ( GS_DISPENV dispenv)

Definition at line 238 of file draw.c.

239 {
240  *((volatile GS_DISPLAY *)(gs_p_display2)) = dispenv->disp;
241  *((volatile GS_DISPFB *)(gs_p_dispfb2)) = dispenv->dispfb;
242 }
#define gs_p_display2
Definition: libgs.h:202
#define gs_p_dispfb2
Definition: libgs.h:200

References GS_DISPENV::disp, GS_DISPENV::dispfb, gs_p_dispfb2, and gs_p_display2.

Referenced by InitGraphics().

◆ GsPutDrawEnv1()

void GsPutDrawEnv1 ( GS_DRAWENV drawenv)

Definition at line 169 of file draw.c.

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 }
void GsClearDrawEnv1(GS_DRAWENV *drawenv)
Definition: draw.c:182
int GsSetXYOffset1(u16 x, u16 y)
Definition: lowlevel.c:36
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
u8 psm
Definition: libgs.h:1952
u8 auto_clear
Definition: libgs.h:1960
u8 fbw
Definition: libgs.h:1950
u16 vram_addr
Definition: libgs.h:1948
u32 draw_mask
Definition: libgs.h:1958

References GS_DRAWENV::auto_clear, GS_DRAWENV::clip, GS_DRAWENV::draw_mask, GS_DRAWENV::fbw, GsClearDrawEnv1(), GsSetFrame1(), GsSetScissor1(), GsSetXYOffset1(), GS_URECT::h, GS_DRAWENV::offset_x, GS_DRAWENV::offset_y, GS_DRAWENV::psm, GS_DRAWENV::vram_addr, GS_URECT::w, GS_URECT::x, and GS_URECT::y.

Referenced by InitGraphics().

◆ GsPutDrawEnv2()

void GsPutDrawEnv2 ( GS_DRAWENV drawenv)

Definition at line 207 of file draw.c.

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 }
void GsClearDrawEnv2(GS_DRAWENV *drawenv)
Definition: draw.c:219
int GsSetFrame2(u16 framebuffer_addr, u8 framebuffer_width, u8 psm, u32 draw_mask)
Definition: lowlevel.c:101
int GsSetXYOffset2(u16 x, u16 y)
Definition: lowlevel.c:49
int GsSetScissor2(u16 upper_x, u16 upper_y, u16 lower_x, u16 lower_y)
Definition: lowlevel.c:75

References GS_DRAWENV::auto_clear, GS_DRAWENV::clip, GS_DRAWENV::draw_mask, GS_DRAWENV::fbw, GsClearDrawEnv2(), GsSetFrame2(), GsSetScissor2(), GsSetXYOffset2(), GS_URECT::h, GS_DRAWENV::offset_x, GS_DRAWENV::offset_y, GS_DRAWENV::psm, GS_DRAWENV::vram_addr, GS_URECT::w, GS_URECT::x, and GS_URECT::y.

Referenced by InitGraphics().

◆ GsSetDefaultDisplayEnv()

void GsSetDefaultDisplayEnv ( GS_DISPENV dispenv,
u16  psm,
u16  w,
u16  h,
u16  dx,
u16  dy 
)

Definition at line 74 of file draw.c.

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 }
void _GetGsDxDyOffset(int mode, int *dx, int *dy, int *dw, int *dh)
int checkModelVersion(void)
Definition: draw.c:52
@ GS_MODE_PAL
Definition: libgs.h:57
@ GS_MODE_DTV_480P
Definition: libgs.h:59
@ GS_MODE_NTSC
Definition: libgs.h:56
GsGParam_t * GsGetGParam(void)
Definition: libgs.c:24
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 interlace
Definition: libgs.h:23
u8 ffmode
Definition: libgs.h:27
u8 omode
Definition: libgs.h:25

References _GetGsDxDyOffset(), GS_DISPFB::address, checkModelVersion(), GS_DISPENV::disp, GS_DISPENV::dispfb, GS_DISPLAY::display_h, GS_DISPLAY::display_w, GS_DISPLAY::display_x, GS_DISPLAY::display_y, GS_DISPFB::fbw, GsGParam_t::ffmode, GS_MODE_DTV_480P, GS_MODE_NTSC, GS_MODE_PAL, GsGetGParam(), GsGParam_t::interlace, GS_DISPLAY::magnify_h, GS_DISPLAY::magnify_v, GsGParam_t::omode, GS_DISPFB::pad1, GS_DISPLAY::pad1, GS_DISPFB::pad2, GS_DISPLAY::pad2, GS_DISPFB::psm, GS_DISPFB::x, and GS_DISPFB::y.

Referenced by InitGraphics().

◆ GsSetDefaultDisplayEnvAddress()

void GsSetDefaultDisplayEnvAddress ( GS_DISPENV dispenv,
unsigned short  vram_addr 
)

Definition at line 164 of file draw.c.

165 {
166  dispenv->dispfb.address=vram_addr;
167 }

References GS_DISPFB::address, and GS_DISPENV::dispfb.

Referenced by InitGraphics().

◆ GsSetDefaultDrawEnv()

void GsSetDefaultDrawEnv ( GS_DRAWENV drawenv,
u16  psm,
u16  w,
u16  h 
)

Definition at line 23 of file draw.c.

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 }
u16 vram_y
Definition: libgs.h:1956
u16 vram_x
Definition: libgs.h:1954

References GS_RGBAQ::a, GS_DRAWENV::auto_clear, GS_RGBAQ::b, GS_DRAWENV::bg_color, GS_DRAWENV::clip, GS_DRAWENV::draw_mask, GS_DRAWENV::fbw, GS_RGBAQ::g, GS_URECT::h, GS_DRAWENV::offset_x, GS_DRAWENV::offset_y, GS_DRAWENV::psm, GS_RGBAQ::q, GS_RGBAQ::r, GS_DRAWENV::vram_addr, GS_DRAWENV::vram_x, GS_DRAWENV::vram_y, GS_URECT::w, GS_URECT::x, and GS_URECT::y.

Referenced by InitGraphics().

◆ GsSetDefaultDrawEnvAddress()

void GsSetDefaultDrawEnvAddress ( GS_DRAWENV drawenv,
u16  vram_addr 
)

Definition at line 47 of file draw.c.

48 {
49  drawenv->vram_addr=vram_addr;
50 }

References GS_DRAWENV::vram_addr.

Referenced by InitGraphics().

Variable Documentation

◆ GsPrimWorkArea

QWORD GsPrimWorkArea[]
extern

Definition at line 18 of file packets.c.

Referenced by GsClearDrawEnv1(), and GsClearDrawEnv2().