nnsched.h 4.59 KB
/*============================================================================

		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