PS2SDK
PS2 Homebrew Libraries
lowlevel.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 <kernel.h>
14 #include <libgs.h>
15 
16 #include "internal.h"
17 
18 extern QWORD GsPrimWorkArea[];
19 
20 /* Miscellaneous */
21 
22 static s8 twh(s16 val)
23 {
24  s8 res;
25 
26 #ifdef _EE
27  __asm__ __volatile__ ("plzcw %0, %1\n": "=r" (res) : "r" (val));
28 #else
29  res = __builtin_clrsb(val);
30 #endif
31  res = 31 - (res + 1);
32  if(val > res)
33  res++;
34 
35  return res;
36 }
37 
38 /* LOW LEVEL FUNCTIONS */
39 
40 int GsSetXYOffset1(u16 x, u16 y)
41 {
42  QWORD *p;
43  p=UNCACHED_SEG(GsPrimWorkArea);
44  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
45  gs_setR_XYOFFSET_1(((GS_R_XYOFFSET *)&p[1]), x,y);
46 
47  GsDmaSend(GsPrimWorkArea, 2);
48  GsDmaWait();
49 
50  return 0;
51 }
52 
53 int GsSetXYOffset2(u16 x, u16 y)
54 {
55  QWORD *p;
56  p=UNCACHED_SEG(GsPrimWorkArea);
57  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
58  gs_setR_XYOFFSET_2(((GS_R_XYOFFSET *)&p[1]), x,y);
59 
60  GsDmaSend(GsPrimWorkArea, 2);
61  GsDmaWait();
62 
63  return 0;
64 }
65 
66 int GsSetScissor1(u16 upper_x, u16 upper_y, u16 lower_x, u16 lower_y)
67 {
68  QWORD *p;
69  p=UNCACHED_SEG(GsPrimWorkArea);
70  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
71  gs_setR_SCISSOR_1(((GS_R_SCISSOR *)&p[1]), upper_x,lower_x,upper_y,lower_y);
72 
73  GsDmaSend(GsPrimWorkArea, 2);
74  GsDmaWait();
75 
76  return 0;
77 }
78 
79 int GsSetScissor2(u16 upper_x, u16 upper_y, u16 lower_x, u16 lower_y)
80 {
81  QWORD *p;
82  p=UNCACHED_SEG(GsPrimWorkArea);
83  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
84  gs_setR_SCISSOR_2(((GS_R_SCISSOR *)&p[1]), upper_x,lower_x,upper_y,lower_y);
85 
86  GsDmaSend(GsPrimWorkArea, 2);
87  GsDmaWait();
88 
89  return 0;
90 }
91 
92 int GsSetFrame1(u16 framebuffer_addr, u8 framebuffer_width, u8 psm, u32 draw_mask)
93 {
94  QWORD *p;
95  p=UNCACHED_SEG(GsPrimWorkArea);
96  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
97  gs_setR_FRAME_1(((GS_R_FRAME *)&p[1]), framebuffer_addr,framebuffer_width,psm,draw_mask);
98 
99  GsDmaSend(GsPrimWorkArea, 2);
100  GsDmaWait();
101 
102  return 0;
103 }
104 
105 int GsSetFrame2(u16 framebuffer_addr, u8 framebuffer_width, u8 psm, u32 draw_mask)
106 {
107  QWORD *p;
108  p=UNCACHED_SEG(GsPrimWorkArea);
109  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
110  gs_setR_FRAME_2(((GS_R_FRAME *)&p[1]), framebuffer_addr,framebuffer_width,psm,draw_mask);
111 
112  GsDmaSend(GsPrimWorkArea, 2);
113  GsDmaWait();
114 
115  return 0;
116 }
117 
118 int GsTextureFlush(void)
119 {
120  QWORD *p;
121  p=UNCACHED_SEG(GsPrimWorkArea);
122  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
123  gs_setR_TEXFLUSH(((GS_R_TEXFLUSH *)&p[1]));
124 
125  GsDmaSend(GsPrimWorkArea,2);
126  GsDmaWait();
127 
128  return 0;
129 }
130 
131 int GsSetPixelTest1(u8 enable_alpha_test, u8 alpha_test_method, u8 alpha_reference, u8 alpha_fail_method, u8 enable_dest_alpha_test, u8 dest_alpha_test_mode, u8 enable_zbuff_test, u8 alpha_zbuff_method)
132 {
133  QWORD *p;
134  p=UNCACHED_SEG(GsPrimWorkArea);
135  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
136  gs_setR_TEST_1(((GS_R_TEST *)&p[1]), enable_alpha_test, alpha_test_method, alpha_reference, alpha_fail_method, enable_dest_alpha_test, dest_alpha_test_mode, enable_zbuff_test, alpha_zbuff_method);
137 
138  GsDmaSend(GsPrimWorkArea, 2);
139  GsDmaWait();
140 
141  return 0;
142 }
143 
144 int GsSetPixelTest2(u8 enable_alpha_test, u8 alpha_test_method, u8 alpha_reference, u8 alpha_fail_method, u8 enable_dest_alpha_test, u8 dest_alpha_test_mode, u8 enable_zbuff_test, u8 alpha_zbuff_method)
145 {
146  QWORD *p;
147  p=UNCACHED_SEG(GsPrimWorkArea);
148  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
149  gs_setR_TEST_2(((GS_R_TEST *)&p[1]), enable_alpha_test, alpha_test_method, alpha_reference, alpha_fail_method, enable_dest_alpha_test, dest_alpha_test_mode, enable_zbuff_test, alpha_zbuff_method);
150 
151  GsDmaSend(GsPrimWorkArea, 2);
152  GsDmaWait();
153 
154  return 0;
155 }
156 
157 int GsSelectTexure1(u16 tex_addr, u8 addr_width, u8 tex_pixmode, u16 tex_width, u16 tex_height, u16 clut_addr, u8 clut_pixmode, u8 clut_storagemode,u8 clut_offset)
158 {
159  QWORD *p;
160  p=UNCACHED_SEG(GsPrimWorkArea);
161  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
162  gs_setR_TEX0_1(((GS_R_TEX0 *)&p[1]), tex_addr,addr_width,tex_pixmode, twh(tex_width), twh(tex_height),1,0,clut_addr,clut_pixmode,clut_storagemode,clut_offset,4); /*4 load contex 0*/
163 
164  GsDmaSend(GsPrimWorkArea, 2);
165  GsDmaWait();
166 
167  return 0;
168 }
169 
170 int GsSelectTexure2(u16 tex_addr, u8 addr_width, u8 tex_pixmode, u16 tex_width, u16 tex_height, u16 clut_addr, u8 clut_pixmode, u8 clut_storagemode,u8 clut_offset)
171 {
172  QWORD *p;
173  p=UNCACHED_SEG(GsPrimWorkArea);
174  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
175  gs_setR_TEX0_2(((GS_R_TEX0 *)&p[1]), tex_addr, addr_width, tex_pixmode, twh(tex_width), twh(tex_height), 1, 0, clut_addr, clut_pixmode, clut_storagemode,clut_offset,5);/*5 load contex 2*/
176 
177  GsDmaSend(GsPrimWorkArea, 2);
178  GsDmaWait();
179 
180  return 0;
181 }
182 
183 void GsSetFogColor(u8 r, u8 g, u8 b)
184 {
185  QWORD *p;
186  p=UNCACHED_SEG(GsPrimWorkArea);
187  gs_setGIF_TAG(((GS_GIF_TAG*)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
188  gs_setR_FOGCOLOR(((GS_R_FOGCOLOR*)&p[1]), r,g,b);
189 
190  GsDmaSend(GsPrimWorkArea, 2);
191  GsDmaWait();
192 }
193 
194 void GsEnableColorClamp(u16 enable)
195 {
196  QWORD *p;
197  p=UNCACHED_SEG(GsPrimWorkArea);
198  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 1,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
199  gs_setR_COLCLAMP(((GS_R_COLCLAMP *)&p[1]), enable);
200 
201  GsDmaSend(GsPrimWorkArea, 2);
202  GsDmaWait();
203 }
kernel.h
GS_R_SCISSOR
Definition: libgs.h:1045
GS_R_TEST
Definition: libgs.h:1070
GS_R_FOGCOLOR
Definition: libgs.h:1035
GS_R_COLCLAMP
Definition: libgs.h:1065
GS_R_XYOFFSET
Definition: libgs.h:995
GS_R_TEXFLUSH
Definition: libgs.h:1040
GS_GIF_TAG
Definition: libgs.h:1859
gif_rd_ad
#define gif_rd_ad
Definition: libgs.h:326
stdio.h
libgs.h
GS_R_TEX0
Definition: libgs.h:970
GS_R_FRAME
Definition: libgs.h:1085
QWORD
Definition: libgs.h:333
errno.h