PlayStation2 Linux OtBbNvO~OЂƂ߂ (O)

 v


  {eł́APS2 Linuxŉʂ̌h悭邱ƂڕWɁAʂ̃v
O~OƂ̉sƎv܂BO҂łPS2 Linux3DO
tBbNX\s߂̈ʂ̋Zpɂĉ܂B
  PS2 Linuxł́A3DNtBbNł͎n߂pӂĂ悤
Ȋ{Iȏ܂łׂĈꂩ쐬ȂĂ͂Ȃ܂B̑A
ׂĂ̎̎gp@Ō߂邱Ƃł܂B
  ʓIȑ̃n[hEGAƓAPS2͔ɑ@\ŕGłA
̖ړI邽߂̎i͈ł͂܂BʏA̓g[
hItɂĂǂ邩肷Kv܂A񋟂郉C
ugpꍇɂ̓Cuz肵Č߂g͈̔͂ŏ]
܂B
  PS2 Linuxł͉񋟂ȂAn[hEGAׂČJĂA
ׂĂvO~O鑤ɂđI邱Ƃł܂B
  PS2A[LeN`A3DOtBbN\Aɉ[AƂĂ
̂悤Ȑy[W̌eňƂ͎v܂񂪁A{eł̕З؂ɏ
łG΂ƍlĂ܂B


 PS2 OtBbNA[LeN`

  ŏɁA{IPS23DOtBbN\邽߂̃A[LeN`
Đ܂B
  EE Core,VPU1,GS֌WȒPɂ܂Ƃ߂ubN}}1Ɏ܂B
  PS2ɂGSgpăOtBbN\邽߂̕@ƂẮA
傫ނ2̕@܂B
  1́AEE CoreVPU0pēϊ܂ōsA2Df[^߃
ɔzuADMApGS֓]@łB
  1̕@́AEE Coreł3D̒_f[^܂͒_f[^쐬
߂̃qgƂȂ݂̂ZoăɔzuA̍ƂVPU1
@łBVPU1֒ڃf[^]AVPU1łGS
̕`f[^𐶐ĒGS𓮍삳܂B
  ҂͓Ɏgp邱Ƃł܂B
  EE Core̎sƁADMAɂVPU1, GSւ̓]ɓ삵܂Bʏ́A
DMA֓]f[^i[郁_uobt@ƂA1t[̕`
撆DMA]sAEE Coreł͎̃t[̂߂DMApf[^쐬
܂B
  āA1t[ɂDMA]VPU1,GSɂʕ`AEE Core
鎟̃t[DMA]̂߂̃f[^쐬sčs邱Ƃɂ
܂B
  }2ɂ̃C[W}܂B
  GSV-RAMAEEDMAobt@̓_uobt@ɂȂĂ܂B

  (̐}1,}212̐}1,2ėp肢܂BA}1̕ɂ́A
VIF1 Channel̉(PATH1)AGIF Channel̉(PATH3)LqĂ
)


 ʃ[hV-RAM蓖

  ŏGS̊{IȎg邽߂ɁAʃ[hGSV-RAM
蓖ĂɂĐ܂B
  GSɂ̓t[obt@(RGBA)AZobt@(3D\̉BʏŎgp)A
eNX`݂܂B3DOtBbNVXeł1t[\Ɋ
SV-RAM`悵܂B]āA\ƕ`撆̉摜͕ʌɏ
Kv邽߁At[obt@2pӂāA\̉ʂƕ`撆
̉ʂ݂ɐؑւ܂B_uobt@Ƃ܂B
  t[obt@AZobt@͌ŒTCYKvłA
c̗̈悪eNX`i[擙ɃvOŎRɎgpł̈Ƃ
܂B(})

      Address 0	-----------------
      	      | |    RGBA 1	|
	      |	|---------------|
	      V	|    RGBA 2	|
		|---------------|
		|      Z	|
		|---------------|
		| Ɨ̈	|
		| (eNX`)|
		-----------------

			}

  GSV-RAM͑S4MBȂAɂ]TTCYƂ͌܂
񂩂Ałt[obt@ߖ񂷂Kv܂B
  ŁAGS͉ʃ[hAɃC^[[X[h̎ɂ͉ʕ\ɕK
vV-RAMŏɂȂ悤ɂȂĂ܂B

1. VESA
VESA̖͂̒ʂATVڑł͂ȂAPC̃j^֐ڑʃ[h
BPCƓ悤VGA, XGA(*)̉ʃ[hŕ\ł܂B
ʏAVESA[h̓mC^[[Xł̎gpz肳܂̂ŁAʂ
V-RAM̗̈2ʕgp܂B

(*) ... VGA, XGÂǂƂƂIBM̃rfI`bv̖Oł
łA炩ʉ𑜓x̌ď̂ɂȂĂ܂܂BlIɂ
1280x1024XGA2ł͂ȂSXGAł͓̂䂾ƏXvĂƂłB

2. NTSC/PAL
NTSC/PAL̓mC^[[XŎgp邱Ƃł܂AʏAC^[
[X[h̍𑜓xIł傤BGSɂ̓C^[[X[h
ɂāAFRAME[gFIELD[h܂B

EFIELD[h
FIELD[h́AV-RAM̓ǂݏo1CɂȂ܂B
]āA640x448̏ꍇłƁANTSC̃C^[[Xłʂ640x448
t[obt@2pӂă_uobt@Ƃĕ`悷邱Ƃł
Bۂɂ́At[obt@1ʕɂĂ_uobt@͎
܂BGSɂ͕`撆ɋC/Ĉǂ炩}XN邱
ł܂̂ŁA1̗̈̊CƋC𕪂邱Ƃɂ
_uobt@邱Ƃł܂BAC̃}XN
ƏxȂ܂A1t[̕`悪1/60bȓɏIȂ
ɂ́A`撆̉ʂ\܂̂ŕ\܂B

EFRAME[h
FRAME[h̏ꍇ́AV-RAM̓ǂݏo͘Ačs܂B
t[obt@̓C^[[XɕKvȃTCYAȂ킿𑜓x̔
pӂĕ`悵܂BႦΉ𑜓x640x448̏ꍇ́A640x224V-RAM
pӂA640x224ɑ΂ĕ`s܂B`ΏۂƂ\̃O
tBbNCCɂāA`悷ׂ摜𒲐
Kv܂BGS̉Z͐ł͂Ȃ4rbǧŒ菬_
̂ŁAC^[[X[hł́AGS̕`掞ɃItZbgƂ0.5hb
g^邱ƂɂāA摜Ɗ摜̕\ʒu𒲐Ă܂B
FIELD[hƈقȂAC}XNɂyieB͂܂񂵁A1t[
̕`悪1/60bȓɏIȂɂA2t[ȓƉ𑜓x
ɂȂxōς݂܂B(ۂɂ͓ˑR𑜓x܂A3t[
ɂȂƁAItZbg0.5hbg]ĕ\܂̂ŁA^
xĂGIɌƂx̎gɂׂł傤)

  {eł͍ŌɃTvvO쐬܂ANTSC/PAL̃C^[[
XɂFRAME[hgpĂ܂B
  PS2 Linuxł͕Wlibps2devƂCupӂĂA
păvO~Oŝ֗łBlibps2devpvO
̊{`͐}̂悤ɂȂ܂B

release()
{
	AvP[Vf̂߂̎
}

acquire()
{
	AvP[VĊĴ߂̎mہAAĐݒ蓙
}

main()
{
	int id;
	ps_gs_dbuff gdb;
	DMABUFF *dmabuff[2];

	/* DMAobt@̏ */
	id = 0;
	DMAobt@dmabuff[]̊m

	/* GS̏ */
	ps2_gs_vc_graphicsmode();
	ps2_gs_open();
	ps2_vpu0_open();
	ps2_vpu1_open();
	ps2_gs_reset();
	ps2_gs_set_dbuff/_dc( &gdb, ... );
	ps2_gs_start_display(1);
	ps2_gs_vc_enablevcswitch( acquire, release );
	ps2_gs_vc_lock();

	/* C[v */
	for (;;) {
		t[
			:
			:
		vOs
		dmabuff[id] Ƀf[^Zbg
			:
			:
		Ot[ŊJnVPU1,GSւDMAÎ҂
		oddeven = ps2_gs_sync_v(0) (V-Sync҂)
		ps2_gs_vc_unlock();
		ps2_gs_vc_lock();
		ps2_gs_set_half_offset()   (Interlacehalf offsetݒ)
		ps_gs_swap_dbuff/_dc()	   (GSt[obt@̐ؑւ)
		DMAobt@dmabuff[id]̓eVPU1,GSDMA]Jn
		id = !id;		   (DMAobt@̐ؑւ)
	}
}

			}

  LinuxŃAvP[V𓮂ꍇAK̃AvP[V
񓮍A܂莑̋LlKv܂BPS2 Linux̃Av
P[Vł̓OtBbNgp鎞ɂ̓fBXvCL܂̂ŁA
̃AvP[Vsɂ͎s̃vO𒆒f\
ɂȂĂ܂B
  AvP[V̒f́AzR\[̐ؑւɂĔ܂B
vO~Oɂlibps2dev̊֐Aps2_gs_vc_enablevcswitch()p
ĒfAĊJLq܂Bؑւ𔭐ȂԂ́A
ps2_gs_vc_lock(), ps2_gs_vc_unlock()ŋł܂BAAvP[
V̐ؑւɎgpĂ邷ׂĂ̎Ĵ͓ł傤
AǂȃAvP[VƂłSɐؑւ\Ƃ邱Ƃ͌I
͌ł傤B


 PS2DMAA[LeN`

  PS2ł̓OtBbNf[^ׂ͂DMA]obt@ɓDMAœ]
sƂɂȂ܂BłGS֕`f[^]邱ƂړIƂ
DMA]ɂĐ܂B
  PS2DMAx[XƂA[LeN`łBsɂDMAgp
AړIǂB邽߂DMA͔ɑ@\ȍ\ƂȂĂ
܂BIȋ@\ƂẮAʓIȘÄ̃f[^I/O⃁ɑ
ē]ȊOɁA^Oē]f[^𐧌䂵Ȃ]郂[h
(Chain Mode)܂BOtBbNf[^̓]ɂ͂gp
̂֗łB
  DMA]obt@ւ̃f[^̐ݒ́AvO~Ȏ猩ƁA
obt@փf[^ςłłBx^Ƀf[^ݒ肵Ă
Ƃ킩ɂAfobOɂ̂ƂȂ܂Axۉ
vO~O₷\ƂKvł傤BPS2 LinuxɂDMA
]obt@pPbgݒ肷邽߂̃}NpӂĂ܂
ŁAgăvO~Oł܂Ał̓TvvO
łgpĂÂЉ܂B
  DMAɂẮA{2001N12ł܂̂ŁAPS2 LinuxW
͈Ƃ̂łȂApb`𓖂ĂTTE=1DMA]܂Ƃ߂ĈĂ
܂B
  PS2DMA]16oCg(128rbg)Pʂł̓]ƂȂ܂B]āADMA
]obt@͏16oCg1PʂƂz\ɂȂĂKv
܂BGSւ̃f[^]ŗLpSource Chain ModeDMAobt@́Af[^
̃^OɂāAAȂԏ̃obt@f[^RɎQƂ
܂BȂ킿A]f[^͘AȂԏ|C^ŘA
ȂA݂邱ƂɂȂ܂B(} ... ʎ}(A))
  DMA^O\Ɏ܂B

		             \

			DMA^O̎
			^^^^^^^^^^^^^
|--------------------------------------------------------------------------|
| ID  |                                                                |
|-----|--------------------------------------------------------------------|
| cnt | ^Oɑf[^]AɎ̃f[^֐i                   |
|-----|--------------------------------------------------------------------|
|next | ^Oɑf[^]AwʒuփWv                   |
|-----|--------------------------------------------------------------------|
| ref | wʒũf[^]                                         |
|-----|--------------------------------------------------------------------|
|refs | wʒũf[^Xg[䂵Ȃ]                     |
|-----|--------------------------------------------------------------------|
|refe | wʒũf[^]A]I                           |
|-----|--------------------------------------------------------------------|
|call | ^Oɑf[^]A̔ԒnۑĎwʒuփWv |
|-----|--------------------------------------------------------------------|
| ret | ^Oɑf[^]AۑĂʒuփWv         |
|-----|--------------------------------------------------------------------|
| end | ^Oɑf[^]A]I                           |
|--------------------------------------------------------------------------|

  GSփf[^𑗂iƂāAPS2łVPU1@ƒGS֓]
@͎̂n߂ɏqׂʂ(}1)łAeX̓][gPATH1A
PATH3ƌĂт܂Bۂ̃f[^]ɂ́AVPU1ւ̃f[^]ɂVIFcode
ƌĂԃ^O(ȌVIF^OƌĂт܂)AGSւ̃f[^]ɂGIFtagƌĂ
^OāAf[^̈w܂B
  GIFɂĂ͌ň܂̂ŁAłVIF^O̎ނ\Ɏ
BPATH1gpAVIF^Odirectw肵A]f[^VPU1
GSւƓ]܂B̓][gPATH2ƌĂт܂B

			     \

			VIF^O̎
			^^^^^^^^^^^^^
|--------------------------------------------------------------------------|
	NOP		삵Ȃ
	STCYCL		CYCLEWX^̐ݒ
	OFFSET		OFFSETWX^̐ݒ
	BASE		BASEWX^̐ݒ
	ITOP		ITOPSWX^̐ݒ
	STMOD		MODEWX^̐ݒ
	MSKPATH3	GIFPATH3]}XN
	MARK		MARKWX^̐ݒ
	FLUSHE		}CNvO̎sI҂
	FLUSH		}CNvO̎sI҂
			GIF(PATH1/PATH2)̓]I҂
	FLUSHA		}CNvO̎sI҂
			GIF(PATH1-PATH3)̓]I҂
	MSCAL		}CNvO̎s
	MSCNT		}CNvǑps
	MSCALF		}CNvO̎s
	STMASK		MASKWX^̐ݒ
	STROW		ROWWX^̐ݒ
	STCOL		COLWX^̐ݒ
	MPG		}CNvO[h
	DIRECT		GIFւ̃f[^] (PATH2)
	DIRECTHL	GIFւ̃f[^] (PATH2)
	UNPACK		f[^̓WJVPUւ̏
|--------------------------------------------------------------------------|

	(DMA^OƓ悤ɘgň͂ł)

  ӂׂƂ́A}1̒ʂADMA^ODMARg[AVIF^O
VIFAGIF^OGIF߂Aꂼ̃Xe[g͘AĂȂƂ
ƂłB͔̓ɗLpŁAVIFf[^DMA]ɕ
]邱Ƃ\łB́AقȂʒuɔzuꂽf[^A
]ꍇɖ𗧂܂ADMA^OŎwł]TCY̌E
]ɂĉ邱Ƃł܂B
  āADMA]obt@łA16oCgPʂňƂĂۂ
̃f[^́A32rbgPʂ܂64rbgPʂŐݒ肷邱ƂɂȂ܂B
ADMAf[^͏16oCgPʂł̈ƂȂ܂AKvɉ
ăpfBOsȂlݒ肵ĂƂɂȂ܂B
  cOȂAWPS2 Linuxł͎gp邱Ƃł܂񂪁A`l
䃌WX^Dn_CHCR̃rbg6ɂTTErbgƂ̂Ãrbg
𗧂ĂDMA^Og]ytF֓]܂BTTErbg
́AVPU1ւ̃f[^]ɂĈЗ͂𔭊܂Aǂ̂ƂATTE=1
ATTE=0ł̈Ⴂ́ADMA^Ő󂫗̈64rbgVIF^O2ߍނ
\ǂƂ_łBVIF^O4oCgł邽߁ATTE=1DMA
]łDMA^OVIF^O邽߁A{ɓ]f[^16o
CgACgɖʂȂ邱Ƃł悤ɂȂ܂B
  GSփf[^]DMÃpPbg\͐}̂悤ɂȂĂ܂B


   offset +0  DMA packet
         |    DMA packet
	 |    DMA packet
	 V 	:
		:
	    ( DMA packet (ref, call)
		   --> ʂDMAobt@Af[^
		:
		:
		:
	      DMA packet	
	      DMA packet (end)

			DMA]obt@̍\


offset +0
  |   DMA tag			DMA tag			DMA tag
  |   VIF tag			VIF tag			GIFtag
  V   data			GIF tag			data
      				data			
	:						  :
	:			   :			  :
	:			   :			  :

   VIF1֓]	      GS֓]	      GS֓]
     DMA pakcet		       DMA packet	       DMA packet

	PATH1			 PATH2			 PATH3

	  (VIF^OŃpPbg𐧌)		  (VIF^O͕KvȂ)

			eXDMApPbg̓e

				}

  DMAf[^]@PATH2PATH3ɂۂ̃f[^̈Ⴂ́AVIF^O
ނǂƂƂłBTTE=1̏ꍇAVIF^ODMA^Oɖ
ނƂł܂APATH3łVIF^O}Ă܂̂ŁA
f[^𗘗pł܂B
  āAef[^łADMA^O16oCgPʁAVIF^O4oCgPʁA
GIF^O8oCg4oCg݂̍ňƂɂȂ܂Af[^^int
ł͂Ȃfloat܂ō݂܂B
  PS2̃vO~Oł͈ʓIC,C++gpƎv܂AʏA
̂悤ȃobt@Ȃ΁Aobt@֐pӂĂׂẴf[^𑀍
AGȃTCY^̈Ⴂ͑֐vŐ@\pĉ
̂AvO~Ôł傤B̂悤ɂȂƁA
̐l̓IuWFNgwvO~O͂납Aۃf[^\m
̂AƂƂɂȂĂ܂łB
  AvȎ啔DMA]obt@փf[^ݒ肷邱Ƃ
AEEɏłSȂƂȂƘb͕ςĂ܂B̂
ȕjōsƁAϗvfȂAf[^̐ݒ͒萔1ƃ|
C^̈ړ݂̂ƂȂ悤ɁA܂AȂׂ@BɓWJꂽɌ
ǂANZXs悤ɋLq邱ƂAꃌxł͍ŗǂ̕@
ƂȂ܂B
  œK̃R[h\zɂv炷߂ɂAPȃvO~
Oꂪ悢Ǝv܂̂ŁAC++ł͂ȂACŃR[hLq
܂B
  ̂悤ȕ̃f[^`ꍇ́AC̏ꍇAunionŊǗ
̂Yȕ@łA͂ł͂ȂADMAobt@unsigned
int̔zƂĒ`Aׂă}NgăANZXĂ܂B
obt@ؑւȂobt@ɒlݒ肷邽߂ɁAۂ̃}N͐}A
}̂悤ɒ`Ă܂B


int __grl_ps2gdma_path		/* PATH1/2PATH3 */

int __grl_ps2gdma_sysbuf	/* VXeŗpӂꂽ_uobt@
				   [UDMAŌqƂړIɎ
				   ŗpӂobt@ */

#define grd_set_closedrawpath() \
        if (__grl_ps2gdma_sysbuf) { \
                __grl_ps2gdma_sysbuf = FALSE; \
                __grl_ps2gdma_buf[__grl_ps2gdma_path] = __grl_ps2gdma_buf_p; \
        }

#define grd_set_currentdrawpath(_PATH) { \
                grd_set_closedrawpath(); \
                __grl_ps2gdma_path  = (_PATH); \
                __grl_ps2gdma_buf_p = __grl_ps2gdma_buf[__grl_ps2gdma_path]; \
                __grl_ps2gdma_sysbuf = TRUE; \
        }

#define grd_set_currentdrawpath_user(_PATH, _ADR) { \
                grd_set_closedrawpath(); \
                if ((_PATH) >= 0) \
                        __grl_ps2gdma_path = (_PATH); \
                __grl_ps2gdma_buf_p = (_ADR); \
                __grl_ps2gdma_sysbuf = FALSE; \
        }

		  DMAobt@ؑւp}N̔

				}


#define _gps2_setdma_32( _V ) \
        *__grl_ps2gdma_buf_p++ = (_V);
#define _gps2_setdma_f32( _F ) \
        *((float *)__grl_ps2gdma_buf_p)++ = (_F);
#define _gps2_setdma_64( _V ) \
        *((u_long64 *)__grl_ps2gdma_buf_p)++ = (u_long64)(_V);

#define _gps2_setdma_32323232( _V1, _V2, _V3, _V4 ) { \
                __grl_ps2gdma_buf_p[0] = (_V1); \
                __grl_ps2gdma_buf_p[1] = (_V2); \
                __grl_ps2gdma_buf_p[2] = (_V3); \
                __grl_ps2gdma_buf_p[3] = (_V4); \
                _gps2_setdma_skip_4(4); \
        }

#define _gps2_setdma_f32323232( _F1, _F2, _F3, _F4 ) { \
                ((float *)(__grl_ps2gdma_buf_p))[0] = (_F1); \
                ((float *)(__grl_ps2gdma_buf_p))[1] = (_F2); \
                ((float *)(__grl_ps2gdma_buf_p))[2] = (_F3); \
                ((float *)(__grl_ps2gdma_buf_p))[3] = (_F4); \
                _gps2_setdma_skip_4(4); \
        }

#define _gps2_setdma_6464( _V1, _V2 ) { \
                *(u_long64 *)(&__grl_ps2gdma_buf_p[0]) = (u_long64)(_V1); \
                *(u_long64 *)(&__grl_ps2gdma_buf_p[2]) = (u_long64)(_V2); \
                _gps2_setdma_skip_8(2); \
        }

#define _gps2_setdma_6464ul( _V1, _V2 ) { \
                *(u_long64 *)(&__grl_ps2gdma_buf_p[0]) = (u_long64)(_V2); \
                *(u_long64 *)(&__grl_ps2gdma_buf_p[2]) = (u_long64)(_V1); \
                _gps2_setdma_skip_8(2); \
        }

	 	DMAobt@ݒp}N̔

				}


 GS֓]f[^̍쐬

  ŁA̓IPATH1gpăpPbgς݁AGSŃv~eBu`
悳Ă݂܂BGSւ̃pPbgREGLIST[hPACKED[hAɃeN
X`]ŎgIMAGE[hAGIF^OŎwł܂A
PACKED[hgpĂ܂B(REGLIST[hgꍇA]ł
pPbg̎ނɐ܂Aۂɓ]pPbgu
͔̈ɂł܂)
  Op``悷pPbg̍\͐}̂悤ɂȂ܂B

    offset +0	DMA^O		CNT
	|	VIF^O		DIRECT
	|	GIF^O		WX^(RGBA,XYZ2) x 3, PACKED
	V	RGBA		_1RGBA
		XYZ2    	_1XYZ
		RGBA		_2RGBA
		XYZ2    	_2XYZ
		RGBA		_3RGBA
		XYZ2    	_3XYZ

				}

  Op`́AGS3ڂXYZ2͂ꂽɎۂɕ`悪Jn܂A
̓f[^̐ݒ@łBOp`Ɍ炸A̐}``悷邽т
̂悤ȃpPbgׂĒڋLqĂƁAɎԂ܂A
vOɂȂĂ܂܂BāAxۉ
ƂɂȂ܂AEEɖʂȏɎ̂ŁAȂׂ
R[hPɂȂ͈͂Œۉ\ݒ肵܂B́A
}NŒ`܂B̃TvvOł́A}̂悤ȍ\ɂȂ
Ă܂B̃}N`͑wɂȂĂ܂AۂɓWJꂽ́A
փ}N̈𒼐ڑ邱ƂɂȂ܂B


DMA tag -- _gps2_setdma_6464 ---------- _gps2_setdma_dma --- _gps2_setdma_dmagif
VIF tag -- _gps2_setdma_323232324 -|			  |			
							  |
GIF tag -- _gps2_setdma_6464 ---------- _gps2_setdma_gif -|

RGBA	-- _gps2_setdma_f32323232 -------------------------- _gps2_setdma_rgba
XYZ2	-- _gps2_setdma_32323232  -------------------------- _gps2_setdma_xyz2
RGBA	-- _gps2_setdma_f32323232 -------------------------- _gps2_setdma_rgba
XYZ2	-- _gps2_setdma_32323232  -------------------------- _gps2_setdma_xyz2
RGBA	-- _gps2_setdma_f32323232 -------------------------- _gps2_setdma_rgba
XYZ2	-- _gps2_setdma_32323232  -------------------------- _gps2_setdma_xyz2


(Ȇ)
_gps2_setdma_dmagif --- grd_draw_vgtriangle ( ---  grd_2d_gtriangle )
                     |
_gps2_setdma_rgba   -|
_gps2_setdma_xyz2   -|
_gps2_setdma_rgba   -|
_gps2_setdma_xyz2   -|
_gps2_setdma_rgba   -|
_gps2_setdma_xyz2   -|

				}

  āAgrd_draw_vgtriangle()GSł炩ߐݒ肳ꂽ\W
ɕ`܂BGS̕\WGS̃WX^AXYOFFSETSCISSORŐݒ肵
̂łAlPS2 Linuxłps2_gs_set_dbuff/_dc()Őݒ肵\
ps_gs_dbuff̒GS֓]邽߂̃^OƂĊi[Ă܂BႦ
΁ANTSC 640x448(C^[[X)̏ꍇA}̂悤ȍWƂȂĂ܂B

		    0 -----------------------------------> 639

		2048-320	      2048		2048+319
 0	2048-112    -----------------------------------------
		    |                   |                   |
 |		    |                   |                   |
 |		    |                   |                   |
 V		    |                   |                   |
	2048	    -----------------------------------------
		    |                   |                   |
		    |                   |                   |
		    |                   |                   |
		    |                   |                   |
223	2048+111    -----------------------------------------

				}

  ́A2Dňɂ́Aʍ(0,0)ɂłAC^[[X
ǂɊ֌WȂ𑜓x̂܂܂ň̂ŁAgrd_draw_vgtriangléA
grd_2d_gtriangleƂ}NŃbsOāA̍WϊƂ
s܂B
  ʃQ[ł͉𑜓x͌ŒɂȂꍇقƂǂƎv܂AR
pCɒl𐮐ŌŒ肵Ă܂Ȃ΁A}N̈ŕϐgp
ȂꍇARpCɂĒ萔WJWϊǉƂɂ
̃yieB͂܂B
  GS̃v~eBuɑ΂Ĉȏ̂悤ȒۉsƂɂāAPS2
DMA]f[^쐬͌]ɂ邱ƂȂiiɈ₷ȂƎ
lĂ܂B
  ƂŁAGS̃v~eBu̎ނPRIMWX^Ŏw肵܂B
GIF^Oɒږ߂邱Ƃł܂Bv~eBu̎ނɂ͐}̂悤Ȃ
̂܂̂ŁApIȃx܂Œۉ邽߂ɂ́Agp
v~eBuׂĂɑ΂ă}N̒`sKv܂B

	POINT		... _
	LINE		... 
	LINE STRIP	...  (Xgbv)
	TRIANGLE	... Op`
	TRIANGLE STRIP	... Op` (Xgbv)
	TRIANGLE FAN	... Op` (t@)
	SPRITE		... lp`

			}

  āAPRIMWX^Ŏw肵AGIF^OɒږߍނƂł
vfƂāA̑܂B͐}̂悤ɂȂĂ܂B

	IIP	... VF[fBO (O[[/tbg)
	TME	... eNX`}bsO ON/OFF
	FGE	... tHO ON/OFF
	ABE	... At@ufBO ON/OFF
	AA1	... 1pXA`GCAVO ON/OFF
	FST	... eNX`W̎w@ (STQ, UV)
	CTXT	... ReLXg1,2̑I

			}

