UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ShaderPermutation.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 ShaderPermutation.h: All shader permutation's compile time API.
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "ShaderCore.h"
11
12// Enable this to log the parameters of each compiled permutation
13inline constexpr bool bLogPermutations = false;
14
16
17// Flags that can specialize shader permutations compiled for specific platforms
19{
20 None = 0u,
21 HasEditorOnlyData = (1u << 0),
22 IsODSCOnly = (1u << 1),
23};
25
27{
28 // Shader platform to compile to.
30
31 // Unique permutation identifier of the material shader type.
33
34 // Flags that describe the permutation
36
37 // Default to include editor-only shaders, to maintain backwards-compatibility
44};
45
48{
50 using Type = bool;
51
53 static constexpr int32 PermutationCount = 2;
54
58 static constexpr bool IsMultiDimensional = false;
59
60
63 {
64 return E ? 1 : 0;
65 }
66
68 static bool ToDefineValue(Type E)
69 {
70 return E;
71 }
72
74 static Type FromDimensionValueId(int32 PermutationId)
75 {
76 checkf(PermutationId == 0 || PermutationId == 1, TEXT("Invalid shader permutation dimension id %i."), PermutationId);
77 return PermutationId == 1;
78 }
79};
80
81
83template <typename TType, int32 TDimensionSize, int32 TFirstValue=0>
85{
87 using Type = TType;
88
91
95 static constexpr bool IsMultiDimensional = false;
96
98 static constexpr Type MinValue = static_cast<Type>(TFirstValue);
99 static constexpr Type MaxValue = static_cast<Type>(TFirstValue + TDimensionSize - 1);
100
101
104 {
105 int32 PermutationId = static_cast<int32>(E) - TFirstValue;
106 checkf(PermutationId < PermutationCount && PermutationId >= 0, TEXT("Unknown shader permutation dimension value id %i."), PermutationId);
107 return PermutationId;
108 }
109
112 {
114 }
115
117 static Type FromDimensionValueId(int32 PermutationId)
118 {
119 checkf(PermutationId < PermutationCount && PermutationId >= 0, TEXT("Invalid shader permutation dimension value id %i."), PermutationId);
120 return static_cast<Type>(PermutationId + TFirstValue);
121 }
122};
123
124
126template <int32... Ts>
128{
130 using Type = int32;
131
133 static constexpr int32 PermutationCount = 0;
134
138 static constexpr bool IsMultiDimensional = false;
139
140
143 {
144 checkf(false, TEXT("Unknown shader permutation dimension value %i."), E);
145 return int32(0);
146 }
147
149 static Type FromDimensionValueId(int32 PermutationId)
150 {
151 checkf(false, TEXT("Invalid shader permutation dimension id %i."), PermutationId);
152 return Type(0);
153 }
154};
155
156template <int32 TUniqueValue, int32... Ts>
158{
160 using Type = int32;
161
164
168 static constexpr bool IsMultiDimensional = false;
169
170
173 {
174 if (E == TUniqueValue)
175 {
176 return PermutationCount - 1;
177 }
179 }
180
183 {
184 return int32(E);
185 }
186
188 static Type FromDimensionValueId(int32 PermutationId)
189 {
190 if (PermutationId == PermutationCount - 1)
191 {
192 return TUniqueValue;
193 }
195 }
196};
197
198
227template <typename... Ts>
229{
234
236 static constexpr bool IsMultiDimensional = true;
237
239 static constexpr int32 PermutationCount = 1;
240
241
243 TShaderPermutationDomain<Ts...>() {}
244 explicit TShaderPermutationDomain<Ts...>(int32 PermutationId)
245 {
246 checkf(PermutationId == 0, TEXT("Invalid shader permutation id %i."), PermutationId);
247 }
248
249
251 template<class DimensionToSet>
252 void Set(typename DimensionToSet::Type)
253 {
254 // On clang, we can't do static_assert(false), because is evaluated even when method is not used. So
255 // we test sizeof(DimensionToSet::Type) == 0 to make the static assert depend on the DimensionToSet
256 // template parameter.
257 static_assert(sizeof(typename DimensionToSet::Type) == 0, "Unknown shader permutation dimension.");
258 }
259
261 template<class DimensionToGet>
262 const typename DimensionToGet::Type Get() const
263 {
264 // On clang, we can't do static_assert(false), because is evaluated even when method is not used. So
265 // we test sizeof(DimensionToSet::Type) == 0 to make the static assert depend on the DimensionToGet
266 // template parameter.
267 static_assert(sizeof(typename DimensionToGet::Type) == 0, "Unknown shader permutation dimension.");
268 return DimensionToGet::Type();
269 }
270
271
274
275
278 {
279 return 0;
280 }
281
283 {
284 return ToDimensionValueId(*this);
285 }
286
287
289 static Type FromDimensionValueId(const int32 PermutationId)
290 {
291 return Type(PermutationId);
292 }
293
294
296 bool operator==(const Type& Other) const
297 {
298 return true;
299 }
300};
301
302
303// C++11 doesn't allow partial specialization of templates method or function. So we spetialise class that have
304// non spetialised static method, but leave templated static function.
305template<bool BooleanSpecialization>
307{
308public:
309
310 template<typename TPermutationVector, typename TDimension>
312 {
313
314 if constexpr (bLogPermutations)
315 {
316 UE_LOG(LogShaders, Verbose, TEXT(" %s = %d"), TDimension::DefineName, TDimension::ToDefineValue(PermutationVector.DimensionValue));
317 }
318
319 OutEnvironment.SetDefine(TDimension::DefineName, TDimension::ToDefineValue(PermutationVector.DimensionValue));
320 return PermutationVector.Tail.ModifyCompilationEnvironment(OutEnvironment);
321 }
322
323 template<typename TPermutationVector, typename TDimensionToGet>
324 static const typename TDimensionToGet::Type& GetDimension(const TPermutationVector& PermutationVector)
325 {
326 return PermutationVector.Tail.template Get<TDimensionToGet>();
327 }
328
329 template<typename TPermutationVector, typename TDimensionToSet>
330 static void SetDimension(TPermutationVector& PermutationVector, const typename TDimensionToSet::Type& Value)
331 {
332 return PermutationVector.Tail.template Set<TDimensionToSet>(Value);
333 }
334
335};
336
337template<>
339{
340public:
341
342 template<typename TPermutationVector, typename TDimension>
344 {
345 PermutationVector.DimensionValue.ModifyCompilationEnvironment(OutEnvironment);
346 return PermutationVector.Tail.ModifyCompilationEnvironment(OutEnvironment);
347 }
348
349 template<typename TPermutationVector, typename TDimensionToGet>
350 static const typename TDimensionToGet::Type& GetDimension(const TPermutationVector& PermutationVector)
351 {
352 return PermutationVector.DimensionValue;
353 }
354
355 template<typename TPermutationVector, typename TDimensionToSet>
356 static void SetDimension(TPermutationVector& PermutationVector, const typename TDimensionToSet::Type& Value)
357 {
358 PermutationVector.DimensionValue = Value;
359 }
360
361};
362
363
364template <typename TDimension, typename... Ts>
366{
371
373 static constexpr bool IsMultiDimensional = true;
374
377
379 static constexpr int32 PermutationCount = Super::PermutationCount * TDimension::PermutationCount;
380
381
384 : DimensionValue(TDimension::FromDimensionValueId(0))
385 {
386 }
387
388 explicit TShaderPermutationDomain<TDimension, Ts...>(int32 PermutationId)
389 : DimensionValue(TDimension::FromDimensionValueId(PermutationId % TDimension::PermutationCount))
390 , Tail(PermutationId / TDimension::PermutationCount)
391 {
392 checkf(PermutationId >= 0 && PermutationId < PermutationCount, TEXT("Invalid shader permutation id %i."), PermutationId);
393 }
394
395
397 template<class DimensionToSet>
402
403
405 template<class DimensionToGet>
410
411
413 inline const typename Super::Type& GetTail() const
414 {
415 return Tail;
416 }
417
418
424
425
428 {
429 return PermutationVector.ToDimensionValueId();
430 }
431
433 {
434 return TDimension::ToDimensionValueId(DimensionValue) + TDimension::PermutationCount * Tail.ToDimensionValueId();
435 }
436
437
439 static Type FromDimensionValueId(const int32 PermutationId)
440 {
441 return Type(PermutationId);
442 }
443
444
446 bool operator==(const Type& Other) const
447 {
448 return DimensionValue == Other.DimensionValue && Tail == Other.Tail;
449 }
450
452 bool operator!=(const Type& Other) const
453 {
454 return !(*this == Other);
455 }
456
457private:
458 template<bool BooleanSpecialization>
460
461 typename TDimension::Type DimensionValue;
462 Super Tail;
463};
464
465
468
469
470// Internal implementation of non multi-dimensional shader permutation dimension.
471#define DECLARE_SHADER_PERMUTATION_IMPL(InDefineName,PermutationMetaType,...) \
472 public PermutationMetaType<__VA_ARGS__> { \
473 public: \
474 static constexpr const TCHAR* DefineName = TEXT(InDefineName); \
475 }
476
477
482#define SHADER_PERMUTATION_BOOL(InDefineName) \
483 public FShaderPermutationBool { \
484 public: \
485 static constexpr const TCHAR* DefineName = TEXT(InDefineName); \
486 }
487
492#define SHADER_PERMUTATION_INT(InDefineName, Count) \
493 DECLARE_SHADER_PERMUTATION_IMPL(InDefineName, TShaderPermutationInt, int32, Count)
494
499#define SHADER_PERMUTATION_RANGE_INT(InDefineName, Start, Count) \
500 DECLARE_SHADER_PERMUTATION_IMPL(InDefineName, TShaderPermutationInt, int32, Count, Start)
501
506#define SHADER_PERMUTATION_SPARSE_INT(InDefineName,...) \
507 DECLARE_SHADER_PERMUTATION_IMPL(InDefineName, TShaderPermutationSparseInt, __VA_ARGS__)
508
521#define SHADER_PERMUTATION_ENUM_CLASS(InDefineName, EnumName) \
522 DECLARE_SHADER_PERMUTATION_IMPL(InDefineName, TShaderPermutationInt, EnumName, static_cast<int32>(EnumName::MAX))
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
return true
Definition ExternalRpcRegistry.cpp:601
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
const bool
Definition NetworkReplayStreaming.h:178
EShaderPlatform
Definition RHIShaderPlatform.h:11
EShaderPermutationFlags
Definition ShaderPermutation.h:19
constexpr bool bLogPermutations
Definition ShaderPermutation.h:13
uint32_t uint32
Definition binka_ue_file_header.h:6
static void ModifyCompilationEnvironment(const TPermutationVector &PermutationVector, FShaderCompilerEnvironment &OutEnvironment)
Definition ShaderPermutation.h:343
static void SetDimension(TPermutationVector &PermutationVector, const typename TDimensionToSet::Type &Value)
Definition ShaderPermutation.h:356
static const TDimensionToGet::Type & GetDimension(const TPermutationVector &PermutationVector)
Definition ShaderPermutation.h:350
Definition ShaderPermutation.h:307
static void ModifyCompilationEnvironment(const TPermutationVector &PermutationVector, FShaderCompilerEnvironment &OutEnvironment)
Definition ShaderPermutation.h:311
static void SetDimension(TPermutationVector &PermutationVector, const typename TDimensionToSet::Type &Value)
Definition ShaderPermutation.h:330
static const TDimensionToGet::Type & GetDimension(const TPermutationVector &PermutationVector)
Definition ShaderPermutation.h:324
Definition ShaderCore.h:544
Definition ShaderPermutation.h:48
static Type FromDimensionValueId(int32 PermutationId)
Definition ShaderPermutation.h:74
static constexpr bool IsMultiDimensional
Definition ShaderPermutation.h:58
static constexpr int32 PermutationCount
Definition ShaderPermutation.h:53
static bool ToDefineValue(Type E)
Definition ShaderPermutation.h:68
bool Type
Definition ShaderPermutation.h:50
static int32 ToDimensionValueId(Type E)
Definition ShaderPermutation.h:62
Definition ShaderPermutation.h:27
const int32 PermutationId
Definition ShaderPermutation.h:32
const EShaderPlatform Platform
Definition ShaderPermutation.h:29
FShaderPermutationParameters(EShaderPlatform InPlatform, int32 InPermutationId=0, EShaderPermutationFlags InFlags=EShaderPermutationFlags::HasEditorOnlyData)
Definition ShaderPermutation.h:38
const EShaderPermutationFlags Flags
Definition ShaderPermutation.h:35
Definition ShaderPermutation.h:366
static int32 ToDimensionValueId(const Type &PermutationVector)
Definition ShaderPermutation.h:427
bool operator==(const Type &Other) const
Definition ShaderPermutation.h:446
bool operator!=(const Type &Other) const
Definition ShaderPermutation.h:452
static Type FromDimensionValueId(const int32 PermutationId)
Definition ShaderPermutation.h:439
void ModifyCompilationEnvironment(FShaderCompilerEnvironment &OutEnvironment) const
Definition ShaderPermutation.h:420
const DimensionToGet::Type & Get() const
Definition ShaderPermutation.h:406
void Set(typename DimensionToSet::Type Value)
Definition ShaderPermutation.h:398
const Super::Type & GetTail() const
Definition ShaderPermutation.h:413
int32 ToDimensionValueId() const
Definition ShaderPermutation.h:432
Definition ShaderPermutation.h:229
static Type FromDimensionValueId(const int32 PermutationId)
Definition ShaderPermutation.h:289
void ModifyCompilationEnvironment(FShaderCompilerEnvironment &OutEnvironment) const
Definition ShaderPermutation.h:273
void Set(typename DimensionToSet::Type)
Definition ShaderPermutation.h:252
bool operator==(const Type &Other) const
Definition ShaderPermutation.h:296
static constexpr bool IsMultiDimensional
Definition ShaderPermutation.h:236
int32 ToDimensionValueId() const
Definition ShaderPermutation.h:282
static constexpr int32 PermutationCount
Definition ShaderPermutation.h:239
const DimensionToGet::Type Get() const
Definition ShaderPermutation.h:262
static int32 ToDimensionValueId(const Type &PermutationVector)
Definition ShaderPermutation.h:277
TShaderPermutationDomain< Ts... > Type
Definition ShaderPermutation.h:233
Definition ShaderPermutation.h:85
static constexpr int32 PermutationCount
Definition ShaderPermutation.h:90
static constexpr Type MinValue
Definition ShaderPermutation.h:98
TType Type
Definition ShaderPermutation.h:87
static constexpr bool IsMultiDimensional
Definition ShaderPermutation.h:95
static Type FromDimensionValueId(int32 PermutationId)
Definition ShaderPermutation.h:117
static int32 ToDimensionValueId(Type E)
Definition ShaderPermutation.h:103
static constexpr Type MaxValue
Definition ShaderPermutation.h:99
static int32 ToDefineValue(Type E)
Definition ShaderPermutation.h:111
static Type FromDimensionValueId(int32 PermutationId)
Definition ShaderPermutation.h:188
static int32 ToDimensionValueId(Type E)
Definition ShaderPermutation.h:172
int32 Type
Definition ShaderPermutation.h:160
static int32 ToDefineValue(Type E)
Definition ShaderPermutation.h:182
Definition ShaderPermutation.h:128
static int32 ToDimensionValueId(Type E)
Definition ShaderPermutation.h:142
static constexpr bool IsMultiDimensional
Definition ShaderPermutation.h:138
static Type FromDimensionValueId(int32 PermutationId)
Definition ShaderPermutation.h:149
int32 Type
Definition ShaderPermutation.h:130
static constexpr int32 PermutationCount
Definition ShaderPermutation.h:133