/*
 * $Id: bg_task.h,v 1.1 2003/02/07 18:15:44 wheeler Exp $
 *
 * $Log: bg_task.h,v $
 * Revision 1.1  2003/02/07 18:15:44  wheeler
 * Fox's version of libultra and friends.
 *
 * Revision 1.20  1997/03/05  06:19:58  hayakawa
 * rdp_killを削除
 *
 * Revision 1.19  1997/02/07  10:55:18  hayakawa
 * BATCH
 *
 * Revision 1.18  1997/01/29  12:03:09  hayakawa
 * 細かい修正
 *
 * Revision 1.17  1996/11/21  06:15:01  hayakawa
 * インクルードするべきファイルをインクルードしていなかった
 *
 * Revision 1.16  1996/11/07  02:32:13  hayakawa
 * NOUSE_AUDIO条件コンパイル対応
 *
 * Revision 1.15  1996/10/29  12:43:18  hayakawa
 * スプライトマイクロコード対応
 *
 * Revision 1.14  1996/10/20  09:06:32  hayakawa
 * _LANGUAGE_C_PLUS_PLUS を __cplusplus に変更
 *
 */

#ifndef __BG_TASK_H_
#define __BG_TASK_H_

#include "bg_config.h"
#include "ultra64.h"

#ifdef __cplusplus
extern "C" {
#endif

/* ostask.t.type にローカルモードを追加 */
#define	M_GFXTASK	1	/* <mbi.h> */
#if !NOUSE_AUDIO
#define	M_AUDTASK	2	/* <mbi.h> */
#endif
#define	M_VIDTASK	3	/* <mbi.h> 用途不明 */
#define	M_CPUTASK	4	/* ローカルで追加 */
#define	M_SWAPTASK	5	/* ローカルで追加 */

typedef enum ucode_e {
    F3DEX_FIFO,			/* ポリゴン */
    F3DEXNON_FIFO,		/* ポリゴン（視点クリップ） */
    L3DEX_FIFO,			/* ライン */
    SPRITE2D_FIFO,		/* スプライト */
    UCODE_MAX
} ucode_t;
#define FAST3D_FIFO F3DEX_FIFO
#define LINE3D_FIFO L3DEX_FIFO



/*
 *	ＲＣＰ タスク
 */
typedef volatile struct {
    OSTask		ostask;
    OSMesgQueue		*osmsgQ;
    OSMesg		osmsg;
    int			status;
    u64 rdp_output_buff_size;
    u64 rdp_output_len;
    enum ucode_e ucode_type;
    void *cfb;			/* NULL!=タスク完了時に表示する */
    void (*func)(void *arg, void *bgptr);	/* NULL!=関数タスク */
    void *arg;
    OSTime		rsp_start_time;
    OSTime		rsp_end_time;
    OSTime		rsp_time;
    OSTime		rdp_start_time;
    OSTime		rdp_end_time;
    OSTime		rdp_time;
    OSTime		cpu_start_time;
    OSTime		cpu_end_time;
    OSTime		cpu_time;
    int rdpdone;		/* ＲＤＰ完/ＲＤＰ完を待つ必要がない */
} RCPTask;

/*
 *	ＲＣＰ ステータス
 */
#define		RCP_STAT_IDLE		0 /*  */
#define		RCP_STAT_RUNNING	1 /* 実行中 */
#define		RCP_STAT_SUSPEND	2 /* 割り込まれた！ */
#define		RCP_STAT_RSPDONE	3 /* SP終了 */
#define		RCP_STAT_RDPDONE	4 /* DP終了 */
#define		RCP_STAT_READY		5 /* 実行待ち */
#define		RCP_STAT_ALLOC		6 /* 確保 */
#define		RCP_STAT_FREE		7 /* 解放 */

void wait_task( void );
void task_start( RCPTask *rcptask, u64 *data_ptr, u32 data_size );
void task_init( RCPTask *rcptask, enum ucode_e type );

/*
 * rcp スレッドの作成
 */
void CreateRcpManager( void );
RCPTask *get_free_task(void);
void task_entry_cpu( RCPTask *cputask, void *func, void *arg, void *bgptr );
void task_entry_swapframe( RCPTask *swaptask, void *cfb );

#if !NOUSE_AUDIO
void audio_timer_enable( void );
void audio_timer_disable( void );
void audio_timer_wait( void );
#endif

void rcpwait(void);

#ifdef __cplusplus
}
#endif

#endif /* __BG_TASK_H_ */