́AgpꍇɂāAw肷鑮̑gݍ킹قȂ܂B
𗎂ƂɎw肷ׂłAgrd_draw_*grd_2d_*Ŏۂɒ
`邱ƂlƁAŏw肵ĂsƁAgp
ɔf܂B
KAŏIIɂ̓rbgZbg邱ƂɂȂ邽߁A}ÑIvV
ĒlnA}NŘ_apďĂ܂B̂悤ɂ΁A
ϐw肵ȂAׂăRpC̒萔WJŏ܂̂ŁAEE
gp̏ɑ΂yieB͂܂񂵁Aw肵ɎRPRIM
wł܂B
  āAGS̕`掞ɐؑւ\Ȃ̂ƂāADMA̓]ɂPATH̑ɁA
ReLXg݂܂BGS̕`ɂ͐悾ĐݒsƂŕ`@
E郌WX^܂B̒̂̓ReLXg
Ċؑւ邱Ƃł܂BPATH1,PATH3ŕ񂳂ĕ`s
ꍇA`ꂼPATHœƗĊǗKvAReLX
g̎gpprƂĂ͑\IȂ̂łB܂As`sȂꍇłA
eNX`2ؑւȂ`悳ꍇALpłƂ
낢Ƒ݂܂B
  ]āAReLXg̐؂ւAPATHƓlɐ؂ւ@\pӂ
ƂłAŕϐgpĂ܂ƁA̒萔WJ
ȂȂȂ܂̂ŁA{IɃReLXg1ȊOgp鎞́AI
vVƂĎŐݒ肵܂BꌩAsւɌ܂AۂɎŐ
ւĎgp̂֗ȂƂ́AړIȊOɂ͂Ȃ悤Ɏ͊
܂B
  ̃}N`͐}̂悤ɂȂ܂B

