/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### Shark 3D Engine (www.shark3d.com) // ########## # # # // ######## Copyright (c) 1996-2006 Spinor GmbH. // ######### # # # All rights reserved. // ## ########## // ## // /////////////////////////////////////////////////////////////////////////////// #include "drv_d3d9_progreport.h" #include "util/base/util_charutil.h" #include "util/stream/util_textstreampos.h" #include #include /////////////////////////////////////////////////////////////////////////////// s3d_CUtilStr s3d_CDrvD3d9ProgReport::GetDxBufferStr( LPD3DXBUFFER DxBuffer) { if(!DxBuffer) return ""; DWORD D3dBufSize = DxBuffer->GetBufferSize(); LPVOID D3dBufPointer = DxBuffer->GetBufferPointer(); char *Buf = reinterpret_cast(alloca(D3dBufSize + 1)); memset(Buf, 0, D3dBufSize + 1); memcpy(Buf, D3dBufPointer, D3dBufSize); return Buf; } bool s3d_CDrvD3d9ProgReport::ReportCompilingText( s3d_CDrvD3d9Env *DxEnv, s3d_CUtilStr_cr Info, s3d_CUtilStr_cr Text, HRESULT DxResult) { bool NoError = (DxResult == D3D_OK); bool Reported = false; s3d_CDrvD3d9Error e; s3d_CSysIntps IdxParse = 0; while(IdxParse < Text.GetLen()) { // Extract one line: s3d_CSysIntps IdxStart = IdxParse; IdxParse = Text.SearchChar('\n', IdxParse); if(IdxParse < 0) IdxParse = Text.GetLen(); s3d_CUtilStr TextLine = Text.GetSub(IdxStart, IdxParse + IdxStart); while(Text[IdxParse] && !s3d_CUtilCharUtil::IsPrintable(Text[IdxParse])) IdxParse++; if(TextLine.IsEmpty()) continue; // Search line number: int PosLine = 0; s3d_CUtilStrBuf PosName; int IdxDig = 0; while(IdxDig < TextLine.GetLen() && TextLine[IdxDig] != '(' && TextLine[IdxDig] != ':') { PosName.AppendChar(TextLine[IdxDig]); IdxDig++; } if(TextLine[IdxDig] == '(') { IdxDig++; while(IdxDig < TextLine.GetLen() && s3d_CUtilCharUtil::IsDigit(TextLine[IdxDig])) { PosLine = 10 * PosLine + (TextLine[IdxDig] - '0'); IdxDig++; } } // Convert file path: s3d_CUtilStr PosInfo = CalcInfoOfSrc(PosName, PosLine); if(PosInfo.IsEmpty()) PosInfo = Info; if(NoError) { e.Reset(); e.m_Code = "drv/imp/directx/d3d9/" "drv_d3d9_progreport.compilewarning"; e.m_StdTempl = "D3D shader code compilation warning, " "compiled by \"[1]\": [#2]"; e.AddInfo(PosInfo); e.AddInfo(Info); e.AddInfo(TextLine); s3d_UtilMsgReportNote(DxEnv->m_MsgHandler, e); e.Reset(); e.m_Code = "drv/imp/directx/d3d9/" "drv_d3d9_progreport.sic_compilewarning"; e.m_StdTempl = "Sic: D3D shader code compilation warning, " "at \"[1]\": [#2]"; e.AddInfo(Info); e.AddInfo(PosInfo); e.AddInfo(TextLine); s3d_UtilMsgReportNote(DxEnv->m_MsgHandler, e); } else { e.Reset(); e.m_Code = "drv/imp/directx/d3d9/" "drv_d3d9_progreport.compileerror"; e.m_StdTempl = "D3D shader code compilation error, " "compiled by \"[1]\": [#2]"; e.AddInfo(PosInfo); e.AddInfo(Info); e.AddInfo(TextLine); s3d_UtilMsgReportError(DxEnv->m_MsgHandler, e); e.Reset(); e.m_Code = "drv/imp/directx/d3d9/" "drv_d3d9_progreport.sic_compileerror"; e.m_StdTempl = "Sic: D3D shader code compilation error, " "at \"[1]\": [#2]"; e.AddInfo(Info); e.AddInfo(PosInfo); e.AddInfo(TextLine); s3d_UtilMsgReportError(DxEnv->m_MsgHandler, e); } Reported = true; } if(!NoError && !Reported) { s3d_CUtilStr DxResultStr = s3d_CUtilStrUtil::StrOfInt(DxResult); s3d_CDrvD3d9Error e; e.m_Code = s3d_CUtilStr( "drv/imp/directx/d3d9/drv_d3d9_progreport.dxerror.") + s3d_CUtilStrUtil::StrOfInt(DxResult); e.m_StdTempl = "D3D shader compiling error [1] \"[2]\"."; e.AddInfo(Info); e.AddInfo(s3d_CUtilStrUtil::StrOfInt( DxResult, 8, s3d_CUtilStrNum::Format_HexPadding)); e.AddInfo(DXGetErrorDescription9(DxResult)); s3d_UtilMsgReportError(DxEnv->m_MsgHandler, e); } return NoError; } bool s3d_CDrvD3d9ProgReport::ReportCompilingBuffer( s3d_CDrvD3d9Env *DxEnv, s3d_CUtilStr_cr Info, LPD3DXBUFFER DxBuffer, HRESULT DxResult) { s3d_CUtilStr Text = GetDxBufferStr(DxBuffer); return ReportCompilingText( DxEnv, Info, Text, DxResult); } /////////////////////////////////////////////////////////////////////////////// s3d_CDrvD3d9ProgReportMap::s3d_CDrvD3d9ProgReportMap( s3d_CUtilStr_cr MainStreamName, int MainLineOffs, const s3d_CUtilMap *StreamNameMap) { m_MainStreamName = MainStreamName; m_MainLineOffs = MainLineOffs; m_StreamNameMap = StreamNameMap; } s3d_CUtilStr s3d_CDrvD3d9ProgReportMap::CalcInfoOfSrc( s3d_CUtilStr_cr SrcName, int SrcLine) { // Convert file path: s3d_CUtilStr StreamName; if(m_StreamNameMap) StreamName = m_StreamNameMap->GetAtDefault(SrcName, ""); // Create error message: s3d_CUtilStrBuf Info; if(SrcLine > 0) { int EffLine = SrcLine; if(StreamName == m_MainStreamName) EffLine -= m_MainLineOffs; s3d_CUtilTextStreamPos StreamPos(StreamName, EffLine, 0); Info = StreamPos.FormatStd(); } else Info = StreamName; return Info; } /////////////////////////////////////////////////////////////////////////////// s3d_CDrvD3d9ProgReportRetrace::s3d_CDrvD3d9ProgReportRetrace( s3d_CLibStreamPreproDest *PreproDest) { m_PreproDest = PreproDest; } s3d_CUtilStr s3d_CDrvD3d9ProgReportRetrace::CalcInfoOfSrc( s3d_CUtilStr_cr SrcName, int SrcLine) { s3d_CUtilTextStreamPos EffPos = m_PreproDest->FindSrcPos(SrcLine); s3d_CUtilStr Info = EffPos.FormatStd(); return Info; } ///////////////////////////////////////////////////////////////////////////////