sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
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
18extern QWORD GsPrimWorkArea[];
19
20/* Miscellaneous */
21
22static 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
40int 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
53int 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
66int 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
79int 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
92int 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
105int 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
118int 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
131int 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
144int 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
157int 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
170int 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
183void 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
194void 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}
#define gif_rd_ad
Definition libgs.h:327
Definition libgs.h:334