#define grd_set_currentcontext(_CTXT) \
	__grl_ps2draw_context = (_CTXT);

#define grd_get_currentcontext() __grl_ps2draw_context


grd_2d_gtriangle( x, y, ...,
	GRDRAW_OPT_GOURAUD | GRDRAW_OPT_ALPHA |
		GS_PRIM_CTXT_V(grd_get_currentcontext()) );

	ReLXgݒɊւ}N`Ǝgp@

			}

  āÃReLXgɐݒ肳f[^͂߂ƂāAGSł̓v
~eBu`ɑ΂āA`ɐ悾Đݒ肵ĂƂŕ`@E
郌WX^̂͑Oq̒ʂłAłALPHAATESTAZBUF
͕pɂɎgp̂ł͂ȂƎv܂B
  ALPHA̓l̈𐧌ł܂̂ŁATEST(eXg)Ƒgݍ킹āA
낢ȕ`ʂł܂BTEST(fvXeXg)ZBUF̑g
킹AZBUFXV邩AQƂ邩ŕpɂɎgƂɂȂƎv
B
  ɂĂYɈƂłBX-Window̃OtBbNR
eLXgMS-WindowsGDCQlɁAftHgF̊ǗāA
Iɂ悤ȋ@\Ό𗎂ƂgՂłł傤BcO
ÃTvvOł͓ɉsĂ܂B
  GS͊̋@\gݍ킹邱ƂɂāAɑ̎oIʂ
邱Ƃł܂AɂĂ͎񐔂݂Ƃ
Ă炢łA{eň͂܂񂪁AȒPɊ{
IȃeNjbNɐGĂ܂B
  GS̓t[obt@͂łRȐݒ肪\ŁAV-RAM̈ʒu
XATCYRɐݒ肷邱Ƃł܂BāAƗ̈
`悳āA`悵eeNX`ƂĖ{̗̈֕`悷邱Ƃ
܂B̉pƂāAݕ`撆V-RAM̓eOt[V-RAM̓
eeNX`ƂĈƂł܂ARɕҏW\łB
ƁAALPHAATEST͂߂ƂlXGS̃WX^gݍ킹邱
ɂāAɑ̔\𓾂邱Ƃł܂BPS2̃Q[ł悭
pڂGS̋@\ƂĂ͌܂񂪁ẢpƂ
eNX``̊gk̕⊮𗘗pĎł܂B
  āÂ悤ɂĒ`DMAobt@ƃpPbgݒ}NłA
ŗǂ̕@Ƃ͉ƂȂƎɓbƂȂĂ܂B̋c_O
ɁAPS2̃vO~ǑXɂďGĂȂ΂Ȃ܂B
  ۂPS2̃vO~OsĂāAӊOɎvƂ́A͂ȃv
OύX傫ptH[}XE邱ƂpɂɂƂƂ
B̌PS2̃A[LeN`ɋN܂BȂ킿AEEɂ
Cachȅ(2nd cacheȂ)ALbV~XqbgARD-RAM̓AR
pC̃IveB}CYɉāA񓮍삷GS/VPU1̃vO
֌WAÂ炭ȂĂ܂BɉA₱vO
~Os낵Ȃ猟؂𓾂Ȃ߃`[jOeՂłȂ
ƁAăRcނ܂łɂ₽ƎԂ邱ƂȂǂAPS2̃v
O~OƂ錴ɂȂĂ̂ł傤(Q[J
ł́AĴɖڂɌ錋ʂoȂƂA{ɋZpIɏڂ
lԈȊO͉Ȃ̂킩炸A܂ȂƂŋJ
]vcƂƂ邩܂)B
  AہAǂȃn[hEGAɂ悤Ȗ͂܂A
̃A[LeN`ቿiɎȏA̒x̋]͎dȂ
ƂŁAނA̒x̋]łȂ΂炵n[hEGA񋟂
̂ł當̂ґƂ̂ł傤BPS2̏ꍇAEEGS
ւĉBĂ镔͂܂񂩂A蒲ׂėR
Ă΁AقƂǂ̖͉ł܂BȂ킿A`Wb
n[hƂ܂A͂Ԃ|Ȃł傤B
  PS2̏ꍇAEȆxsRɒx́ALbV~Xqbg傫
֌WĂ܂B邽߂ɁALbV𒼐ڃRg[
AXNb`pbhDMAgݍ킹ăKKƗp@
܂BA񂹂Linux̃[UԂ̃vOł̎ƂȂƁA
X̂܂B
  b߂A̕@xXgł邩ǂƂƂɌyƎv
܂BłxXgȂ̂Ƃ́Aŗǂ̕@(łȒPɎgՂ)ŁA
ŗǂ̉(ł̗ǂ)𓾂̂Ǝ͍l܂BȂ킿A
Lq_ł͔ɔՂۉĂAȒPɎgpłARpC
͋@B̃xCPUƂǂsƂƂɂȂ
BcOȂA҂̗v͑Ă܂ΓIȉƂ̂͂
A҂̊Ԃł܂oXƂ邱ƂɂȂ܂B
  ̕@ł́Aۉŋ]ɂ̂ɂĂ͂łɌy
̂ŁACPǓpɂďqׂ܂B
  ܂́Aǂ̂悤ȃR[hLqĂœK邩ǂƂ_
܂B͗lXȃP[XŃAZuXgo͂ĒׂK
v܂ARpCZpiėǂR[ho͂悤
ɂȂƂ͂ARpC̏o͂R[hɍœKƂ͖̂
vŁA{ɑxvƂ͋@BꃌxŌɍœK邵
܂B̃Tv́AC̃xł͂قƂǖʂȂƂ
ƂƁAɏ\CPU̎sӎR[ho͂Ƃ_
ŁA͗ǂ̂ƍlĂ܂B
  ́A#define𑽗pĂ܂߁AׂĂinlineɓWJA
ۂ̃R[h傫ȂALbVɎ܂ȂȂ₷Ƃ_łB
gcc-O3w肷-finline-functionsLɂȂA\Ȍ֐
inlineWJ͂߂܂ȀꍇłƂĂ͂܂܂B
֐ďoꍇA֐̋K͂֐ďõI[o[wbh\
ɑ傫A֐WJȂƂɂăLbVLɎgꍇA
inline͋tʂłB
  ̖̑I͎ɓAɃLbV̏PS2ł͔fɂ
̂łARpCR[h\zՂƂA\ɍœK
R[h͏[vɂ邱ƂłA\OCache~Xqbg
ȂLq@\ł邱ƁAۂɎĂ݂ƌǂ̕
ɂȂƂȂǂA͂̂悤ɎĂ܂B
  ǂ̂ƂA̕@͌IɎł郌xCPUǂg
płAۉɂĂg₷xŏłĂƂƂŁA
vgՂ𗎂Ƃɂ܂ł܂Ag[
hItƂĂ͖]܂ƂƂĂƎ͍lĂ܂B
  ɂPS2̃Q[J̌o܂AȑOJۂɂ́Â
YȎ@͎ꂸAǁAŏɒr[Ɍ߂\̂܂܃}X^[
Abv}Ă܂܂B̂悤ȍ\͈x肵Ă܂ƁA`[
jO̖Ɨ݁AŕύX̂ʓ|(ɕlŊJĂƕ
S̓eɂĂ͎s\)łAŏɎԂČ
ƂłB

 eNX`]

  āA܂GSāAv~eBu\@ɂďqׂ
̂ŁAɃv~eBuɃeNX`𒣂t܂B
  Oq̎Op`ɃeNX`𒣂tƂȂƁA}̂悤Ɏwł
傤BǉׂƂ́AGSPRIMփeNX``̑w肷邱
ƂƁAOp`ւ̃eNX`Ww肷邽߂ɁASTQw肷邱ƂłB


DMA tag -- _gps2_setdma_6464 ---------- _gps2_setdma_dma --- _gps2_setdma_dmagif
VIF tag -- _gps2_setdma_323232324 -|			  |
TEX0	----- TEX0		  ---|			  |
TEX1	----- TEX1		  ---|			  |
							  |
GIF tag -- _gps2_setdma_6464 ---------- _gps2_setdma_gif -|

STQ	-- _gps2_setdma_323232(32) ------------------------- _gps2_setdma_stq
RGBA	-- _gps2_setdma_f32323232 -------------------------- _gps2_setdma_rgba
XYZ2	-- _gps2_setdma_32323232  -------------------------- _gps2_setdma_xyz2
STQ	-- _gps2_setdma_323232(32) ------------------------- _gps2_setdma_stq
RGBA	-- _gps2_setdma_f32323232 -------------------------- _gps2_setdma_rgba
XYZ2	-- _gps2_setdma_32323232  -------------------------- _gps2_setdma_xyz2
STQ	-- _gps2_setdma_323232(32) ------------------------- _gps2_setdma_stq
RGBA	-- _gps2_setdma_f32323232 -------------------------- _gps2_setdma_rgba
XYZ2	-- _gps2_setdma_32323232  -------------------------- _gps2_setdma_xyz2

(Ȇ)

_gps2_setdma_dmagif --- grd_draw_vgttriangle ( ---  grd_3d_vgttriangle )
                     |
_gps2_setdma_stq    -|
_gps2_setdma_rgba   -|
_gps2_setdma_xyz2   -|
_gps2_setdma_stq    -|
_gps2_setdma_rgba   -|
_gps2_setdma_xyz2   -|
_gps2_setdma_stq    -|
_gps2_setdma_rgba   -|
_gps2_setdma_xyz2   -|

				}

  eNX`WeNZWŒڎw肵ɂ́AUVg܂B
PS2̃eNX`TCY2̋ЏłȂ΂Ȃ܂񂪁AUVgƂ̂
Ȑ邱Ƃł܂̂ŁA摜\ꍇɕ֗
łBAUVۂɎgpہA܂włȂĔY񂾌oN
łx͂̂ł͂Ȃł傤BYꂪłAUVŎw肷eNZ
ẂA0.5hbg炷Kv܂B
  āAۂɕ`pPbgςޑOɁATEX0, TEX1ɃeNX`
V-RAM֓]ĂKv܂B
  eNX`V-RAM֓]@́ADMA]obt@ɓ]߂
łAGIF^OImage[hg܂B]TCY̐(DMA
̓]TCY16rbgwłA128rbgPʂŏAGIF^ONLOOP
15rbgwłAIMAGE[h]ɂ128rbgPʂŏ)܂
̂ŁA}̂悤ȃvO\ŋLqł܂B


	DMA^O,VIF^O,GIF^OZbg
	BITBLTBUFZbg
	TRXPOSZbg
	TRXREGZbg
	TRXDIRZbg
        rest = ]TCY
        while (rest > 0) {
                if (rest > 16*32767)
                        len = 32767;
                else
                        len = (rest+15)/16;
                DMA^O,VIF^O,GIF^O(GIF_FLG_IMAGE)Zbg
		VIF^OZbgāAeNX`f[^
			DMAref^Oœ] (p, len)
                rest -= len*16;
                p += len*16;
        }
	TEXFLUSHZbg

				}

  āAV-RAMւ̓]łAPS2V-RAM͂m̒ʂ肠܂傫
Ƃ͌܂̂ŁAłV-RAMTCY̎gpʂNTSCłĂ
V-RAM͊ȒPɈtɂȂĂ܂܂B
  ̂APS2GS-EEԂ128bit 150MHzƂɍȃoX
Ō΂Ă܂̂ŁAKvɉăeNX`f[^]Ƃ
ƂpIɎsł܂BāAۂɂ̓eNX`̎gp
V-RAMgpOV-RAM̋󂫗̈mۂāA]_Ci~bN
肵ē]邱ƂɂȂ܂B
  GSV-RAM̍\͐}̂悤ɂȂĂ܂B

	-----------------------------------------
	|	  |	    |			|
	| ubN|	    |			|
	|(256byte)|	    |			|
	|----------	    |			|
	|     		    |			|
	|       y[W	    |			|
	|(8Kbyte=32ubN)|			|
	|     		    |			|
	|--------------------			|
	|					|
	|		V-RAM			|
	|	    (4Mbyte=512y[W)		|
	|					|
	-----------------------------------------

			}

  eNX`]AhX̓ubNPʂŎwł܂BAeNX`
tH[}bgɂGSC^[[u郁̍\ω܂̂ŁA
ubNPʂ艺̃TCYŕ̃eNZi[tH[}bg݂
Ǘꍇɂ͒ӂKvłBłV-RAMLɎgƂ
łA̓w͂ɂGS̕`掞Ԃ̒ZkƁAEECPUԂ̏V
ȂAoXƂKvł傤B
  4bitA8bit摜f[^̏ꍇ́ACfbNXf[^ƃNbg2ɕ
Ă܂܂ANbg̊ǗKvɂȂ܂B8bit摜̃Nb
g̓ItZbg0x08-0x0f,0x10-0x18ւ܂̂ŒӂKvłB
eNZi[tH[}bgɂĂNbgt摜ӎRGB24rbg
eNX`f[^ƃCfbNXf[^𓯎ɔzu铙Apł
̂pӂĂ܂AIɏɊǗāAŜƂČ
AbvɂȂ悤ɎgpƂȂƂȂȂ̂܂B
܂łƁApł邩ǂPS2ŎۂɎeɍE
̂ł͂ȂƎv܂B
  ̂悤ȓIȗ̈̔zu@ɂẮAzL̃蓖
ASYpłł傤BႦ΁Aʂȃn[hEGAKvȂ
PȃASYpAeNX`QƂ񐔂𐔂āA񐔂
Ȃ̂eNX`gp̈J@ł傤B̒
xȂCPU܂]Ɏg킸ɃoXǂeNX`蓖Ă̖
ł܂B
  AIȃmۂƔzuɂĂ̍œKȉIȎԂœ
ǂASY݂͌̂Ƃ날܂񂵁A炩߃tOe[
V̔NȂԂŃf[^pӂĂ悤ȂƂȂA
tOe[VSɉ邱Ƃ͂ł܂Bǂ@
łǂ܂Ŏ邩CPU̎gpʂƂċ鎞ԂƁAۂɓ
Ӗ̂ʂƂ̃g[hItƂȂ܂B͕`ełA
ʓIȉ@͂Ȃł傤B
  ́AȂƂɋÂ邭炢ȂAV-RAMg؂猉NA
Ă܂̂ł͂Ȃƍl܂BŔA`悳eɂ
܂APS2V-RAMɑ΂ē]eNX`͏\ɏ̂\
ɑ傫߂̂܂ŃoGeBɕxłɍėpeNX`
͔ɏȂ̂ŁAɃeNX`V-RAMɎcĂƁAėp
\Ƃ_AeNX`zu̎זɂȂm̕ƍ̂
͂Ȃƍl邽߂łB
  ۂɃeNX`]ʂɂēIȔzuǗɂāAe
NX`L̓Ǝv邱ƂĂ܂B

EœKꂽvOł́A1t[œeNX`gp
Ƃ͎͂܂B̂悤ȃeNX`͔ɏłB
  eNX`LbV𐶂߂ɂAʓIɃeNX`̓\[g
܂Ƃ߂Ďgp܂BÓA`̏ԂdvƂȂ锼`Ȃ
̓ȗR̂ƂȂ܂BGS̔`͔gpȂ
ƔrăyieB͂܂񂪁A`̏Ԃ𐧌䂷ƂȂVPU1
pȂ܂̂ŁA|SgȂA
̏ȂfUCɂKv܂BƂāAɎ
𐶂މZꍇɂĂ͑płł悤B

EeNX`̂pɂɎgp̂V-RAM̗̈Œɂƍl
܂񂪁Aۂ̎gp󋵂lƂA悭Ȃprl
܂łBǂقƂǂ̃eNX`1xgpȂƂ
PS2̃OtBbNp[\ɊpAvP[V̏ꍇAV-RAM
e1t[̕`ŉxeSɒu邽߁A
lƌŒ肵eNX`V-RAMAhX蓖Ă̎זƂȂ邾
B

  āAeNX`̎ɂẮAɁAMIPMAPΉANb
gΉKvȍƂł傤BȒPɐGƎ̂悤ɂȂ܂B
  MIPMAP͕`TCYɂāA̃x̕āAeNX`I
ZpłBȂeNX`k̓słĉȂ
̂hA|Sɑ΂ēKeNX`ΉāA`
x̒ቺhƂł܂B
  MIPMAṔAMIPMAP̃eNX`V-RAMɓ]ĂATEXWX^
MIPTBPWX^Ńp[^w肷邾łAIɓ]eNX
`̃TCYMIPMAPgȂƔr2{߂ɂȂĂ܂܂B
MIPMAP͑SȂV-RAMɔzuƊyłAooV-RAMɔzu
邱Ƃł܂B̏ꍇV-RAM̃tOe[V肪y
ł傤B
  NbǵANbgteNX`(4bit, 8bit)̃Nbĝ݂
ނpӂANbĝ݂ύX邱ƂłقƂCPUg킸ɐF
ύXZpłBNbgPS2Ŏ邽߂ɂ́A`掞TEX
WX^Ɏw肷NbgۂɕύX@܂A4bitNbg
ɌANbg8bitƂ256FȓŗpӂTEX0WX^CSA
offsetőI@܂B
  āAň肪܂BNbgMIPMAP悤
PS2̃eNX`ɂ҂̔ėp2DtH[}bgŃW[ȃc[
悤Ȃ݂̂͑ȂƂƂłB2D̃tH[}bg͕ʂɂȂĂ
΂̂łAc[܂ŗpӂƂȂƁAɍƂɂȂ܂B
  CZVɂ̓T[hp[eBTIM2`Ƃ̂JĂ
܂B͂̃tH[}bgPS2 Linux̓oƂƂɃCZVɌ
肷闝RȂȂ̂ŁAʌJ\̗\肪邻łBJ
Ȃ΂̂悤Ȃ̂płł傤B
  TIM2`́AƂƎ݌v(*)̂ł̂ŁA񂱂̂悤ȋL
ɂĎgΊył悩̂łAcOȂ炻܂͂
Ȃ悤łB

* ... ȑOAQ[̊JƋ2D̃OtBbNc[̊JSĂ
̂łAItBV2DtH[}bgȂ̂ŗpӂ̂łB
̂悤ȃtH[}bg͓ɃmEnE܂񂵁Aƃc[
̃tH[}bgɑΉȂ΂ȂȂȂ̂ŁA낭ȂƂ
܂BX^_[hȃtH[}bg݂邱ƂdvƎv܂B

  ۂɁAŃtH[}bg쐬ꍇAėpIGSŕKvȋ@\
邽߂̏ȒPɋƎ̂悤ɂȂ܂BŒƂāA~b
v}bvāANbgāADMA]ӎ16oCgAC
gɑΉ̂ł邱Ƃ܂B֗Ȃ̂ƂẮA
128oCgACgւ̑ΉANbg̃ItZbg
0x08-0x0f,0x10-0x18](4rbgNbg̔]T|[g)AeNX
`PʂŕύX\̂p[^ON/OFFł傤B
p[^͉\Ȃ̑SĂpӂƂ₽ƊǗ񂪑傫ȂĂ
܂܂Agp̈ȊO͗̈\pӂł΁AǗ
̃TCY}邱Ƃł܂xXgƎv܂B
  Oq悤ɁÂ悤ȃtH[}bg͑債mEnEȂɂ
炸Aƃc[ΉȂĂ͂ȂȂ߁A̕
ŋLǂƎv܂B
  āÃTvvOł̎ɂĐG܂ƁAɃl
eNX`gKv܂ł̂ŁAWindows̉摜̏c
ꂼ2̋ЏłBMP`t@CgpĂ܂B(4bit, 8bit,
24bitɑΉ) AA\̔Ŏgp̂ŁARGBׂ0
̎ɂ̓0ƂȂ܂BvOƂĂ͕NbgǗĂ
܂ABMP`ɂ͂܂̂ŁAgp邱Ƃ͂ł܂BMIPMAP
͂Ӗ܂̂ŁAeNX`̊Ǘ̃R[h͎Ă܂
AMIPTBPGSWX^̐ݒ肪r[łBeNX`̗̈̊mۂ
y[WPʂœIɊmۂĂ܂BV-RAMςɂȂꍇ͂
܂V-RAMNAĂ܂܂B̂悤ɂȂĂ闝ŔAOq
悤ȗR܂ÃeNX`܂Ƃ߂ĊǗ@\
TvvOɂ͗pӂĂȂƂɂ܂B

  ȏAƂĂ̐[PS2ɂĂ͊ȒPɂ܂A{eł
PS22̃OtBbNDMÄɂĂ͈ʂIƂ܂B

 OtBbNpCvCƃWIgϊ

  āA3OtBbN̕\s܂B3OtBbN̎
́A܂[Jԏň̃IuWFNg쐬Aă[
hWԏɍ쐬IuWFNgzuAAJ肵܂B
  āA쐬ꂽ3W̃f[^2DXN[WɕϊāA
ۂGSŕ`s܂B(})

-----------------------     ------------------------
|                     |     | IuWFNgzu   |
|  IuWFNg쐬 |     | AJ肵 |
|                     |	--> | ŃV[܂Ƃ߂   | -->
|([JWԏ|     |([hWԏ |
| ʂ)     |     |  ʂ)     |
-----------------------     ------------------------


(Ȇ)

------------------------     ----------------------
| 3DW̃IuWFN |     |GSŉBʏ      |
|gɑΉfBXv| --> |       s` |
|C̈ʒu߂      |     |			  |
|(2XN[ԏ|     |(fBXvC   |
|̌ʂ)     |     |   ۂɕ`悳)|
------------------------     ----------------------

	3OtBbN_OpCvC

			}

  GSł̕`́AłɏqׂʂA߂ꂽ2DŴ܂܃LbN
łBGSɂZobt@܂̂ŁAłȂv~eBuɂ
ẮÂ܂ZWw肵ĕ`悷邾ŕ`̏㉺֌W͉
܂BA`GCAX߂ɂ͕`̏ԂlKv
܂AZ\[gKvɉėpӂ铙ƂKvłB
  cƂẮA3OtBbNA̗őɕKv
ZpƂẮA3DW(x,y,z)_ɏ]2DW(x,y)֕ϊƂ
Kvł̂ŁAȉɂ܂B̏𓧎eƂ܂B

EW

  WϊƌƁAȉ̂悤ȎZwŕ׋Ƃv
ôł͂Ȃł傤B

	( x' )   (a b) ( x )   ( m )
	(    ) = (   ) (   ) + (   )
	( y' )   (c d) ( y )   ( n )

  ̎ł́Aʏ̓_(x,y)_(x',y')ւ͔Cӂ̈ʒu֕ϊ邱Ƃ
ł܂Asړ̂߂ɂ(m,n)KvłB͓W
(homogeneous coordinate)𓱓邱Ƃɂĉ邱Ƃł܂B
̏ꍇł́As̎グ邱ƂɂĕsړZ̍s
߂ނƂłA_ɑ΂Cӂ̕ϊ1̍sẐ݂ŉ\
ƂȂ܂B
  ʂƂāA̍Wϊ͈ȉ̂悤ɋLqł܂B

	( x' )   (a      b   m) ( x )
	(    ) = (            ) (   )
	( y' )   (c      d   n) ( y )
	(    )   (            ) (   )
	( w' )   (0      0   1) ( 1 )

  ΏۂƂĂ̂2WłA3WŎsK
v܂̂ŁA3(x,y,z)̍W4(x,y,z,w)ňƂɂȂ
B
  PS2VPUgpƁA432rbg̐ϘaZ1xɏł
܂A4x4s4xNg̉Z4߂ŉZ\łB

Ee

  P(xv, yv, zv)_C猩View plane̓_ P(xs, ys, zs)ɕϊ铧
e͐}̂悤ɂȂĂ܂Bzs͕`掞̏㉺֌W̔fɎgp܂B
-1 < xs < 1, -1 < ys < 1, 0 < zs < 1ƂȂ܂B
  (͒xv, yv, zv, xs, ysv,s͉tł肢܂)





			}(ʎ̐}B)

  _̋dƂAd`f܂ł̊Ԃ3ԏ̍W𓧎e
B(d=_̋=Near clip plane, f = far clip planełBclip
plane̓fBXvCɑ΂ĕ`悵܂)
  xɑ΂Ēڂ}͎̂悤ɂȂ܂B





			}(ʎ̐}C)

  ŁAView planexs[-1,1]ƂȂ悤ɂȂ΁A

	      d     xv
	xs = ----E----
              hx    zv

ƂȂ܂Blɂyŝ悤ɂȂ܂B

	      d     yv
	ys = ----E----
              hy    zv

  zśA[0,1]ƂȂ悤ɁAzv[d,f]ΉƁA

	        f        d f     1
	zs = ------- - -------E----
	      f - d     f - d    zv

Ƃ킷Ƃł܂B
  ]āA

  ( X )         ( xv )
  ( Y ) = Tpers ( yv )
  ( Z )         ( zv )
  ( W )         (  1 )		(Tperspers͉tł肢܂)

AA
	xs = X/W
	ys = Y/W
	zs = Z/W

ƂȂ悤ȁAXYZŴ͎悤ɂȂ܂B

	     d
	X = ----Exv
             hx

	     d
	Y = ----Eyv
             hy

	       f            d f
	Z = -------Ezv - -------
	     f - d         f - d

	W = zv

  ]āATperŝ͎悤ɂȂ܂B

		(  d                      )
		( ---  0     0       0    )
		(  h                      )
		(      d                  )
		(  0  ---    0       0    )
	Tpers =	(      h                  )
		(            f      -df   )
		(  0   0  ------- ------- )
		(          (f-d)   (f-d)  )
		(                         )
		(  0   0     1       0    )
		(                         )

  1/W͉p͈͂Lpl܂BƁAeNX`
̃eNZW(STQ)QŁAp[XyNeBu␳Ɏgp܂B
  ۂɂ͉ʂ̔䗦NTSCȂ4:3ł̂ŁÃTvvO
łTpersd/hhcŕāAx, ỷʔ䗦Ă܂B
āAœꂽ̈̓XN[𑜓xZobt@̐[xl
Ă܂BTpersɖߍނƂ͊ȒPɂł܂As
Ǝɐ|SPʂ̃NbsOsłȂȂĂ܂܂B

ENbv

  View plane(xs,ys,zs)͕KA-1 < xs < 1, -1 < ys < 1, 0 < zs < 1
łB]āA`悵悤Ƃ}`̏邢́A-W < X < WA-W
< Y < WA0 < Z < W𖞂Ȃ_܂ނǂɂāA|S
ʊOɏo\邩ǂ𒲂ׂ邱Ƃł܂BPS2VPUɂ͂
ړÎ߂ɗpłCLIP߂܂B
  NbsOsɂ́A̔̌AlۂPS2̉𑜓xZob
t@̐[xɑΉĐ}`ۂɕ`悵܂BNTSCC^[[X 
640x448AZobt@24rbg̏ꍇ͎̂悤ɏ邱Ƃł܂B

                640
	Sx =   ----- Exs + 2048
                 2

                224
	Sy =   ----- Eys + 2048
                 2

                24           24
	Sz = -(2  -1)Ezs + 2  -1

  GSł2DW̃VUOɂĉʊÕ|S͕`悳Ȃ
Ƃł܂A2DWɂȂ_ŉʊOǂ肷邱
͂ł܂̂ŁAIuWFNgʊOɂ\鎞ɂ́A
̃NbvK{łB
  ƂŁAŔʂł̂̓|S̊e_ʓɎ܂Ă
ǂƂƂłBׂĎ܂Ăꍇ͗ǂ̂łA
ȊȌꍇ́ASɉʊOǂ画fł܂̂ŁA_
ʊOɂꍇ́AƏڍׂɔfāAʂɎ܂悤Ƀ|S
𐮌`铙̏uKvɂȂ܂B
  ̃Tvł͏𔲂܂āA|S̕\̉ʂ傫
߂ɍsƂɂāA悤ɏsĂ܂B
  ̂悤ȃNbv̑ɁA\ɂNbsO܂B
ƂȂ|S͈ʓIɉeɂȂ|SłA`sȂ悤
GSɖʂȏȂƂł܂B

  ̂悤Șb͉[A[ǋƂ肪܂BLł́A
Œ̂ƂɐGꂽ݂̂łA{eł3OtBbNXPS2Ŏ
邽߂̕@ɂĂ͏Iɂ܂B

 ptH[}X

  āAPS2 Linuxł̃vO~OɂẮAptH[}X̑肪
dvɂȂĂ܂B
  PS2 Linuxł/usr/doc/PlayStation2̉̃hLg邾prec
R}hgcc-profilingA̖ړÎ߂̕@pӂĂ
邱Ƃ킩܂BpďڍׂɃf[^𒲂ׂ̂@
傤B
  APS2̃OtBbNvO~Oł́Aڍׂȃf[^̎悵
̓e͂ƂȀꍇA1t[̌vZ
vāAA^Cɕ\AeɉԂ̕ω𒲂ׁA
Ԃ̂鏈ȒPĂƂ{ƂǂƂł܂B
  ł́Â悤ȍƕ@܂BۂɌv鎞Ԃ́Aet
[EȄԁAGS̏(PATH1, PATH3)łBGS̏Ԃ
Ă̓n[hEGA̎dlƂĂDMȀI荞݂GS̊荞݂
mȒlł܂A͘bȒPɂ邽߂ɏȗāAEE菈
Ԃɂ̂ݐl𑪒肵܂BŏIIɃ`[jOۂɁA
ptH[}X̑łȂ̂GSȂ̂ŁAœʂ̗p͑
ł傤B
  vĺA_Otɂĉʏɕ\܂B
  f[^̃oG[VɂāA@̃vO\͂낢
ƍl܂ATvvOł͐}̂悤ȍ\ő肵Ă܂B

	[ t[O ]
	start = getcurrenttime()
	[ EE ]
	[ Ot[̏Ԃʂɕ` ]
	ee_end = getcurrenttime()
	wait DMA(path1) stop and DMA(path3) stop
	gs_end = getcurrenttime()
	wait V-Sync
	[t[㏈AGS̃_uobt@ؑ֓]

	GS̏ = gs_end - start
	EȄ = ee_end - start

		}

  getcurrenttime()́A݂̎𓾂ƂłB̖ړÎ߂ɂ
/dev/perf_*głÃTvvOł͕ʂ̕@g
pĂ܂B2ޗpӂĂALinuxgettimeofday()p
@ƁA{12̃pb`pI/O|[g@Ēڃ^C}T3𒼐ڎQ
Ƃ̂łBT3߂ɂ́AVXeNbN̏񂪕Kv
ɂȂ܂ALinuxƂƂŁAJ[l\[XQlɂȂ܂B
(/usr/src/linux/arch/mips/ps2/kernel/time.c)

 t[obt@_v

  GSׂ̍ꍇAt[obt@t@CɗƂČ
ƂɂȂł傤B
  ̏ꍇAPɃt@C֗ƂȂ̂łANTSC/PAL̃C^[[
X̏ꍇ̓t[obt@܂̂ŁA𑜓xʂV-RAM
̓e𓾂邽߂ɂ́A1Õt[(_uobt@̗)玝
Kv܂B
  RA1Õt[ƌ݂̕\eقȂĂꍇɃt𑜓x
̉摜𓾂@ȂƂƂȂ܂A@͂
܂̂ŁAʂ̂̕ꎞIɎ~߂Ă̍HvKvłB
  낢ȉʃ[hɑΉꍇ́Â悤ȈႢlR[
hLqKv܂B

 TvvO

  ȏ̂̂܂Ƃ߂āATvvOuCube Demovt^
ɂ܂B̃vO͖{e̓eāAȉĂ܂B

EeNX`pĕ̐`̕\
EpbhpăJRg[
EtHg\
Et[obt@̃_v
EptH[}Xvp_Ot\

  ̂\邾ł͌|܂̂ŁAăf
Ă܂Bʐ^̂悤ɃftHg480̗̂ʂ̒Ŕђ˂܂B

  (t4PNGł̂ŁAKɎsʂƂĂB
͂܂܂)

  vȎ@͎̒ʂłB

EẼAiOƍ4{^ŃJʒuړ܂
EƁ~Ő`̐𑝌܂
ESELECTĂԈꎞ~ASELECTĂԂSTARTƁA
  t[obt@̂܂܃t@CɃZ[u܂B

  vO\͎̂悤ɂȂĂ܂B

  E Aݒt@C
	Makefile
	MCONFIG
	config.h
	config_ps2linux.h
	common.h
	init.c

  E ̃f̃C[`Af[^
	main.[hc]
	cube.[hc]

  E DMAAReLXgAGSݒ蓙
	def_dma.h
	def_gs.h
	context.h
	draw.[hc]

  E PS22DOtBbN
	prim.h
	prim2d.h
	bmp.h
	tex.[hc]
	font.[hc]

  E PS23DOtBbN
	matrix.[hc]
	geometry.[hc]
	prim3d.[hc]

  E vt@CAt[obt@Z[u
	debug.[hc]

  E ̑̃Tu[`
	fileio.[hc]
	memory.[hc]
	input.[hc]

  RpCĎsɂ́Â悤ɓ͂܂B

	make depend
	make
	make run

  RpCɈȉ̃IvVIł܂B

1. MCONFIGGDEFINES

  -DSCREEN_RES_FREE
	ʃ[hcubedemőNIvVŎRɐݒł܂B
	{IvVw肵ăRpĈݗLŁA
	NTSC 640x448, 640x224, PAL 640x512, 640x256, VGA 640x480I
	ł܂B

  -DSCREEN_RES_NTSC
	ʃ[hNTSC 640x448Œł
	(cubedemőNIvV͖܂)

  -DSCREEN_RES_PAL
	ʃ[hPAL 640x512Œł
	(cubedemőNIvV͖܂)

  -DSCREEN_RES_VGA
	ʃ[hVGA 640x480Œł
	(cubedemőNIvV͖܂)

2. config.h

  #define USE_TABLE_COSSIN
	#defineɂƁAsinf(),cosf()̂Ƀe[ugp܂B
	x͗܂AłB

  #define USE_DRAWPATH_3
	#undefɂPATH3̕`R[hȂȂ܂B

  #define GRG_CLIPAREA	1.5f
	|SNbvsʒuݒ肵܂BView plane̒S[
	܂ŋ̔{ƂȂĂ܂̂ŁA1.0fŒx̂܂܃XN[
	̃TCYƂȂ܂B

3. config_ps2linux.h

  #define USE_PHSYADR_DMA
  #define USE_VIF1DMA_TTE1
	̓͂܂Ƃ߂Ē`Kv܂B
	{12̃pb`p[hioctl()ɂDMAChain Mode
	n[hEGA߂܂B
	USE_PHSYADR_DMA`Ă鎞͓ɎԑI/O|[g
	ڐ䂵̂ƂȂ܂B(茋ʂɌʂɉe͂܂)

  #define USE_DIRECT_DMA_CONTROL
	L̂̓w肵ɗLłB
	#define`ƁADMAioctl()ł͂ȂI/O|[gLbN
	ċN܂B

  #define REDUCE_DMATAG
	USE_PHSYADR_DMA`ȂɎgp\łB
	DMÃ^O܂Ƃ߂āAȂ܂B

  ̑A{ŐGĂȂƂɂĊȒPɐ܂B
  ̕\f͐}(ʎ̐}D)̂悤ɂȂĂAf[^̓vO
ߍ݂ŗ^ATriangle Stripŕ`悳Ă܂BWIǧv
ZEEłׂɎsĂ܂BʂƂāAWIǧvZƕ\f[^
̐ݒ肾EE95%gĂAGS̕ɂȂ̗]T邱Ƃz
ł܂BŌɃeNX`łAtHgX11̃tHgKȂ
̂ȂRedHat 7.2J (FTP)/usr/share/nautilus̉ɂ̂
KɎėāATCYqXgOCABMP`ŕۑ
̂łB

 ܂ADMA]̔r

  RpCIvVŐ܂ÃTvvO͖{12
DMApb`ɂΉĂAconfig_ps2linux.ḧȉ̒`ύX
邱ƂŁA𐧌ł܂Bpb`ɂẮAۂ̗LɂĂ
[ŒƂADMA]̔rsĂ݂܂B
  ȉɓ\ȑgƁAꂼ̓Lq܂B
  ۂ̑xrɂċ̂́AsĂ݂ĂB
  PATH3DisableAԌv_Ot̐F̂A[ɕ\ΐF
vf̎ɕ\ԐFADMA]ɂ鎞ԂłBPATH3 Enable
́AꂼꂪÂԂƖ邢Ԃŋʂ܂B

1.	#undef USE_PHSYADR_DMA
	#undef USE_VIF1DMA_TTE1
	#undef USE_DIRECT_DMA_CONTROL
	#undef REDUCE_DMATAG

  IWi PS2 Linuxps2_dma_send()̂܂܎gpADMA^O
ȂĂ܂B
  łAftHg̗480̏ꍇŁADMA]JnɕKv
(ps2_dma_send̃^ȌDMÅJn)1t[ȏ̎Ԃ
Ă܂A`3t[̏ԂĂ܂܂B

2.	#undef USE_PHSYADR_DMA
	#undef USE_VIF1DMA_TTE1
	#undef USE_DIRECT_DMA_CONTROL
	#define REDUCE_DMATAG

  IWi PS2 Linuxps2_dma_send()̂܂܎gp܂ADMA^O
ȂׂȂȂ悤ɒĂ܂B̃TvłDMA^O
ɏȂȂ邽߁ADMA^Ô߂CPUԘQɂyieB
قƂǂȂȂAIɈƂł܂B

3.	#define USE_PHSYADR_DMA
	#define USE_VIF1DMA_TTE1
	#undef  USE_DIRECT_DMA_CONTROL

  {12̃pb`𓖂ĂJ[lKvŁAgioctl()gp
DMA]sĂ܂B̓n[hEGADMA]gp܂A
CPUԂ̃yieBAPǏďoԂ݂̂ƂȂ܂B

4.	#define USE_PHSYADR_DMA
	#define USE_VIF1DMA_TTE1
	#define USE_DIRECT_DMA_CONTROL

  {12̃pb`𓖂ĂJ[lKvŁAI/O|[g𐧌䂵
DMA]s܂BCPUԂ̓LbVNAioctl()I/O
ւ݂̏Ȃ̂ŁAyieB͂قƂǂ܂B̏Ƃ
ẮADMA̓]҂usleep()ɂ|[OɂȂĂ铙̈Ⴂ
܂B
  3.̒`{̃n[hEGA̐\ŁA2.̒`DMA^O̗ʂ팸
̂łByieBSȂł͂܂񂪁ÃTvx
Ȃ΁A̍HvŋCɂȂȂxɎ߂悤łBAADMAp
Pbg̍쐬ɗ]ȍƂ邽߂A኱Ŝ̏Ԃ߂ɂȂ
Ă܂܂B

 Ō

  ́APS2 Linux3OtBbNXƂƂŁA
\ăf쐬Ă݂܂AׂEEł̂܂܌vZsĂA
ꂾ͂łPS2̐^͔܂B̃Tv͂h
ɓ삷̂́A̓̓WIg̕ϊƕ\f[^̐ݒ肾Ŏ
EE95%gpĂ܂B
  svZɂ́AVPU0/VPU1płł傤Ae_̓ϊɂ
VPU1płł傤BNbv͎Op`1PʂōsĂ܂A
炩ߗ̂SɉʊOʓɂ邩𒲂ׂĂ΁A|S
PʂŃNbv̍sKv闧̂͌܂Aǂ
ł傤B̑ɂł_͂낢Ƃ肻łA
낢Ƒgݍ킹ƁAȂ̑xAbv߂ȋC܂B
  \͂ɂĂÂ悤ȗ̕\Ȃ΁AstHO炢
͓ȂƊDł傤BÃTv͂܂łƂ
B
  {Lō쐬TvvOłAGNU General
Public License (GNU ʌLgp)Kp܂B̂ŁA
ɂ܂PS2 LinuxقƂǎgĂȂ̎QlɂłȂ΁AƂ
͊ƂłB
  ҂ł́AVPU1pPS2̃vO~OƃptH[}X`[j
O܂B


()
1) Alan Watt: 3D Computer Graphics Third Edition, Addison-Wesley, 1993.

2) James D.Foley, Andries van Dam, Steven K.Feiner, John F.Hughes:
   Computer Graphics: Principles and Practice (Second Edition in C),
   Addison-Wesley, 1997.
   (M: Rs[^OtBbNX_ƎH  `Y Ė, I[,
   2001)

(\[X)
1) http://homepage1.nifty.com/fukui/ps2linux/
   {12fڂDMApb`A쐬vOuĂ܂B


ȏ
