File: ShaderTypes.h

package info (click to toggle)
intel-graphics-compiler 1.0.12504.6-1%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 83,912 kB
  • sloc: cpp: 910,147; lisp: 202,655; ansic: 15,197; python: 4,025; yacc: 2,241; lex: 1,570; pascal: 244; sh: 104; makefile: 25
file content (368 lines) | stat: -rw-r--r-- 13,017 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
/*========================== begin_copyright_notice ============================

Copyright (C) 2017-2021 Intel Corporation

SPDX-License-Identifier: MIT

============================= end_copyright_notice ===========================*/

#pragma once

#include "ShaderTypesEnum.h"
#include "ShaderTypesConst.h"
#include "SurfaceFormats.h"
#include "usc_config.h"

/*****************************************************************************
MACRO: BITCOUNT
//  returns count of bits required to store set of (v) values in range <0;v-1>
*****************************************************************************/
#ifndef BITCOUNT
#define BITCOUNT(v) (((v)-1U)<65536U?((v)-1U)<256U?((v)-1U)<16U?((v)-1U)<4U?((v)-1U)<2U?1:2:((v)-1U)<\
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\
:((v)-1U)<2048U?11:12:((v)-1U)<(1U<<14U)?((v)-1U)<8192U?13:14:((v)-1U)<32768U?15:16:((v)-1U)<(1U<<24U)\
?((v)-1U)<(1U<<20U)?((v)-1U)<262144U?((v)-1U)<131072U?17:18:((v)-1U)<524288U?19:20:((v)-1U)<(1U<<22U)?\
((v)-1U)<(1U<<21U)?21:22:((v)-1U)<(1U<<23U)?23:24:((v)-1U)<(1U<<28U)?((v)-1U)<(1U<<26U)?((v)-1U)<(1U<<25U\
)?25:26:((v)-1U)<(1U<<27U)?27:28:((v)-1U)<(1U<<30U)?((v)-1U)<(1U<<29U)?29:30:((v)-1U)<(1U<<31U)?31:32)
#endif

/*****************************************************************************\
compile-time USC_API_C_ASSERT
\*****************************************************************************/
#ifndef USC_API_C_ASSERT
#define USC_API_C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
#endif

// verify that unsigned int is 32-bit
USC_API_C_ASSERT( sizeof( unsigned int )==4 );

namespace USC
{

/*****************************************************************************\
ENUM: Needed for Shader serialization and DeepCopy. Indicates which operation
      should be performed.
\*****************************************************************************/
enum IL_OP_TYPE
{
    IL_OP_DEEP_COPY,
    IL_OP_READ_FROM_STREAM,
    IL_OP_WRITE_TO_STREAM,
    IL_OP_COUNT_WRITE_BYTES
};

/*****************************************************************************\
ENUM: Needed for Shader serialization and DeepCopy of non trivial declarations.
      Indicates which declaration type should be processed.
\*****************************************************************************/
enum IL_DECL_TYPE
{
    IL_DECL_FUNCTION_TABLE,
    IL_DECL_INTERFACE
};

/*****************************************************************************\
ENUM: SHADER_OPERAND_PRECISION
\*****************************************************************************/
enum SHADER_OPERAND_PRECISION
{
    SHADER_OPERAND_PRECISION_DEFAULT = 0,
    SHADER_OPERAND_PRECISION_16      = 1, // for floats and signed int
    SHADER_OPERAND_PRECISION_8       = 2, // for signed int

