source: GTP/trunk/App/Demos/Geom/Shark3D/src/drv_d3d9_progreport.cpp @ 2236

Revision 2236, 6.8 KB checked in by gumbau, 17 years ago (diff)
Line 
1///////////////////////////////////////////////////////////////////////////////
2//
3//      ##  ######
4//       ######  ###
5//  ## ###############        Shark 3D Engine (www.shark3d.com)
6//   ########## # # #
7//    ########                Copyright (c) 1996-2006 Spinor GmbH.
8//   ######### # # #          All rights reserved.
9//  ##   ##########
10//      ##
11//
12///////////////////////////////////////////////////////////////////////////////
13
14#include "drv_d3d9_progreport.h"
15#include "util/base/util_charutil.h"
16#include "util/stream/util_textstreampos.h"
17#include <dxerr9.h>
18#include <malloc.h>
19
20///////////////////////////////////////////////////////////////////////////////
21
22s3d_CUtilStr s3d_CDrvD3d9ProgReport::GetDxBufferStr(
23        LPD3DXBUFFER DxBuffer)
24{
25    if(!DxBuffer)
26        return "";
27    DWORD D3dBufSize = DxBuffer->GetBufferSize();
28    LPVOID D3dBufPointer = DxBuffer->GetBufferPointer();
29
30    char *Buf = reinterpret_cast<char*>(alloca(D3dBufSize + 1));
31    memset(Buf, 0, D3dBufSize + 1);
32    memcpy(Buf, D3dBufPointer, D3dBufSize);
33    return Buf;
34}
35
36bool s3d_CDrvD3d9ProgReport::ReportCompilingText(
37        s3d_CDrvD3d9Env *DxEnv, s3d_CUtilStr_cr Info,
38        s3d_CUtilStr_cr Text, HRESULT DxResult)
39{
40    bool NoError = (DxResult == D3D_OK);
41    bool Reported = false;
42
43    s3d_CDrvD3d9Error e;
44
45    s3d_CSysIntps IdxParse = 0;
46    while(IdxParse < Text.GetLen())
47    {
48        // Extract one line:
49        s3d_CSysIntps IdxStart = IdxParse;
50        IdxParse = Text.SearchChar('\n', IdxParse);
51        if(IdxParse < 0)
52            IdxParse = Text.GetLen();
53        s3d_CUtilStr TextLine = Text.GetSub(IdxStart, IdxParse + IdxStart);
54        while(Text[IdxParse]
55                && !s3d_CUtilCharUtil::IsPrintable(Text[IdxParse]))
56            IdxParse++;
57        if(TextLine.IsEmpty())
58            continue;
59
60        // Search line number:
61        int PosLine = 0;
62        s3d_CUtilStrBuf PosName;
63        int IdxDig = 0;
64        while(IdxDig < TextLine.GetLen() && TextLine[IdxDig] != '('
65                                        && TextLine[IdxDig] != ':')
66        {
67            PosName.AppendChar(TextLine[IdxDig]);
68            IdxDig++;
69        }
70        if(TextLine[IdxDig] == '(')
71        {
72            IdxDig++;
73            while(IdxDig < TextLine.GetLen()
74                    && s3d_CUtilCharUtil::IsDigit(TextLine[IdxDig]))
75            {
76                PosLine = 10 * PosLine + (TextLine[IdxDig] - '0');
77                IdxDig++;
78            }
79        }
80
81        // Convert file path:
82        s3d_CUtilStr PosInfo = CalcInfoOfSrc(PosName, PosLine);
83        if(PosInfo.IsEmpty())
84            PosInfo = Info;
85
86        if(NoError)
87        {
88            e.Reset();
89            e.m_Code = "drv/imp/directx/d3d9/"
90                    "drv_d3d9_progreport.compilewarning";
91            e.m_StdTempl = "D3D shader code compilation warning, "
92                    "compiled by \"[1]\": [#2]";
93            e.AddInfo(PosInfo);
94            e.AddInfo(Info);
95            e.AddInfo(TextLine);
96            s3d_UtilMsgReportNote(DxEnv->m_MsgHandler, e);
97
98            e.Reset();
99            e.m_Code = "drv/imp/directx/d3d9/"
100                    "drv_d3d9_progreport.sic_compilewarning";
101            e.m_StdTempl = "Sic: D3D shader code compilation warning, "
102                    "at \"[1]\": [#2]";
103            e.AddInfo(Info);
104            e.AddInfo(PosInfo);
105            e.AddInfo(TextLine);
106            s3d_UtilMsgReportNote(DxEnv->m_MsgHandler, e);
107        }
108        else
109        {
110            e.Reset();
111            e.m_Code = "drv/imp/directx/d3d9/"
112                    "drv_d3d9_progreport.compileerror";
113            e.m_StdTempl = "D3D shader code compilation error, "
114                    "compiled by \"[1]\": [#2]";
115            e.AddInfo(PosInfo);
116            e.AddInfo(Info);
117            e.AddInfo(TextLine);
118            s3d_UtilMsgReportError(DxEnv->m_MsgHandler, e);
119
120            e.Reset();
121            e.m_Code = "drv/imp/directx/d3d9/"
122                    "drv_d3d9_progreport.sic_compileerror";
123            e.m_StdTempl = "Sic: D3D shader code compilation error, "
124                    "at \"[1]\": [#2]";
125            e.AddInfo(Info);
126            e.AddInfo(PosInfo);
127            e.AddInfo(TextLine);
128            s3d_UtilMsgReportError(DxEnv->m_MsgHandler, e);
129        }
130        Reported = true;
131    }
132
133    if(!NoError && !Reported)
134    {
135        s3d_CUtilStr DxResultStr = s3d_CUtilStrUtil::StrOfInt(DxResult);
136        s3d_CDrvD3d9Error e;
137        e.m_Code = s3d_CUtilStr(
138                "drv/imp/directx/d3d9/drv_d3d9_progreport.dxerror.")
139                + s3d_CUtilStrUtil::StrOfInt(DxResult);
140        e.m_StdTempl = "D3D shader compiling error [1] \"[2]\".";
141        e.AddInfo(Info);
142        e.AddInfo(s3d_CUtilStrUtil::StrOfInt(
143                DxResult, 8, s3d_CUtilStrNum::Format_HexPadding));
144        e.AddInfo(DXGetErrorDescription9(DxResult));
145        s3d_UtilMsgReportError(DxEnv->m_MsgHandler, e);
146    }
147
148    return NoError;
149}
150
151bool s3d_CDrvD3d9ProgReport::ReportCompilingBuffer(
152        s3d_CDrvD3d9Env *DxEnv, s3d_CUtilStr_cr Info,
153        LPD3DXBUFFER DxBuffer, HRESULT DxResult)
154{
155    s3d_CUtilStr Text = GetDxBufferStr(DxBuffer);
156    return ReportCompilingText(
157            DxEnv, Info, Text, DxResult);
158}
159
160///////////////////////////////////////////////////////////////////////////////
161
162s3d_CDrvD3d9ProgReportMap::s3d_CDrvD3d9ProgReportMap(
163        s3d_CUtilStr_cr MainStreamName, int MainLineOffs,
164        const s3d_CUtilMap<s3d_CUtilStr, s3d_CUtilStr> *StreamNameMap)
165{
166    m_MainStreamName = MainStreamName;
167    m_MainLineOffs = MainLineOffs;
168    m_StreamNameMap = StreamNameMap;
169}
170
171s3d_CUtilStr s3d_CDrvD3d9ProgReportMap::CalcInfoOfSrc(
172        s3d_CUtilStr_cr SrcName, int SrcLine)
173{
174    // Convert file path:
175    s3d_CUtilStr StreamName;
176    if(m_StreamNameMap)
177        StreamName = m_StreamNameMap->GetAtDefault(SrcName, "");
178
179    // Create error message:
180    s3d_CUtilStrBuf Info;
181    if(SrcLine > 0)
182    {
183        int EffLine = SrcLine;
184        if(StreamName == m_MainStreamName)
185            EffLine -= m_MainLineOffs;
186        s3d_CUtilTextStreamPos StreamPos(StreamName, EffLine, 0);
187        Info = StreamPos.FormatStd();
188    }
189    else
190        Info = StreamName;
191
192    return Info;
193}
194
195///////////////////////////////////////////////////////////////////////////////
196
197s3d_CDrvD3d9ProgReportRetrace::s3d_CDrvD3d9ProgReportRetrace(
198        s3d_CLibStreamPreproDest *PreproDest)
199{
200    m_PreproDest = PreproDest;
201}
202
203s3d_CUtilStr s3d_CDrvD3d9ProgReportRetrace::CalcInfoOfSrc(
204        s3d_CUtilStr_cr SrcName, int SrcLine)
205{
206    s3d_CUtilTextStreamPos EffPos = m_PreproDest->FindSrcPos(SrcLine);
207    s3d_CUtilStr Info = EffPos.FormatStd();
208    return Info;
209}
210
211///////////////////////////////////////////////////////////////////////////////
212
Note: See TracBrowser for help on using the repository browser.