@@ -67,10 +67,11 @@ CGen8OpenCLProgramBase::CGen8OpenCLProgramBase(PLATFORM platform,
67
67
CGen8OpenCLProgramBase::~CGen8OpenCLProgramBase ()
68
68
{
69
69
delete m_ProgramScopePatchStream;
70
- for (auto data : m_KernelBinaries)
70
+ for (auto & data : m_KernelBinaries)
71
71
{
72
72
delete data.kernelBinary ;
73
73
delete data.kernelDebugData ;
74
+ delete data.dbgInfo .header ;
74
75
}
75
76
76
77
if (m_pSystemThreadKernelOutput)
@@ -106,7 +107,7 @@ RETVAL CGen8OpenCLProgramBase::GetProgramBinary(
106
107
107
108
programBinary.Write ( *m_ProgramScopePatchStream );
108
109
109
- for ( auto data : m_KernelBinaries )
110
+ for ( auto & data : m_KernelBinaries )
110
111
{
111
112
programBinary.Write ( *(data.kernelBinary ) );
112
113
}
@@ -137,6 +138,7 @@ CGen8OpenCLProgram::~CGen8OpenCLProgram()
137
138
138
139
RETVAL CGen8OpenCLProgramBase::GetProgramDebugData (Util::BinaryStream& programDebugData)
139
140
{
141
+ // Used by VC only
140
142
RETVAL retValue = g_cInitRetValue;
141
143
142
144
unsigned numDebugBinaries = 0 ;
@@ -148,25 +150,109 @@ RETVAL CGen8OpenCLProgramBase::GetProgramDebugData(Util::BinaryStream& programDe
148
150
}
149
151
}
150
152
151
- if ( numDebugBinaries )
153
+ if ( numDebugBinaries)
152
154
{
153
155
iOpenCL::SProgramDebugDataHeaderIGC header;
154
156
155
- memset ( &header, 0 , sizeof ( header ) );
157
+ memset (&header, 0 , sizeof (header) );
156
158
157
159
header.Magic = iOpenCL::MAGIC_CL;
158
160
header.Version = iOpenCL::CURRENT_ICBE_VERSION;
159
161
header.Device = m_Platform.eRenderCoreFamily ;
160
162
header.NumberOfKernels = numDebugBinaries;
161
163
header.SteppingId = m_Platform.usRevId ;
162
164
163
- programDebugData.Write ( header );
165
+ programDebugData.Write (header);
164
166
165
167
for (auto data : m_KernelBinaries)
166
168
{
167
169
if (data.kernelDebugData && data.kernelDebugData ->Size () > 0 )
168
170
{
169
- programDebugData.Write ( *(data.kernelDebugData ) );
171
+ programDebugData.Write (*(data.kernelDebugData ));
172
+ }
173
+ }
174
+ }
175
+
176
+ return retValue;
177
+ }
178
+
179
+ RETVAL CGen8OpenCLProgramBase::GetProgramDebugDataSize (size_t & totalDbgInfoBufferSize)
180
+ {
181
+ RETVAL retValue = g_cInitRetValue;
182
+
183
+ unsigned numDebugBinaries = 0 ;
184
+ for (auto & data : m_KernelBinaries)
185
+ {
186
+ if (data.dbgInfo .header &&
187
+ data.dbgInfo .header ->Size () > 0 &&
188
+ data.dbgInfo .dbgInfoBufferSize > 0 )
189
+ {
190
+ numDebugBinaries++;
191
+ }
192
+ }
193
+
194
+ totalDbgInfoBufferSize = 0 ;
195
+ if (numDebugBinaries)
196
+ {
197
+ totalDbgInfoBufferSize += sizeof (iOpenCL::SProgramDebugDataHeaderIGC);
198
+ for (auto & data : m_KernelBinaries)
199
+ {
200
+ totalDbgInfoBufferSize += (size_t )data.dbgInfo .header ->Size () +
201
+ (size_t )(data.dbgInfo .dbgInfoBufferSize +
202
+ data.dbgInfo .extraAlignBytes );
203
+ }
204
+ }
205
+
206
+ return retValue;
207
+ }
208
+
209
+ RETVAL CGen8OpenCLProgramBase::GetProgramDebugData (char * dstBuffer, size_t dstBufferSize)
210
+ {
211
+ RETVAL retValue = g_cInitRetValue;
212
+ size_t offset = 0 ;
213
+
214
+ auto Append = [&offset, dstBuffer, dstBufferSize](void * src, size_t srcSize)
215
+ {
216
+ memcpy_s (dstBuffer + offset, dstBufferSize - offset, src, srcSize);
217
+ offset += srcSize;
218
+ };
219
+
220
+ unsigned numDebugBinaries = 0 ;
221
+ for (auto & data : m_KernelBinaries)
222
+ {
223
+ if (data.dbgInfo .header &&
224
+ data.dbgInfo .header ->Size () > 0 &&
225
+ data.dbgInfo .dbgInfoBufferSize > 0 )
226
+ {
227
+ numDebugBinaries++;
228
+ }
229
+ }
230
+
231
+ if ( numDebugBinaries )
232
+ {
233
+ iOpenCL::SProgramDebugDataHeaderIGC header;
234
+
235
+ memset ( &header, 0 , sizeof ( header ) );
236
+
237
+ header.Magic = iOpenCL::MAGIC_CL;
238
+ header.Version = iOpenCL::CURRENT_ICBE_VERSION;
239
+ header.Device = m_Platform.eRenderCoreFamily ;
240
+ header.NumberOfKernels = numDebugBinaries;
241
+ header.SteppingId = m_Platform.usRevId ;
242
+
243
+ Append (&header, sizeof (header));
244
+
245
+ const uint64_t zero = 0 ;
246
+ for (auto & data : m_KernelBinaries)
247
+ {
248
+ if (data.dbgInfo .header &&
249
+ data.dbgInfo .header ->Size () > 0 &&
250
+ data.dbgInfo .dbgInfoBufferSize > 0 )
251
+ {
252
+ Append ((void *)data.dbgInfo .header ->GetLinearPointer (), (size_t )data.dbgInfo .header ->Size ());
253
+ Append (data.dbgInfo .dbgInfoBuffer , data.dbgInfo .dbgInfoBufferSize );
254
+ IGC_ASSERT (data.dbgInfo .extraAlignBytes <= sizeof (zero));
255
+ Append ((void *)&zero, data.dbgInfo .extraAlignBytes );
170
256
}
171
257
}
172
258
}
@@ -390,15 +476,15 @@ void CGen8OpenCLProgram::CreateKernelBinaries()
390
476
// Create the debug data binary streams
391
477
if (pOutput->m_debugDataVISASize > 0 || pOutput->m_debugDataGenISASize > 0 )
392
478
{
393
- data.kernelDebugData = new Util::BinaryStream ();
479
+ data.dbgInfo . header = new Util::BinaryStream ();
394
480
395
481
m_StateProcessor.CreateKernelDebugData (
396
482
(const char *)pOutput->m_debugDataVISA ,
397
483
pOutput->m_debugDataVISASize ,
398
484
(const char *)pOutput->m_debugDataGenISA ,
399
485
pOutput->m_debugDataGenISASize ,
400
486
kernel->m_kernelInfo .m_kernelName ,
401
- *( data.kernelDebugData ) );
487
+ data.dbgInfo );
402
488
}
403
489
404
490
m_KernelBinaries.push_back (data);
0 commit comments