nnsched.h
4.59 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
134
135
136
137
138
139
140
141
142
143
144
/*============================================================================
NINTENDO64 TECHNICAL SUPPORT CENTER
NINTENDO64 SAMPLE PROGRAM 1
Copyright (C) 1997, NINTENDO Co,Ltd.
============================================================================*/
#ifndef _NN_SCHED_
#define _NN_SCHED_
#include <ultra64.h>
#define NN_SC_STACKSIZE 0x2000 /* スレッドスタックサイズ */
#define NN_SC_SWAPBUFFER 0x0040 /* フレームバッファの切り替え */
#define NN_SC_RETRACE_MSG 1 /* リトレースメッセージ */
#define NN_SC_DONE_MSG 2 /* タスク終了メッセージ */
#define NN_SC_PRE_NMI_MSG 3 /* NMIメッセージ */
#define NN_SC_GTASKEND_MSG 4 /* タスク終了メッセージ(グラフィックタスクで
タスクのみ終了の場合) */
#define NN_SC_MAX_MESGS 8 /* メッセージバッファのサイズ */
/* スレッドのプライオリティの定義 */
#define NN_SC_PRI 120 /* スケジューラ */
#define NN_SC_AUDIO_PRI 110 /* オーディオ */
#define NN_SC_GRAPHICS_PRI 100 /* グラフィックス */
/* イベントメッセージの定義 */
#define VIDEO_MSG 666 /* リトレースメッセージ */
#define RSP_DONE_MSG 667 /* RSPタスクの終了 */
#define RDP_DONE_MSG 668 /* RDP描画の終了 */
#define PRE_NMI_MSG 669 /* NMIメッセージ */
/*
パフォーマンスチェック用
RCPのパフォーマンスをチェックする場合には
NN_SC_PERFをdefineしてください。
*/
#define NN_SC_PERF
#define NN_SC_PERF_NUM 4
#define NN_SC_GTASK_NUM 8 /* グラフィックタスク最大数 */
#define NN_SC_AUTASK_NUM 4 /* オーディオタスク最大数 */
/*===========================================================================*/
typedef short NNScMsg; /* スケジューラメッセージタイプ */
typedef struct SCClient_s { /* クライアントリスト構造体 */
struct SCClient_s *next; /* 次のクライアントへのポインタ */
OSMesgQueue *msgQ; /* クライアントに送信するメッセージ */
} NNScClient;
typedef struct SCTask_s { /* タスク構造体 */
struct SCTask_s *next; /* 注意: 常に構造体の先頭に配置する */
u32 state;
u32 flags;
void *framebuffer; /* グラフィックスタスク用 */
OSTask list;
OSMesgQueue *msgQ;
OSMesg msg;
} NNScTask;
typedef struct { /* スケジューラ構造体の定義 */
/* メッセージ */
NNScMsg retraceMsg;
NNScMsg prenmiMsg;
/* タスクリクエストキューの定義 */
OSMesgQueue audioRequestMQ;
OSMesg audioRequestBuf[NN_SC_MAX_MESGS];
OSMesgQueue graphicsRequestMQ;
OSMesg graphicsRequestBuf[NN_SC_MAX_MESGS];
/* メッセージキューの定義 */
OSMesgQueue retraceMQ;
OSMesg retraceMsgBuf[NN_SC_MAX_MESGS];
OSMesgQueue rspMQ;
OSMesg rspMsgBuf[NN_SC_MAX_MESGS];
OSMesgQueue rdpMQ;
OSMesg rdpMsgBuf[NN_SC_MAX_MESGS];
/* 次のリトレース信号を待つために使用 */
OSMesgQueue waitMQ;
OSMesg waitMsgBuf[NN_SC_MAX_MESGS];
/* スレッドの定義 */
OSThread schedulerThread; /* メインスレッド */
OSThread audioThread; /* オーディオ */
OSThread graphicsThread; /* グラフィックス */
/* クライアントリスト */
NNScClient *clientList;
/* 実行中のグラフィックスタスク */
NNScTask *curGraphicsTask;
NNScTask *curAudioTask;
NNScTask *graphicsTaskSuspended;
/* その他 */
u32 firstTime; /* 画面のブラックアウト制御用フラグ */
} NNSched;
/* パフォーマンスチェック用構造体 */
typedef struct {
u32 gtask_cnt; /*グラフィックタスクカウンタ */
u32 autask_cnt; /* オーディオタスクカウンタ */
u64 retrace_time; /* グラフィック作成時間 */
u64 gtask_stime[NN_SC_GTASK_NUM]; /* タスクの開始時間 */
u64 rdp_etime[NN_SC_GTASK_NUM]; /* RDPの終了時間 */
u64 rsp_etime[NN_SC_GTASK_NUM]; /* RSPの終了時間 */
u64 autask_stime[NN_SC_AUTASK_NUM]; /* オーディオタスク開始時間 */
u64 autask_etime[NN_SC_AUTASK_NUM]; /* オーディオタスク終了時間 */
u32 endflag;
} NNScPerf;
#ifdef NN_SC_PERF
extern NNScPerf* nnsc_perf_ptr;
#endif /* NN_SC_PERF */
/* 関数プロトタイプ宣言 */
extern void nnScCreateScheduler(NNSched *sc, u8 videoMode, u8
numFields);
extern void nnScAddClient(NNSched *sc, NNScClient *, OSMesgQueue *mq);
extern void nnScRemoveClient(NNSched *sc, NNScClient
*client);
extern void nnScEventHandler(NNSched *sc);
extern void nnScEventBroadcast(NNSched *sc, NNScMsg *msg);
extern void nnScExecuteAudio(NNSched *sc);
extern void nnScExecuteGraphics(NNSched *sc);
extern void nnScWaitTaskReady(NNSched *sc, NNScTask *task);
extern OSMesgQueue * nnScGetGfxMQ(NNSched *sc);
extern OSMesgQueue * nnScGetAudioMQ(NNSched *sc);
#endif