    NUM_SHADER_OPERAND_PRECISIONS
};

/*****************************************************************************\
operator: < for SHADER_OPERAND_PRECISION
\*****************************************************************************/
inline bool isOfLesserPrec( SHADER_OPERAND_PRECISION precLesser, SHADER_OPERAND_PRECISION precGreater )
{
    // intentionally reversed
    return static_cast<unsigned int>( precLesser ) > static_cast<unsigned int>( precGreater );
}

/*****************************************************************************\

Function:
    MinPrec

Description:
    Returns lesser of two given operand precisions. Logically lesser precision
    (e.g. 8 bit is less than 16 bit, which is less than default 32 bit) means
    greater value of enum SHADER_OPERAND_PRECISION.

Input:
    SHADER_OPERAND_PRECISION lhsPrec - First precision.
    SHADER_OPERAND_PRECISION rhsPrec - Second precision.

Output:
    SHADER_OPERAND_PRECISION - Result precision.

\*****************************************************************************/
inline SHADER_OPERAND_PRECISION MinPrec(
    SHADER_OPERAND_PRECISION lhsPrec,
    SHADER_OPERAND_PRECISION rhsPrec )
{
    return isOfLesserPrec( lhsPrec, rhsPrec ) ? lhsPrec : rhsPrec;
}

/*****************************************************************************\

Function:
    MaxPrec

Description:
    Returns greater of two given operand precisions. Logically greater precision
    (e.g. default 32 bit is greater than 16 bit, which is greater than 8 bit)
    means lesser value of enum SHADER_OPERAND_PRECISION.

Input:
    SHADER_OPERAND_PRECISION lhsPrec - First precision.
    SHADER_OPERAND_PRECISION rhsPrec - Second precision.

Output:
    SHADER_OPERAND_PRECISION - Result precision.

\*****************************************************************************/
inline SHADER_OPERAND_PRECISION MaxPrec(
    SHADER_OPERAND_PRECISION lhsPrec,
    SHADER_OPERAND_PRECISION rhsPrec )
{
    return isOfLesserPrec( lhsPrec, rhsPrec ) ? rhsPrec : lhsPrec;
}

/*****************************************************************************\
STRUCT: SShaderResourceDeclType
\*****************************************************************************/
struct SShaderSamplerDeclType
{
    unsigned int    SamplerType     : BITCOUNT( IGC::NUM_SHADER_SAMPLER_TYPES );
    unsigned int    LBound; // IGC::SHADER_VERSION_4_0
    unsigned int    UBound; // IGC::SHADER_VERSION_4_0
    unsigned int    Space;  // IGC::SHADER_VERSION_4_0
};

/*****************************************************************************\
STRUCT: SShaderResourceDeclType
\*****************************************************************************/
struct SShaderResourceDeclType
{
    unsigned int   ResourceType         : BITCOUNT( IGC::NUM_SHADER_RESOURCE_TYPES );
    unsigned int   SurfaceFormat        : BITCOUNT( IGC::NUM_SURFACE_FORMATS );
    unsigned int   UAVAccessMode        : BITCOUNT( IGC::NUM_SHADER_UAV_ACCESS_MODES );
    unsigned int   ReturnType           : BITCOUNT( IGC::NUM_SHADER_RESOURCE_RETURN_TYPES );
    unsigned int   AccessCoherency      : 1;
    unsigned int   RasterizerOrdered    : 1;
    unsigned int   IsVariable           : 1;
    unsigned int   Stride;
    unsigned int   ByteOrStructCount;
    unsigned int   Offset;
    unsigned int   Alignment;
    unsigned int   LBound; // IGC::SHADER_VERSION_4_0
    unsigned int   UBound; // IGC::SHADER_VERSION_4_0
    unsigned int   Space;  // IGC::SHADER_VERSION_4_0
};

/*****************************************************************************\
STRUCT: SShaderConstantBufferDeclType
\*****************************************************************************/
struct SShaderConstantBufferDeclType
{
    unsigned int   LBound; // IGC::SHADER_VERSION_4_0
    unsigned int   UBound; // IGC::SHADER_VERSION_4_0
    unsigned int   Space;  // IGC::SHADER_VERSION_4_0
    unsigned int   Size;   // IGC::SHADER_VERSION_4_0. Count of 16-byte vectors. 0 if not known.
};

/*****************************************************************************\
STRUCT: SShaderInputDeclType
\*****************************************************************************/
struct SShaderInputDeclType
{
    unsigned int   Mask                : IGC::NUM_SHADER_CHANNELS;
    unsigned int   InterpolationMode   : BITCOUNT( IGC::NUM_SHADER_INTERPOLATION_MODES );
    unsigned int   IsIndexed           : 1;

    union
    {
        struct
        {
            unsigned int X : 1;
            unsigned int Y : 1;
            unsigned int Z : 1;
            unsigned int W : 1;
        } Channel;

        unsigned int   Value   : IGC::NUM_SHADER_CHANNELS;
    } PrimIDMask;

    unsigned char  Usage[IGC::NUM_SHADER_CHANNELS];
    unsigned char  UsageIndex[IGC::NUM_SHADER_CHANNELS];

    bool HasUsesFullPrecision[IGC::NUM_SHADER_CHANNELS];
    bool HasUsesLowPrecision[IGC::NUM_SHADER_CHANNELS];
};

/*****************************************************************************\
STRUCT: SShaderOutputDeclType
\*****************************************************************************/
struct SShaderOutputDeclType
{
    unsigned int   Mask        : IGC::NUM_SHADER_CHANNELS;
    unsigned int   IsIndexed   : 1;
    unsigned int   IsInvariant : 1;

