appgfxinit.c
4.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*======================================================================*/
/* NuSYS */
/* nugfxinit.c */
/* */
/* Copyright (C) 1997, NINTENDO Co,Ltd. */
/* */
/*----------------------------------------------------------------------*/
/* Ver 1.2 98/07/06 Created by Kensaku Ohki(SLANP) */
/*======================================================================*/
/* このファイルは、NuSystemのソースファイルnugfxinit_ex2.cからコピーし、
若干の変更を加えています。 */
/* F3DEX_GBI_2は既に定義されているはず */
#ifndef F3DEX_GBI_2
#define F3DEX_GBI_2
#endif
#include <nusys.h>
/*------------------------------------------------------*/
/* 登録するグラフィックマイクロコード */
/* マイクロコードを変更する場合は,ここに追加するか */
/* 変更するようにしてください */
/*------------------------------------------------------*/
/* このサンプルではこれだけを利用する */
static NUUcode nugfx_ucode[] = {
{(u64*)gspF3DEX2_fifoTextStart, (u64*)gspF3DEX2_fifoDataStart}, /*0*/
{(u64*)gspF3DEX2_xbusTextStart, (u64*)gspF3DEX2_xbusDataStart}, /*1*/
};
static u16* FrameBuf[3] = {
(u16*)NU_GFX_FRAMEBUFFER0_ADDR,
(u16*)NU_GFX_FRAMEBUFFER1_ADDR,
(u16*)NU_GFX_FRAMEBUFFER2_ADDR
};
/*------------------------------------------------------*/
/* 最初にRDPを初期化するディスプレイリスト */
/*------------------------------------------------------*/
static Gfx rdpstateinit_dl[] = {
/* set all of the attribute registers to zero */
gsDPSetEnvColor(0,0,0,0),
gsDPSetPrimColor(0,0,0,0,0,0),
gsDPSetBlendColor(0,0,0,0),
gsDPSetFogColor(0,0,0,0),
gsDPSetFillColor(0),
gsDPSetPrimDepth(0,0),
gsDPSetConvert(0,0,0,0,0,0),
gsDPSetKeyR(0,0,0),
gsDPSetKeyGB(0,0,0,0,0,0),
/* set combine mode */
gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
/* initialize the scissor box */
gsDPSetScissor(G_SC_NON_INTERLACE, 0, 0,
NU_GFX_INIT_SCREEN_WD, NU_GFX_INIT_SCREEN_HT),
/* initialize all the texture tile descriptors to zero */
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0),
gsDPSetTileSize(0, 0, 0, (1 - 1) << G_TEXTURE_IMAGE_FRAC, (1 - 1) <<
G_TEXTURE_IMAGE_FRAC),
gsDPSetTileSize(1, 0, 0, (1 - 1) << G_TEXTURE_IMAGE_FRAC, (1 - 1) <<
G_TEXTURE_IMAGE_FRAC),
gsDPSetTileSize(2, 0, 0, (1 - 1) << G_TEXTURE_IMAGE_FRAC, (1 - 1) <<
G_TEXTURE_IMAGE_FRAC),
gsDPSetTileSize(3, 0, 0, (1 - 1) << G_TEXTURE_IMAGE_FRAC, (1 - 1) <<
G_TEXTURE_IMAGE_FRAC),
gsDPSetTileSize(4, 0, 0, (1 - 1) << G_TEXTURE_IMAGE_FRAC, (1 - 1) <<
G_TEXTURE_IMAGE_FRAC),
gsDPSetTileSize(5, 0, 0, (1 - 1) << G_TEXTURE_IMAGE_FRAC, (1 - 1) <<
G_TEXTURE_IMAGE_FRAC),
gsDPSetTileSize(6, 0, 0, (1 - 1) << G_TEXTURE_IMAGE_FRAC, (1 - 1) <<
G_TEXTURE_IMAGE_FRAC),
gsDPSetTileSize(7, 0, 0, (1 - 1) << G_TEXTURE_IMAGE_FRAC, (1 - 1) <<
G_TEXTURE_IMAGE_FRAC),
gsDPPipeSync(),
gsSPEndDisplayList(),
};
/*----------------------------------------------------------------------*/
/* nuGfxInit - グラフィックスレッド,マネージャの初期化 */
/* IN: 特になし */
/* RET: 無し */
/*----------------------------------------------------------------------*/
/* この関数名を変更しておく */
void appGfxInit(void)
{
Gfx gfxList[0x100];
Gfx* gfxList_ptr;
/* グラフィックスレッドの起動 */
nuGfxThreadStart();
nuGfxSetCfb(FrameBuf, 3); /* フレームバッファの登録 */
nuGfxSetZBuffer((u16*)NU_GFX_ZBUFFER_ADDR);
/* フレームバッファ切り替えのコールバック関数登録 */
nuGfxSwapCfbFuncSet(nuGfxSwapCfb);
/* FIFOマイクロコードのFIFOバッファ設定 */
nuGfxSetUcodeFifo(nuRDPOutputBuf, NU_GFX_RDP_OUTPUTBUFF_SIZE);
/* グラフィックスマイクロコードの登録 */
nuGfxSetUcode(nugfx_ucode);
/* グラフィックタスクマネージャの初期化 */
nuGfxTaskMgrInit();
/* 最初に1回だけ必要なRDPの初期化をここでおこないます */
gfxList_ptr = gfxList;
gSPDisplayList(gfxList_ptr++, OS_K0_TO_PHYSICAL(rdpstateinit_dl));
gDPFullSync(gfxList_ptr++);
gSPEndDisplayList(gfxList_ptr++);
nuGfxTaskStart(gfxList,
(s32)(gfxList_ptr - gfxList) * sizeof (Gfx),
NU_GFX_UCODE_F3DEX , 0);
/* タスクが終了するのを待ちます */
nuGfxTaskAllEndWait();
}