Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
///////////////////////////////////////////////////////////////////////////////
// Copyright (C) Microsoft Corporation, 2000.
//
// pshdrval.hpp
//
// Direct3D Reference Device - PixelShader validation
//
///////////////////////////////////////////////////////////////////////////////
#ifndef __PSHDRVAL_HPP__
#define __PSHDRVAL_HPP__
#define PS_INST_TOKEN_RESERVED_MASK 0xbfff0000 // bits 16-23, 24-29, 31 must be 0
#define PS_DSTPARAM_TOKEN_RESERVED_MASK 0x4000e000 // bits 13-15, 30 must be 0
#define PS_SRCPARAM_TOKEN_RESERVED_MASK 0x4000e000 // bits 13-15, 30 must be 0
//-----------------------------------------------------------------------------
// CPSInstruction
//-----------------------------------------------------------------------------
class CPSInstruction : public CBaseInstruction { public: CPSInstruction(CPSInstruction* pPrevInst) : CBaseInstruction(pPrevInst) { m_bTexOp = FALSE; m_bTexMOp = FALSE; m_bTexOpThatReadsTexture = FALSE; m_bCoIssue = FALSE; m_CycleNum = (UINT)-1; };
void CalculateComponentReadMasks(DWORD dwVersion);
BOOL m_bTexOp; BOOL m_bTexMOp; BOOL m_bTexOpThatReadsTexture; BOOL m_bCoIssue; UINT m_CycleNum; // identical for co-issued instructions
};
//-----------------------------------------------------------------------------
// CBasePShaderValidator
//-----------------------------------------------------------------------------
class CBasePShaderValidator : public CBaseShaderValidator { protected: UINT m_CycleNum; UINT m_TexOpCount; UINT m_BlendOpCount; UINT m_TotalOpCount; // not necessarily the sum of TexOpCount and BlendOpCount....
CRegisterFile* m_pTempRegFile; CRegisterFile* m_pInputRegFile; CRegisterFile* m_pConstRegFile; CRegisterFile* m_pTextureRegFile;
CBaseInstruction* AllocateNewInstruction(CBaseInstruction*pPrevInst); BOOL DecodeNextInstruction(); virtual BOOL InitValidation() = 0; virtual BOOL ApplyPerInstructionRules() = 0; virtual void ApplyPostInstructionsRules() = 0; virtual void IsCurrInstTexOp() = 0; public: CBasePShaderValidator( const DWORD* pCode, const D3DCAPS8* pCaps, DWORD Flags ); ~CBasePShaderValidator(); };
//-----------------------------------------------------------------------------
// CPShaderValidator10
//-----------------------------------------------------------------------------
class CPShaderValidator10 : public CBasePShaderValidator { private: UINT m_TexOpCount; UINT m_BlendOpCount; UINT m_TotalOpCount; // not necessarily the sum of TexOpCount and BlendOpCount....
UINT m_TexMBaseDstReg;
BOOL ApplyPerInstructionRules(); void ApplyPostInstructionsRules(); void IsCurrInstTexOp(); BOOL InitValidation(); BOOL Rule_InstructionRecognized(); BOOL Rule_InstructionSupportedByVersion(); BOOL Rule_ValidParamCount(); BOOL Rule_ValidSrcParams(); BOOL Rule_NegateAfterSat(); BOOL Rule_SatBeforeBiasOrComplement(); BOOL Rule_MultipleDependentTextureReads(); BOOL Rule_SrcNoLongerAvailable(); BOOL Rule_SrcInitialized(); BOOL Rule_ValidDstParam(); BOOL Rule_ValidRegisterPortUsage(); BOOL Rule_TexRegsDeclaredInOrder(); BOOL Rule_TexOpAfterNonTexOp(); BOOL Rule_ValidTEXM3xSequence(); // Call per instruction AND after all instructions seen
BOOL Rule_ValidTEXM3xRegisterNumbers(); BOOL Rule_ValidCNDInstruction(); BOOL Rule_ValidCMPInstruction(); BOOL Rule_ValidLRPInstruction(); BOOL Rule_ValidDEFInstruction(); BOOL Rule_ValidDP3Instruction(); BOOL Rule_ValidDP4Instruction(); BOOL Rule_ValidInstructionPairing(); BOOL Rule_ValidInstructionCount(); // Call per instruction AND after all instructions seen
BOOL Rule_R0Written(); // Call after all instructions seen.
public: CPShaderValidator10( const DWORD* pCode, const D3DCAPS8* pCaps, DWORD Flags ); };
//-----------------------------------------------------------------------------
// CPShaderValidator14
//-----------------------------------------------------------------------------
class CPShaderValidator14 : public CBasePShaderValidator { private: UINT m_BlendOpCount; int m_Phase; // 1 == dependent read setup block, 2 == second pass
BOOL m_bPhaseMarkerInShader; // shader is preprocessed to set this bool
CPSInstruction* m_pPhaseMarkerInst; // only set at the moment marker is encountered in shader
DWORD m_TempRegsWithZappedAlpha; // bitmask of temp regs for which alpha was zapped
// (initialized->uninitialized) after the phase marker
DWORD m_TempRegsWithZappedBlue; // bitmask of temp regs for which blue was zapped
// (initialized->uninitialized) due to texcrd with .rg writemask
BOOL ApplyPerInstructionRules(); void ApplyPostInstructionsRules(); void IsCurrInstTexOp(); BOOL InitValidation();
BOOL Rule_InstructionRecognized(); BOOL Rule_InstructionSupportedByVersion(); BOOL Rule_ValidParamCount(); BOOL Rule_ValidSrcParams(); BOOL Rule_LimitedUseOfProjModifier(); BOOL Rule_MultipleDependentTextureReads(); BOOL Rule_SrcInitialized(); BOOL Rule_ValidMarker(); BOOL Rule_ValidDstParam(); BOOL Rule_ValidRegisterPortUsage(); BOOL Rule_ValidTexOpStageAndRegisterUsage(); BOOL Rule_TexOpAfterArithmeticOp(); BOOL Rule_ValidTEXDEPTHInstruction(); BOOL Rule_ValidTEXKILLInstruction(); BOOL Rule_ValidBEMInstruction(); BOOL Rule_ValidDEFInstruction(); BOOL Rule_ValidInstructionPairing(); BOOL Rule_ValidInstructionCount(); // Call per instruction AND after all instructions seen
BOOL Rule_R0Written(); // Call after all instructions seen.
public: CPShaderValidator14( const DWORD* pCode, const D3DCAPS8* pCaps, DWORD Flags ); };
#endif __PSHDRVAL_HPP__
|