    unsigned char  Usage[IGC::NUM_SHADER_CHANNELS];
    unsigned char  UsageIndex[IGC::NUM_SHADER_CHANNELS];
};

/*****************************************************************************\
STRUCT: SShaderOpcodeCaps
\*****************************************************************************/
struct SShaderOpcodeCaps
{
    IGC::SHADER_OPCODE opcode;
    IGC::SHADER_VERSION_TYPE  Version;
    bool SupportsPredicate;
    bool SupportsResource;
    bool SupportsComparison;
    bool SupportsConditional;
};

/*****************************************************************************\
STRUCT: SCallSiteUsage
\*****************************************************************************/
struct SCallSiteUsage
{
    unsigned int   usageCnt    : 16;
    unsigned int   tramIndex   : 16;
};

USC_API_C_ASSERT( sizeof(SCallSiteUsage) == sizeof(unsigned int) );

/*****************************************************************************\
STRUCT: SShaderInterfaceDeclType
\*****************************************************************************/
struct SShaderInterfaceDeclType
{
    unsigned int   originalID          : 8;    // max 253 interfaces allowed
    unsigned int   arraySize           : 8;    // can't have more instances than max number of interfaces
    unsigned int   numCallSites        : 16;   // max number of call sites is 4096
    unsigned int   numFunctionTables;
    unsigned int*  pFunctionTables;
    unsigned int*  pTargets;
    SCallSiteUsage* pCallSitesUsage;    // Call sites usage / trampoline indices
    unsigned int   constantBufferOffset;       // Offset for interface jump table in CB

    unsigned int*  pInternalBuffer;            // this is for function tables and call targets storage
};

/*****************************************************************************\
STRUCT: SShaderFunctionTableDeclType
\*****************************************************************************/
struct SShaderFunctionTableDeclType
{
    unsigned int   numFunctionBodies;
    unsigned int*  pFunctionBodies;
    unsigned int*  pJumpOffsets;

    unsigned int*  pInternalBuffer;
};

/*****************************************************************************\
STRUCT: SVFuncCallOffsets

Description:

    Structure stores offsets to a single virtual function for multiple
    dispatch modes.

\*****************************************************************************/
struct SVFuncCallOffsets
{
    unsigned int m_Simd8Offset;
    unsigned int m_Simd16Offset;
    unsigned int m_Simd32Offset;
};

/*****************************************************************************\
STRUCT: SOfflineCompileData

Description:

    Offline compilation data

\*****************************************************************************/
struct SOfflineCompileData
{
    void*   pProgramData;
    unsigned int   programSize;

    struct _Common
    {
        unsigned int   BindingTableCount;
    } Common;

    struct _PS
    {
        bool    ReqBarycentricPerspectivePixelLocation;
        bool    ReqBarycentricPerspectiveCentroid;
        bool    ReqBarycentricPerspectiveSample;
        bool    ReqBarycentricNonPerspectivePixelLocation;
        bool    ReqBarycentricNonPerspectiveCentroid;
        bool    ReqBarycentricNonPerspectiveSample;

        bool    CompiledFor32PixelDispatch;
        bool    CompiledFor16PixelDispatch;
        bool    CompiledFor8PixelDispatch;

        unsigned int   SIMD32ProgramSize;
        unsigned int   SIMD16ProgramSize;
        unsigned int   SIMD8ProgramSize;

        unsigned int   SIMD32DispatchGRFStartRegister;
        unsigned int   SIMD16DispatchGRFStartRegister;
        unsigned int   SIMD8DispatchGRFStartRegister;
    } PS;
};

bool OpcodeSupportsPredicate(IGC::SHADER_OPCODE opcode);
bool OpcodeSupportsResource(IGC::SHADER_OPCODE opcode);
bool OpcodeSupportsComparison(IGC::SHADER_OPCODE opcode);
bool OpcodeSupportsConditional(IGC::SHADER_OPCODE opcode);

/*****************************************************************************\
STRUCT: SInterfaceThisData
\*****************************************************************************/
struct SInterfaceThisData
{
    unsigned int   ConstantBufferID;
    unsigned int   ConstantBufferOffest;
    unsigned int   BaseTextureIndex;
    unsigned int   BaseSamplerIndex;
};

/*****************************************************************************\
STRUCT: SInterfacesBindingData
\*****************************************************************************/
struct SInterfacesBindingData
{
    unsigned int        NumInstances;
    SInterfaceThisData  ThisData[ NUM_SHADER_INTERFACES ];
    unsigned int        FunctionTables[ NUM_SHADER_INTERFACES ];
};

} //namespace USC

namespace iSTD
{

template<typename T>
struct IsArrayTypeSupported;

template<>
struct IsArrayTypeSupported< USC::SHADER_OPERAND_PRECISION > { enum { value = true }; };

} // namespace iSTD