sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
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
22extern QWORD GsPrimWorkArea[];
23
24void 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
48void GsSetDefaultDrawEnvAddress(GS_DRAWENV *drawenv, u16 vram_addr)
49{
50 drawenv->vram_addr=vram_addr;
51}
52
53void 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
143void GsSetDefaultDisplayEnvAddress(GS_DISPENV *dispenv, unsigned short vram_addr)
144{
145 dispenv->dispfb.address=vram_addr;
146}
147
148void 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
180void 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
186void 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
217void GsPutDisplayEnv2(GS_DISPENV *dispenv)
218{
219 *((volatile GS_DISPLAY *)(gs_p_display2)) = dispenv->disp;
220 *((volatile GS_DISPFB *)(gs_p_dispfb2)) = dispenv->dispfb;
221}
#define GS_PRIM_SPRITE
Definition gs_gp.h:164
void * GetSyscallHandler(int syscall_no)
Definition getkernel.c:39
#define gs_p_display2
Definition libgs.h:203
void GsClearDrawEnv2(GS_DRAWENV *drawenv)
Definition draw.c:198
#define gs_p_dispfb1
Definition libgs.h:197
#define gif_rd_ad
Definition libgs.h:327
#define gs_p_dispfb2
Definition libgs.h:201
#define gs_p_display1
Definition libgs.h:199
void GsClearDrawEnv1(GS_DRAWENV *drawenv)
Definition draw.c:161
u32 fbw
Definition libgs.h:410
u32 pad2
Definition libgs.h:420
u32 x
Definition libgs.h:416
u32 psm
Definition libgs.h:412
u32 y
Definition libgs.h:418
u32 address
Definition libgs.h:408
u32 pad1
Definition libgs.h:414
u32 display_w
Definition libgs.h:435
u32 display_x
Definition libgs.h:425
u32 pad2
Definition libgs.h:439
u32 pad1
Definition libgs.h:433
u32 display_y
Definition libgs.h:427
u32 magnify_h
Definition libgs.h:429
u32 display_h
Definition libgs.h:437
u32 magnify_v
Definition libgs.h:431
u8 interlace
Definition libgs.h:24
u8 ffmode
Definition libgs.h:28
u8 omode
Definition libgs.h:26
Definition libgs.h:334