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

Go to the source code of this file.

Functions

int GsLoadImage (const void *source_addr, GS_IMAGE *dest)
 
int GsVramAllocFrameBuffer (s16 w, s16 h, s16 psm)
 
int GsVramAllocTextureBuffer (s16 w, s16 h, s16 psm)
 
void GsVramFreeAllTextureBuffer (void)
 
void GsVramFreeAll (void)
 

Variables

QWORD GsPrimWorkArea []
 
static unsigned int vr_addr =0
 
static unsigned int vr_tex_start =0
 
static unsigned int vr_2ndtolast_alloc =0
 

Function Documentation

◆ GsLoadImage()

int GsLoadImage ( const void *  source_addr,
GS_IMAGE dest 
)

Definition at line 20 of file texture.c.

21 {
22  int i;
23  const unsigned char *pTexSrc;
24  unsigned int current, max, remainder, img_qwc;
25  QWORD *p;
26 
27  switch(dest->psm)
28  {
29  case GS_TEX_32: //32 bit image
30  img_qwc = ((dest->width * dest->height)*4)/16;
31  break;
32  case GS_TEX_24: //24 bit image
33  img_qwc = ((dest->width * dest->height)*3)/16;
34  break;
35  case GS_TEX_16: //16 bit image
36  img_qwc = ((dest->width * dest->height)*2)/16;
37  break;
38  case GS_TEX_8: //8 bit image
39  img_qwc = ((dest->width * dest->height)*1)/16;
40  break;
41  case GS_TEX_4: //4 bit image
42  img_qwc = ((dest->width * dest->height)/2)/16;
43  break;
44  default:
45  //printf("unable to load unsupported image(%02x)",dest->psm);
46  return -1;
47  }
48 
50  gs_setGIF_TAG(((GS_GIF_TAG*)&p[0]), 4,1,0,0,GS_GIF_PACKED,1,gif_rd_ad);
51  gs_setR_BITBLTBUF(((GS_R_BITBLTBUF*)&p[1]),0,0,0,dest->vram_addr,dest->vram_width,dest->psm);
52  gs_setR_TRXPOS(((GS_R_TRXPOS*)&p[2]), 0,0,dest->x,dest->y,0);
53  gs_setR_TRXREG(((GS_R_TRXREG*)&p[3]), dest->width,dest->height);
54  gs_setR_TRXDIR(((GS_R_TRXDIR*)&p[4]), 0);
55 
57  GsDmaWait();
58 
59  // Ok , We Send Image Now
60  max = img_qwc / 16384;
61  remainder = img_qwc % 16384;
62  current = 16384;
63  pTexSrc = (const unsigned char *)source_addr;
64  for(i=0;i<max;i++)
65  {
66  //1st we signal gs we are about to send
67  //16384 qwords
68 
69  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), current,1,0,0,GS_GIF_IMAGE,0,0x00);
70 
72  GsDmaWait();
73 
74  //we now send 16384 more qwords
75  GsDmaSend(pTexSrc, current);
76  GsDmaWait();
77 
78  pTexSrc += current*16;
79  }
80 
81  //transfer the rest if we have left overs
82  current = remainder;
83  //or exit if none is left
84  if(current)
85  {
86  // we signal are about to send whats left
87  gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), current,1,0,0,GS_GIF_IMAGE,0,0x00);
88 
90  GsDmaWait();
91 
92  //send data leftover
93  GsDmaSend(pTexSrc, current);
94  GsDmaWait();
95  }
96 
97  return 1;
98 }
#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_TEX_32
Definition: libgs.h:88
#define gs_setR_TRXDIR(p, _trans_dir)
Definition: libgs.h:1822
#define GS_TEX_8
Definition: libgs.h:92
#define GS_TEX_4
Definition: libgs.h:93
#define GS_TEX_16
Definition: libgs.h:90
#define gs_setGIF_TAG(p, _nloop, _eop, _pre, _prim, _flg, _nreg, _reg)
Definition: libgs.h:1870
#define gif_rd_ad
Definition: libgs.h:326
#define gs_setR_TRXREG(p, _trans_w, _trans_h)
Definition: libgs.h:1818
#define gs_setR_TRXPOS(p, _src_x, _src_y, _dest_x, _dest_y, _direction)
Definition: libgs.h:1814
#define gs_setR_BITBLTBUF(p, _src_addr, _src_width, _src_pixmode, _dest_addr, _dest_width, _dest_pixmode)
Definition: libgs.h:1810
@ GS_GIF_PACKED
Definition: libgs.h:181
@ GS_GIF_IMAGE
Definition: libgs.h:183
#define GS_TEX_24
Definition: libgs.h:89
#define max(a, b)
Definition: standard.h:57
u16 width
Definition: libgs.h:2302
u16 vram_addr
Definition: libgs.h:2306
u8 psm
Definition: libgs.h:2310
u16 y
Definition: libgs.h:2300
u16 x
Definition: libgs.h:2298
u8 vram_width
Definition: libgs.h:2308
u16 height
Definition: libgs.h:2304
Definition: libgs.h:333

References gif_rd_ad, GS_GIF_IMAGE, GS_GIF_PACKED, gs_setGIF_TAG, gs_setR_BITBLTBUF, gs_setR_TRXDIR, gs_setR_TRXPOS, gs_setR_TRXREG, GS_TEX_16, GS_TEX_24, GS_TEX_32, GS_TEX_4, GS_TEX_8, GsDmaSend(), GsDmaWait(), GsPrimWorkArea, GS_IMAGE::height, max, GS_IMAGE::psm, UNCACHED_SEG, GS_IMAGE::vram_addr, GS_IMAGE::vram_width, GS_IMAGE::width, GS_IMAGE::x, and GS_IMAGE::y.

