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