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
|