◆ GsVramAllocFrameBuffer()

int GsVramAllocFrameBuffer ( s16  w,
s16  h,
s16  psm 
)

Definition at line 105 of file texture.c.

106 {
107  int size, remainder, ret, byte_pp; // byte per pixel
108 
109  switch(psm)
110  {
111  case GS_PIXMODE_32:
112  case GS_TEX_4HH: // these are 32bit
113  case GS_TEX_4HL: // ..
114  case GS_TEX_8H: // ..
115  case GS_ZBUFF_32: //
116  case GS_ZBUFF_24: //
117  case GS_PIXMODE_24: // also 24bit takes up 4 bytes
118  byte_pp = 4;
119  break;
120  case GS_PIXMODE_16:
121  case GS_PIXMODE_16S:
122  case GS_ZBUFF_16:
123  byte_pp = 2;
124  break;
125  case GS_TEX_8:
126  byte_pp = 1;
127  break;
128  case GS_TEX_4:
129  byte_pp = 0;
130  break;
131  default:
132  return -EINVAL;
133  }
134 
135  if(byte_pp > 0) // 8 to 32 bit
136  {
137  size = ((w*h)*byte_pp)/4;
138  }
139  else // 4 bit
140  {
141  size = (w*h)/2;
142  }
143 
144  remainder = (vr_addr % (2048));
145 
146  if(remainder)
147  vr_addr += ((2048)-remainder);
148 
149  ret = vr_addr/(2048);
150  vr_addr += size;
152 
153  return ret;
154 }
#define EINVAL
Definition: errno.h:62
static unsigned int vr_tex_start
Definition: texture.c:102
static unsigned int vr_addr
Definition: texture.c:101
#define GS_PIXMODE_24
Definition: libgs.h:78
#define GS_TEX_4HL
Definition: libgs.h:95
#define GS_PIXMODE_16
Definition: libgs.h:79
#define GS_ZBUFF_24
Definition: libgs.h:100
#define GS_TEX_8H
Definition: libgs.h:94
#define GS_ZBUFF_16
Definition: libgs.h:101
#define GS_PIXMODE_32
Definition: libgs.h:77
#define GS_TEX_4HH
Definition: libgs.h:96
#define GS_ZBUFF_32
Definition: libgs.h:99
#define GS_PIXMODE_16S
Definition: libgs.h:80

References EINVAL, GS_PIXMODE_16, GS_PIXMODE_16S, GS_PIXMODE_24, GS_PIXMODE_32, GS_TEX_4, GS_TEX_4HH, GS_TEX_4HL, GS_TEX_8, GS_TEX_8H, GS_ZBUFF_16, GS_ZBUFF_24, GS_ZBUFF_32, vr_addr, and vr_tex_start.

Referenced by InitGraphics().

◆ GsVramAllocTextureBuffer()

int GsVramAllocTextureBuffer ( s16  w,
s16  h,
s16  psm 
)

Definition at line 156 of file texture.c.

157 {
158  int size, remainder, ret, byte_pp; // byte per pixel
159 
160  switch(psm)
161  {
162  case GS_PIXMODE_32:
163  case GS_PIXMODE_24: // also 24bit takes up 4 bytes
164  case GS_TEX_8H: // ..
165  case GS_TEX_4HH: // these are 32bit
166  case GS_TEX_4HL: // ..
167  byte_pp = 4;
168  break;
169  case GS_PIXMODE_16:
170  case GS_PIXMODE_16S:
171  byte_pp = 2;
172  break;
173  case GS_TEX_8:
174  byte_pp = 1;
175  break;
176  case GS_TEX_4:
177  byte_pp = 0;
178  break;
179  default:
180  return -EINVAL;
181  }
182 
183  if(byte_pp > 0) // 8 to 32 bit
184  {
185  size = ((w*h)*byte_pp)/4;
186  }
187  else // 4 bit
188  {
189  size = (w*h)/2;
190  }
191 
192  remainder = (vr_addr % (64));
193 
194  //---
196 
197  if(remainder)
198  vr_addr += ((64)-remainder);
199 
200  ret = vr_addr/(64);
201  vr_addr += size;
202 
203  return ret;
204 }
static unsigned int vr_2ndtolast_alloc
Definition: texture.c:103

References EINVAL, GS_PIXMODE_16, GS_PIXMODE_16S, GS_PIXMODE_24, GS_PIXMODE_32, GS_TEX_4, GS_TEX_4HH, GS_TEX_4HL, GS_TEX_8, GS_TEX_8H, vr_2ndtolast_alloc, and vr_addr.

◆ GsVramFreeAll()

void GsVramFreeAll ( void  )

Definition at line 222 of file texture.c.

223 {
224  vr_addr = 0;
225  vr_tex_start = 0;
226 }

References vr_addr, and vr_tex_start.

◆ GsVramFreeAllTextureBuffer()

void GsVramFreeAllTextureBuffer ( void  )

free texture buffer without freeing frame buffer

Definition at line 206 of file texture.c.

207 {
209 }

References vr_addr, and vr_tex_start.

Variable Documentation

◆ GsPrimWorkArea

QWORD GsPrimWorkArea[]
extern

Definition at line 18 of file packets.c.

Referenced by GsLoadImage().

◆ vr_2ndtolast_alloc

unsigned int vr_2ndtolast_alloc =0
static

Definition at line 103 of file texture.c.

Referenced by GsVramAllocTextureBuffer().

◆ vr_addr

unsigned int vr_addr =0
static

◆ vr_tex_start

unsigned int vr_tex_start =0
static

Definition at line 102 of file texture.c.

Referenced by GsVramAllocFrameBuffer(), GsVramFreeAll(), and GsVramFreeAllTextureBuffer().