|
|
// $Header: G:/SwDev/WDM/Video/bt848/rcs/Riscprog.h 1.9 1998/04/29 22:43:39 tomz Exp $
#ifndef __RISCPROG_H
#define __RISCPROG_H
#ifndef __MYTYPES_H
#include "mytypes.h"
#endif
#ifndef __VIDDEFS_H
#include "viddefs.h"
#endif
#ifndef __COLSPACE_H
#include "colspace.h"
#endif
#ifndef __PSPAGEBL_H
#include "pspagebl.h"
#endif
#ifndef __COMMAND_H
#include "command.h"
#endif
const Programs = 24;
inline LONGLONG operator-( const LARGE_INTEGER &first, const LARGE_INTEGER &second ) { return first.QuadPart - second.QuadPart; }
inline bool operator>( const LARGE_INTEGER &first, const LARGE_INTEGER &second ) { return bool( first.QuadPart > second.QuadPart ); }
inline bool operator>=( const LARGE_INTEGER &first, const LARGE_INTEGER &second ) { return bool( first.QuadPart >= second.QuadPart ); }
/* Class: RISCProgram
* Purpose: Facilitates creation and maintenance of a RISC programs * Attributes: ImageSize_: SIZE - structure containing dimentions of the image * dwBufPitch_: DWORD - buffer pitch * Field_: VideoField - which field the program is for * Interrupting_: bool * ProgramSpace_: PsPageBlock * - pointer to the class that manages the memory * occupied by a program ( allocates, deallocates, obtains information ) * BufFormat_: ColorSpace - format of the data in the buffer * Operations: * void ChangeAddress( DWORD dwNewAddr ) * void SetClipping( LPRECT pRect ) * void Create( bool NeedInterrupt ) * void SetChain( DWORD dwProgAddr ) * DWORD GetProgAddress() * bool IsInterrupting() */ class RISCProgram { public: PDWORD pChainAddress_;
private: MSize ImageSize_; DWORD dwBufPitch_;
bool Interrupting_; bool Counting_; PsPageBlock *ProgramSpace_; ColorSpace BufFormat_; RISCProgram *pChild_; RISCProgram *pParent_; PDWORD pIRQAddress_; DWORD dwBufAddr_; DWORD dwLinBufAddr_; bool Skipped_; bool GenerateResync_;
BOOL bAlreadyDumped_; PVOID tag_; LARGE_INTEGER ExtraTag_; LARGE_INTEGER ExpectedExecutionTime_;
DWORD dwPlanarAdjust_; DWORD dwSize_;
protected: ErrorCode AllocateStorage( bool extra = false, int cnt = 1 ); PDWORD CreatePrologEpilog( PDWORD pProgLoc, SyncCode SyncBits, Command &CurCommand, bool Resync = false ); ErrorCode GetDataBufPhys( DataBuf &buf );
void PutInChain();
public:
PHW_STREAM_REQUEST_BLOCK pSrb_;
DWORD GetDataBuffer( ); void SetDataBuffer( DWORD addr );
void ChangeAddress( DataBuf &buf ); ErrorCode Create( SyncCode SyncBits, bool resync = false ); ErrorCode Create( bool NeedInterrupt, DataBuf buf, DWORD dwPlanAdjust, bool resync = false, bool Loop = true );
void MakeFault() { *((PDWORD)GetProgAddress()) = (DWORD)-1; } DWORD GetProgAddress(); void SetJump( PDWORD JumpAddr );
// chaining/unchaining group
RISCProgram *GetParent() { return pParent_; } RISCProgram *GetChild() { return pChild_; } void SetParent( RISCProgram *p ) { pParent_ = p; } void SetChild ( RISCProgram *p ) { pChild_ = p; } void CreateLoop( bool ); void SetChain( RISCProgram *ChainTo ); void Skip(); void SetSkipped( bool sk = true ); void SetToCount(); void ResetStatus(); void SetStatus( int val ); void SetResync( bool val );
bool IsSkipped(); bool IsInterrupting();
void SetTag( PVOID value ); PVOID GetTag();
void SetTagEx( LARGE_INTEGER val ); LARGE_INTEGER GetTagEx();
LARGE_INTEGER GetExecTime() { return ExpectedExecutionTime_; }
// static RISCProgram CreateStarter();
DWORD GetPhysProgAddr(); void Dump();
RISCProgram( MSize &size, DWORD pitch, ColFmt aColor );
RISCProgram();
~RISCProgram();
friend class RISCEng; };
/* Method: RISCProgram::GetProgramAddress
* Purpose: Obtains address of this program * Input: None * Output: DWORD: program's address */ inline DWORD RISCProgram::GetProgAddress() { return ProgramSpace_->getLinearBase(); }
inline void RISCProgram::SetToCount() { Command IRQCommand; IRQCommand.SetToCount( pIRQAddress_ ); Counting_ = true; }
inline void RISCProgram::ResetStatus() { Command IRQCommand; IRQCommand.ResetStatus( pIRQAddress_, 0xF ); Counting_ = false; }
inline void RISCProgram::SetStatus( int val ) { Command IRQCommand; IRQCommand.SetStatus( pIRQAddress_, val ); }
inline void RISCProgram::SetResync( bool val ) { Command SyncCommand; SyncCommand.SetResync( (PVOID)GetProgAddress(), val ); }
inline void RISCProgram::SetSkipped( bool sk ) { Skipped_ = sk; }
inline bool RISCProgram::IsSkipped() { return Skipped_; }
inline bool RISCProgram::IsInterrupting() { return Interrupting_; }
inline void RISCProgram::SetTag( PVOID value ) { tag_ = value; }
inline PVOID RISCProgram::GetTag() { return tag_; }
inline void RISCProgram::SetTagEx( LARGE_INTEGER val ) { ExtraTag_ = val; }
inline LARGE_INTEGER RISCProgram::GetTagEx() { return ExtraTag_; }
/*
inline RISCProgram RISCProgram::CreateStarter() { return RISCProgram(); } */ inline DWORD RISCProgram::GetPhysProgAddr() { return ProgramSpace_->GetPhysAddr(); }
inline RISCProgram::RISCProgram( MSize &size, DWORD pitch, ColFmt aColor ) : ImageSize_( size ), dwBufPitch_( pitch ), Interrupting_( false ), BufFormat_( aColor ), ProgramSpace_( NULL ), tag_( NULL ), dwPlanarAdjust_( 0 ), pChild_( NULL ), pParent_( NULL ), pChainAddress_( NULL ), GenerateResync_( false ), Skipped_( false ), pIRQAddress_( NULL ), dwBufAddr_( 0 ), Counting_( false ) { ExtraTag_.QuadPart = 0; ExpectedExecutionTime_.QuadPart = 0; bAlreadyDumped_ = FALSE; dwSize_ = 0xffffffff; pSrb_ = 0; }
inline RISCProgram::RISCProgram() : ImageSize_( 10, 10 ), dwBufPitch_( 0 ), Interrupting_( false ), Counting_( false ), BufFormat_( CF_RGB32 ), ProgramSpace_( NULL ), tag_( NULL ), GenerateResync_( false ), pChild_( NULL ), pParent_( NULL ), pChainAddress_( NULL ), Skipped_( false ), pIRQAddress_( NULL ), dwBufAddr_( 0 ), dwLinBufAddr_( 0 ) { ExtraTag_.QuadPart = 0; ExpectedExecutionTime_.QuadPart = 0; bAlreadyDumped_ = FALSE; dwSize_ = 0xffffffff; pSrb_ = 0; } #endif
|