200 lines
6.9 KiB
C++
200 lines
6.9 KiB
C++
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// Copyright (C) Microsoft Corporation, 2000.
|
||
|
//
|
||
|
// rtdmon.cpp
|
||
|
//
|
||
|
// RunTime Debug Monitor
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
#include "pch.cpp"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "rtdmon.hpp"
|
||
|
|
||
|
#include "fe.h"
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
RTDebugMonitor::RTDebugMonitor( CD3DBase* pD3DBase, BOOL bDbgMonConnectionEnabled )
|
||
|
{
|
||
|
m_pD3DBase = pD3DBase;
|
||
|
m_bDbgMonConnectionEnabled = bDbgMonConnectionEnabled;
|
||
|
}
|
||
|
//-----------------------------------------------------------------------------
|
||
|
RTDebugMonitor::~RTDebugMonitor( void )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void
|
||
|
RTDebugMonitor::NextEvent( UINT32 EventType )
|
||
|
{
|
||
|
CheckLostMonitorConnection();
|
||
|
|
||
|
BOOL bBreakpoint = D3DDebugMonitor::IsEventBreak( EventType );
|
||
|
|
||
|
// do event-specific stuff (state update; actions; check for breakpoints)
|
||
|
UINT i;
|
||
|
switch ( EventType )
|
||
|
{
|
||
|
case D3DDM_EVENT_RSTOKEN:
|
||
|
switch( ((CD3DHal*)m_pD3DBase)->rstates[D3DRS_DEBUGMONITORTOKEN] )
|
||
|
{
|
||
|
case D3DDMT_ENABLE:
|
||
|
m_bDbgMonConnectionEnabled = TRUE;
|
||
|
break;
|
||
|
case D3DDMT_DISABLE:
|
||
|
if( m_pTgtCtx )
|
||
|
{
|
||
|
DetachMonitorConnection();
|
||
|
}
|
||
|
D3D_INFO(0, "D3DDebugTarget - debug monitor connection disabled by target");
|
||
|
m_bDbgMonConnectionEnabled = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case D3DDM_EVENT_BEGINSCENE:
|
||
|
// try to attach if not attached
|
||
|
if (!MonitorConnected()) AttachToMonitor(1);
|
||
|
break;
|
||
|
|
||
|
case D3DDM_EVENT_ENDSCENE:
|
||
|
m_pTgtCtx->SceneCount++;
|
||
|
break;
|
||
|
|
||
|
case D3DDM_EVENT_PRIMITIVE:
|
||
|
m_pTgtCtx->PrimitiveCount++;
|
||
|
if (m_pMonCtx && m_pMonCtx->PrimitiveCountBP)
|
||
|
{
|
||
|
if ( m_pTgtCtx->PrimitiveCount == m_pMonCtx->PrimitiveCountBP )
|
||
|
bBreakpoint = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// invoke base class to talk to monitor and issue commands
|
||
|
if (bBreakpoint)
|
||
|
{
|
||
|
m_pTgtCtx->EventStatus = EventType;
|
||
|
D3DDebugMonitor::MonitorBreakpoint();
|
||
|
m_pTgtCtx->EventStatus = 0x0;
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
RTDebugMonitor::ProcessMonitorCommand( void )
|
||
|
{
|
||
|
UINT32 Command = m_pMonCtx->Command;
|
||
|
UINT i;
|
||
|
|
||
|
// default case - no data return
|
||
|
m_pTgtCtx->CommandBufferSize = 0;
|
||
|
|
||
|
CD3DHal* pHal = (CD3DHal*)m_pD3DBase;
|
||
|
D3DFE_PVFUNCSI* pPVF = (D3DFE_PVFUNCSI*)pHal->m_pv->pGeometryFuncs;
|
||
|
CVertexVM* pVVM = &(pPVF->m_VertexVM);
|
||
|
|
||
|
switch ( Command & D3DDM_CMD_MASK )
|
||
|
{
|
||
|
|
||
|
case D3DDM_CMD_GETVERTEXSTATE:
|
||
|
{
|
||
|
D3DDMVertexState* pVSS = (D3DDMVertexState*)m_pCmdData;
|
||
|
pVVM->GetData( D3DSPR_INPUT, 0, D3DDM_MAX_VSINPUTREG, (void*)(pVSS->InputRegs) );
|
||
|
m_pTgtCtx->CommandBufferSize = sizeof(D3DDMVertexState);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case D3DDM_CMD_GETVERTEXSHADERSTATE:
|
||
|
{
|
||
|
D3DDMVertexShaderState* pVSS = (D3DDMVertexShaderState*)m_pCmdData;
|
||
|
if (!m_pD3DBase->m_dwCurrentShaderHandle) break;
|
||
|
|
||
|
pVSS->CurrentInst = pVVM->GetCurInstIndex();
|
||
|
pVVM->GetData( D3DSPR_TEMP, 0, D3DDM_MAX_VSTEMPREG, (void*)(pVSS->TempRegs) );
|
||
|
pVVM->GetData( D3DSPR_RASTOUT, 0, D3DDM_MAX_VSRASTOUTREG, (void*)(pVSS->RastOutRegs) );
|
||
|
pVVM->GetData( D3DSPR_ATTROUT, 0, D3DDM_MAX_VSATTROUTREG, (void*)(pVSS->AttrOutRegs) );
|
||
|
pVVM->GetData( D3DSPR_TEXCRDOUT, 0, D3DDM_MAX_VSTEXCRDOUTREG, (void*)(pVSS->TexCrdOutRegs) );
|
||
|
pVVM->GetData( D3DSPR_ADDR, 0, 1, (void*)(pVSS->AddressReg) );
|
||
|
m_pTgtCtx->CommandBufferSize = sizeof(D3DDMVertexShaderState);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case D3DDM_CMD_GETVERTEXSHADERCONST:
|
||
|
{
|
||
|
D3DDMVertexShaderConst* pVSC = (D3DDMVertexShaderConst*)m_pCmdData;
|
||
|
pVVM->GetData( D3DSPR_CONST, 0, 96, (void*)(pVSC->ConstRegs) );
|
||
|
m_pTgtCtx->CommandBufferSize = 96*4*sizeof(FLOAT);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case D3DDM_CMD_GETVERTEXSHADER:
|
||
|
{
|
||
|
DWORD Handle = *(DWORD*)m_pCmdData;
|
||
|
if (D3DVSD_ISLEGACY(Handle)) break;
|
||
|
CVShader* pShader = (CVShader*)(pHal->m_pVShaderArray->GetObject(Handle));
|
||
|
if ( NULL == pShader ) break;
|
||
|
D3DDMVertexShader* pVS = (D3DDMVertexShader*)m_pCmdData;
|
||
|
DXGASSERT( pShader->m_OrgDeclSize <= (D3DDM_MAX_VSDECL*4) );
|
||
|
memcpy( pVS->Decl, pShader->m_pOrgDeclaration, pShader->m_OrgDeclSize );
|
||
|
char* pUserData = (char*)(pVS+1);
|
||
|
m_pTgtCtx->CommandBufferSize = sizeof(D3DDMVertexShader);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case D3DDM_CMD_GETVERTEXSHADERINST:
|
||
|
{
|
||
|
DWORD Handle = *(DWORD*)m_pCmdData;
|
||
|
if (D3DVSD_ISLEGACY(Handle)) break;
|
||
|
UINT Inst = (Command & 0xffff);
|
||
|
CVShader* pShader = (CVShader*)(pHal->m_pVShaderArray->GetObject(Handle));
|
||
|
if ( NULL == pShader ) break;
|
||
|
CVShaderCode* pSC = pShader->m_pCode;
|
||
|
if (pSC && (Inst < pSC->InstCount()))
|
||
|
{
|
||
|
D3DDMVertexShaderInst* pVSI = (D3DDMVertexShaderInst*)m_pCmdData;
|
||
|
memcpy( pVSI->Inst, pSC->InstTokens(Inst), D3DDM_MAX_VSINSTDWORD*4 );
|
||
|
memcpy( pVSI->InstString, pSC->InstDisasm(Inst), D3DDM_MAX_VSINSTSTRING );
|
||
|
m_pTgtCtx->CommandBufferSize = sizeof(D3DDMVertexShaderInst);
|
||
|
if ( pSC->InstCommentSize(Inst) )
|
||
|
{
|
||
|
memcpy( (void*)(pVSI+1), pSC->InstComment(Inst), 4*pSC->InstCommentSize(Inst) );
|
||
|
m_pTgtCtx->CommandBufferSize += 4*pSC->InstCommentSize(Inst);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case D3DDM_CMD_GETDEVICESTATE:
|
||
|
{
|
||
|
D3DDMDeviceState* pDS = (D3DDMDeviceState*)m_pCmdData;
|
||
|
memcpy( pDS->RenderState, pHal->rstates, 4*D3DHAL_MAX_RSTATES );
|
||
|
for (i=0; i<D3DHAL_TSS_MAXSTAGES; i++)
|
||
|
{
|
||
|
memcpy( pDS->TextureStageState[i],
|
||
|
pHal->tsstates[i], 4*D3DHAL_TSS_STATESPERSTAGE );
|
||
|
}
|
||
|
pDS->VertexShaderHandle = m_pD3DBase->m_dwCurrentShaderHandle;
|
||
|
pDS->PixelShaderHandle = m_pD3DBase->m_dwCurrentPixelShaderHandle;
|
||
|
|
||
|
pDS->MaxVShaderHandle = (UINT)(pHal->m_pVShaderArray->GetSize());
|
||
|
while ( ( pDS->MaxVShaderHandle > 0 ) &&
|
||
|
( NULL == pHal->m_pVShaderArray->GetObject(pDS->MaxVShaderHandle) ) )
|
||
|
{
|
||
|
pDS->MaxVShaderHandle--;
|
||
|
}
|
||
|
pDS->MaxPShaderHandle = 0;
|
||
|
m_pTgtCtx->CommandBufferSize = sizeof(D3DDMDeviceState);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// end
|
||
|
|