1 /*========================== begin_copyright_notice ============================
2
3 Copyright (C) 2017-2021 Intel Corporation
4
5 SPDX-License-Identifier: MIT
6
7 ============================= end_copyright_notice ===========================*/
8
9 #pragma once
10
11 #include "ShaderTypesEnum.h"
12 #include "ShaderTypesConst.h"
13 #include "SurfaceFormats.h"
14 #include "usc_config.h"
15
16 /*****************************************************************************
17 MACRO: BITCOUNT
18 // returns count of bits required to store set of (v) values in range <0;v-1>
19 *****************************************************************************/
20 #ifndef BITCOUNT
21 #define BITCOUNT(v) (((v)-1U)<65536U?((v)-1U)<256U?((v)-1U)<16U?((v)-1U)<4U?((v)-1U)<2U?1:2:((v)-1U)<\
22 8U?3:4:((v)-1U)<64U?((v)-1U)<32U?5:6:((v)-1U)<128U?7:8:((v)-1U)<4096U?((v)-1U)<1024U?((v)-1U)<512U?9:10\
23 :((v)-1U)<2048U?11:12:((v)-1U)<(1U<<14U)?((v)-1U)<8192U?13:14:((v)-1U)<32768U?15:16:((v)-1U)<(1U<<24U)\
24 ?((v)-1U)<(1U<<20U)?((v)-1U)<262144U?((v)-1U)<131072U?17:18:((v)-1U)<524288U?19:20:((v)-1U)<(1U<<22U)?\
25 ((v)-1U)<(1U<<21U)?21:22:((v)-1U)<(1U<<23U)?23:24:((v)-1U)<(1U<<28U)?((v)-1U)<(1U<<26U)?((v)-1U)<(1U<<25U\
26 )?25:26:((v)-1U)<(1U<<27U)?27:28:((v)-1U)<(1U<<30U)?((v)-1U)<(1U<<29U)?29:30:((v)-1U)<(1U<<31U)?31:32)
27 #endif
28
29 /*****************************************************************************\
30 compile-time USC_API_C_ASSERT
31 \*****************************************************************************/
32 #ifndef USC_API_C_ASSERT
33 #define USC_API_C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
34 #endif
35
36 // verify that unsigned int is 32-bit
37 USC_API_C_ASSERT( sizeof( unsigned int )==4 );
38
39 namespace USC
40 {
41
42 /*****************************************************************************\
43 ENUM: Needed for Shader serialization and DeepCopy. Indicates which operation
44 should be performed.
45 \*****************************************************************************/
46 enum IL_OP_TYPE
47 {
48 IL_OP_DEEP_COPY,
49 IL_OP_READ_FROM_STREAM,
50 IL_OP_WRITE_TO_STREAM,
51 IL_OP_COUNT_WRITE_BYTES
52 };
53
54 /*****************************************************************************\
55 ENUM: Needed for Shader serialization and DeepCopy of non trivial declarations.
56 Indicates which declaration type should be processed.
57 \*****************************************************************************/
58 enum IL_DECL_TYPE
59 {
60 IL_DECL_FUNCTION_TABLE,
61 IL_DECL_INTERFACE
62 };
63
64 /*****************************************************************************\
65 ENUM: SHADER_OPERAND_PRECISION
66 \*****************************************************************************/
67 enum SHADER_OPERAND_PRECISION
68 {
69 SHADER_OPERAND_PRECISION_DEFAULT = 0,
70 SHADER_OPERAND_PRECISION_16 = 1, // for floats and signed int
71 SHADER_OPERAND_PRECISION_8 = 2, // for signed int
72
73 NUM_SHADER_OPERAND_PRECISIONS
74 };
75
76 /*****************************************************************************\
77 operator: < for SHADER_OPERAND_PRECISION
78 \*****************************************************************************/
isOfLesserPrec(SHADER_OPERAND_PRECISION precLesser,SHADER_OPERAND_PRECISION precGreater)79 inline bool isOfLesserPrec( SHADER_OPERAND_PRECISION precLesser, SHADER_OPERAND_PRECISION precGreater )
80 {
81 // intentionally reversed
82 return static_cast<unsigned int>( precLesser ) > static_cast<unsigned int>( precGreater );
83 }
84
85 /*****************************************************************************\
86
87 Function:
88 MinPrec
89
90 Description:
91 Returns lesser of two given operand precisions. Logically lesser precision
92 (e.g. 8 bit is less than 16 bit, which is less than default 32 bit) means
93 greater value of enum SHADER_OPERAND_PRECISION.
94
95 Input:
96 SHADER_OPERAND_PRECISION lhsPrec - First precision.
97 SHADER_OPERAND_PRECISION rhsPrec - Second precision.
98
99 Output:
100 SHADER_OPERAND_PRECISION - Result precision.
101
102 \*****************************************************************************/
MinPrec(SHADER_OPERAND_PRECISION lhsPrec,SHADER_OPERAND_PRECISION rhsPrec)103 inline SHADER_OPERAND_PRECISION MinPrec(
104 SHADER_OPERAND_PRECISION lhsPrec,
105 SHADER_OPERAND_PRECISION rhsPrec )
106 {
107 return isOfLesserPrec( lhsPrec, rhsPrec ) ? lhsPrec : rhsPrec;
108 }
109
110 /*****************************************************************************\
111
112 Function:
113 MaxPrec
114
115 Description:
116 Returns greater of two given operand precisions. Logically greater precision
117 (e.g. default 32 bit is greater than 16 bit, which is greater than 8 bit)
118 means lesser value of enum SHADER_OPERAND_PRECISION.
119
120 Input:
121 SHADER_OPERAND_PRECISION lhsPrec - First precision.
122 SHADER_OPERAND_PRECISION rhsPrec - Second precision.
123
124 Output:
125 SHADER_OPERAND_PRECISION - Result precision.
126
127 \*****************************************************************************/
MaxPrec(SHADER_OPERAND_PRECISION lhsPrec,SHADER_OPERAND_PRECISION rhsPrec)128 inline SHADER_OPERAND_PRECISION MaxPrec(
129 SHADER_OPERAND_PRECISION lhsPrec,
130 SHADER_OPERAND_PRECISION rhsPrec )
131 {
132 return isOfLesserPrec( lhsPrec, rhsPrec ) ? rhsPrec : lhsPrec;
133 }
134
135 /*****************************************************************************\
136 STRUCT: SShaderResourceDeclType
137 \*****************************************************************************/
138 struct SShaderSamplerDeclType
139 {
140 unsigned int SamplerType : BITCOUNT( IGC::NUM_SHADER_SAMPLER_TYPES );
141 unsigned int LBound; // IGC::SHADER_VERSION_4_0
142 unsigned int UBound; // IGC::SHADER_VERSION_4_0
143 unsigned int Space; // IGC::SHADER_VERSION_4_0
144 };
145
146 /*****************************************************************************\
147 STRUCT: SShaderResourceDeclType
148 \*****************************************************************************/
149 struct SShaderResourceDeclType
150 {
151 unsigned int ResourceType : BITCOUNT( IGC::NUM_SHADER_RESOURCE_TYPES );
152 unsigned int SurfaceFormat : BITCOUNT( IGC::NUM_SURFACE_FORMATS );
153 unsigned int UAVAccessMode : BITCOUNT( IGC::NUM_SHADER_UAV_ACCESS_MODES );
154 unsigned int ReturnType : BITCOUNT( IGC::NUM_SHADER_RESOURCE_RETURN_TYPES );
155 unsigned int AccessCoherency : 1;
156 unsigned int RasterizerOrdered : 1;
157 unsigned int IsVariable : 1;
158 unsigned int Stride;
159 unsigned int ByteOrStructCount;
160 unsigned int Offset;
161 unsigned int Alignment;
162 unsigned int LBound; // IGC::SHADER_VERSION_4_0
163 unsigned int UBound; // IGC::SHADER_VERSION_4_0
164 unsigned int Space; // IGC::SHADER_VERSION_4_0
165 };
166
167 /*****************************************************************************\
168 STRUCT: SShaderConstantBufferDeclType
169 \*****************************************************************************/
170 struct SShaderConstantBufferDeclType
171 {
172 unsigned int LBound; // IGC::SHADER_VERSION_4_0
173 unsigned int UBound; // IGC::SHADER_VERSION_4_0
174 unsigned int Space; // IGC::SHADER_VERSION_4_0
175 unsigned int Size; // IGC::SHADER_VERSION_4_0. Count of 16-byte vectors. 0 if not known.
176 };
177
178 /*****************************************************************************\
179 STRUCT: SShaderInputDeclType
180 \*****************************************************************************/
181 struct SShaderInputDeclType
182 {
183 unsigned int Mask : IGC::NUM_SHADER_CHANNELS;
184 unsigned int InterpolationMode : BITCOUNT( IGC::NUM_SHADER_INTERPOLATION_MODES );
185 unsigned int IsIndexed : 1;
186
187 union
188 {
189 struct
190 {
191 unsigned int X : 1;
192 unsigned int Y : 1;
193 unsigned int Z : 1;
194 unsigned int W : 1;
195 } Channel;
196
197 unsigned int Value : IGC::NUM_SHADER_CHANNELS;
198 } PrimIDMask;
199
200 unsigned char Usage[IGC::NUM_SHADER_CHANNELS];
201 unsigned char UsageIndex[IGC::NUM_SHADER_CHANNELS];
202
203 bool HasUsesFullPrecision[IGC::NUM_SHADER_CHANNELS];
204 bool HasUsesLowPrecision[IGC::NUM_SHADER_CHANNELS];
205 };
206
207 /*****************************************************************************\
208 STRUCT: SShaderOutputDeclType
209 \*****************************************************************************/
210 struct SShaderOutputDeclType
211 {
212 unsigned int Mask : IGC::NUM_SHADER_CHANNELS;
213 unsigned int IsIndexed : 1;
214 unsigned int IsInvariant : 1;
215
216 unsigned char Usage[IGC::NUM_SHADER_CHANNELS];
217 unsigned char UsageIndex[IGC::NUM_SHADER_CHANNELS];
218 };
219
220 /*****************************************************************************\
221 STRUCT: SShaderOpcodeCaps
222 \*****************************************************************************/
223 struct SShaderOpcodeCaps
224 {
225 IGC::SHADER_OPCODE opcode;
226 IGC::SHADER_VERSION_TYPE Version;
227 bool SupportsPredicate;
228 bool SupportsResource;
229 bool SupportsComparison;
230 bool SupportsConditional;
231 };
232
233 /*****************************************************************************\
234 STRUCT: SCallSiteUsage
235 \*****************************************************************************/
236 struct SCallSiteUsage
237 {
238 unsigned int usageCnt : 16;
239 unsigned int tramIndex : 16;
240 };
241
242 USC_API_C_ASSERT( sizeof(SCallSiteUsage) == sizeof(unsigned int) );
243
244 /*****************************************************************************\
245 STRUCT: SShaderInterfaceDeclType
246 \*****************************************************************************/
247 struct SShaderInterfaceDeclType
248 {
249 unsigned int originalID : 8; // max 253 interfaces allowed
250 unsigned int arraySize : 8; // can't have more instances than max number of interfaces
251 unsigned int numCallSites : 16; // max number of call sites is 4096
252 unsigned int numFunctionTables;
253 unsigned int* pFunctionTables;
254 unsigned int* pTargets;
255 SCallSiteUsage* pCallSitesUsage; // Call sites usage / trampoline indices
256 unsigned int constantBufferOffset; // Offset for interface jump table in CB
257
258 unsigned int* pInternalBuffer; // this is for function tables and call targets storage
259 };
260
261 /*****************************************************************************\
262 STRUCT: SShaderFunctionTableDeclType
263 \*****************************************************************************/
264 struct SShaderFunctionTableDeclType
265 {
266 unsigned int numFunctionBodies;
267 unsigned int* pFunctionBodies;
268 unsigned int* pJumpOffsets;
269
270 unsigned int* pInternalBuffer;
271 };
272
273 /*****************************************************************************\
274 STRUCT: SVFuncCallOffsets
275
276 Description:
277
278 Structure stores offsets to a single virtual function for multiple
279 dispatch modes.
280
281 \*****************************************************************************/
282 struct SVFuncCallOffsets
283 {
284 unsigned int m_Simd8Offset;
285 unsigned int m_Simd16Offset;
286 unsigned int m_Simd32Offset;
287 };
288
289 /*****************************************************************************\
290 STRUCT: SOfflineCompileData
291
292 Description:
293
294 Offline compilation data
295
296 \*****************************************************************************/
297 struct SOfflineCompileData
298 {
299 void* pProgramData;
300 unsigned int programSize;
301
302 struct _Common
303 {
304 unsigned int BindingTableCount;
305 } Common;
306
307 struct _PS
308 {
309 bool ReqBarycentricPerspectivePixelLocation;
310 bool ReqBarycentricPerspectiveCentroid;
311 bool ReqBarycentricPerspectiveSample;
312 bool ReqBarycentricNonPerspectivePixelLocation;
313 bool ReqBarycentricNonPerspectiveCentroid;
314 bool ReqBarycentricNonPerspectiveSample;
315
316 bool CompiledFor32PixelDispatch;
317 bool CompiledFor16PixelDispatch;
318 bool CompiledFor8PixelDispatch;
319
320 unsigned int SIMD32ProgramSize;
321 unsigned int SIMD16ProgramSize;
322 unsigned int SIMD8ProgramSize;
323
324 unsigned int SIMD32DispatchGRFStartRegister;
325 unsigned int SIMD16DispatchGRFStartRegister;
326 unsigned int SIMD8DispatchGRFStartRegister;
327 } PS;
328 };
329
330 bool OpcodeSupportsPredicate(IGC::SHADER_OPCODE opcode);
331 bool OpcodeSupportsResource(IGC::SHADER_OPCODE opcode);
332 bool OpcodeSupportsComparison(IGC::SHADER_OPCODE opcode);
333 bool OpcodeSupportsConditional(IGC::SHADER_OPCODE opcode);
334
335 /*****************************************************************************\
336 STRUCT: SInterfaceThisData
337 \*****************************************************************************/
338 struct SInterfaceThisData
339 {
340 unsigned int ConstantBufferID;
341 unsigned int ConstantBufferOffest;
342 unsigned int BaseTextureIndex;
343 unsigned int BaseSamplerIndex;
344 };
345
346 /*****************************************************************************\
347 STRUCT: SInterfacesBindingData
348 \*****************************************************************************/
349 struct SInterfacesBindingData
350 {
351 unsigned int NumInstances;
352 SInterfaceThisData ThisData[ NUM_SHADER_INTERFACES ];
353 unsigned int FunctionTables[ NUM_SHADER_INTERFACES ];
354 };
355
356 } //namespace USC
357
358 namespace iSTD
359 {
360
361 template<typename T>
362 struct IsArrayTypeSupported;
363
364 template<>
365 struct IsArrayTypeSupported< USC::SHADER_OPERAND_PRECISION > { enum { value = true }; };
366
367 } // namespace iSTD
368
369