UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
OpenGLShaderResources.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 OpenGLShaderResources.h: OpenGL shader resource RHI definitions.
5=============================================================================*/
6
7#pragma once
8
9#include "Containers/Array.h"
10#include "CrossCompilerCommon.h"
11#include "OpenGLThirdParty.h"
12
14
16#define DEBUG_GL_SHADERS (UE_BUILD_DEBUG || UE_EDITOR)
17
21enum
22{
23 OGL_MAX_UNIFORM_BUFFER_BINDINGS = 12, // @todo-mobile: Remove me
24 OGL_FIRST_UNIFORM_BUFFER = 0, // @todo-mobile: Remove me
25 OGL_UAV_NOT_SUPPORTED_FOR_GRAPHICS_UNIT = -1, // for now, only CS and PS supports UAVs/ images
26};
27
29{
32
34 {
35 if(&A != &B)
36 {
37 return (A.Location == B.Location) && (A.Varying.Num() == B.Varying.Num()) && (FMemory::Memcmp(A.Varying.GetData(), B.Varying.GetData(), A.Varying.Num() * sizeof(ANSICHAR)) == 0);
38 }
39 return true;
40 }
41
43 {
45 Hash ^= FCrc::MemCrc32(Var.Varying.GetData(), Var.Varying.Num() * sizeof(ANSICHAR));
46 return Hash;
47 }
48};
49
51{
52 Ar << Var.Varying;
53 Ar << Var.Location;
54 return Ar;
55}
56
77
79{
82 Ar << InputVaryings;
83 Ar << OutputVaryings;
84 Ar << ShaderResourceTable;
85 Ar << InOutMask;
86 Ar << NumSamplers;
88 Ar << NumUAVs;
89 Ar << bFlattenUB;
90
91 if (Ar.IsLoading())
92 {
93 // hash then strip out the Input/OutputVaryings at load time.
94 // The hash ensures varying diffs still affect operator== and GetTypeHash()
95 FSHA1 HashState;
97 {
98 for (const FOpenGLShaderVarying& Varying : InInputVaryings)
99 {
100 InHashState.Update((const uint8*)&Varying.Location, sizeof(Varying.Location));
101 InHashState.Update((const uint8*)Varying.Varying.GetData(), Varying.Varying.Num() * sizeof(ANSICHAR));
102 }
103 };
104 HashVarying(HashState, InputVaryings);
105 HashVarying(HashState, OutputVaryings);
106 HashState.Final();
107 HashState.GetHash(&VaryingHash.Hash[0]);
108
111 }
112
113 return Ar;
114}
115
129
131{
132 Ar << GlslMarker;
133 Ar << FrequencyMarker;
135 Ar << ShaderName;
137 Ar << NumInfos;
138 if (Ar.IsSaving())
139 {
140 for (int32 Index = 0; Index < NumInfos; ++Index)
141 {
143 }
144 }
145 else if (Ar.IsLoading())
146 {
148 for (int32 Index = 0; Index < NumInfos; ++Index)
149 {
151 Ar << Info;
153 }
154 }
155 return Ar;
156}
157
159
161{
162public:
168 )
169 : TypeEnum(InTypeEnum)
170 , CodeSize(InCodeSize)
171 , CodeCRC(InCodeCRC)
172 {
173 }
174
176 {
177 return A.TypeEnum == B.TypeEnum && A.CodeSize == B.CodeSize && A.CodeCRC == B.CodeCRC;
178 }
179
181 {
182 return GetTypeHash(Key.TypeEnum) ^ GetTypeHash(Key.CodeSize) ^ GetTypeHash(Key.CodeCRC);
183 }
184
185 uint32 GetCodeCRC() const { return CodeCRC; }
186
187private:
188 GLenum TypeEnum = 0;
189 uint32 CodeSize = 0;
190 uint32 CodeCRC = 0;
191};
192
197{
198public:
201
204
205 // List of memory copies from RHIUniformBuffer to packed uniforms
207
209
211
212#if DEBUG_GL_SHADERS
213 TArray<ANSICHAR> GlslCode;
214 const ANSICHAR* GlslCodeString; // make it easier in VS to see shader code in debug mode; points to begin of GlslCode
215#endif
216
218
220 {
221// if (Resource)
222// {
223// glDeleteShader(Resource);
224// }
225 }
226
227protected:
228 void Compile(GLenum TypeEnum);
229};
230
232{
233public:
235
237
238 void ConditionalyCompile();
239};
240
242{
243public:
245
247
248 void ConditionalyCompile();
249};
250
252{
253public:
255
257
258 void ConditionalyCompile();
259};
260
278
283{
284public:
287
290
292
296 void MarkAllDirty();
297
301 void Set(uint32 BufferIndex, uint32 ByteOffset, uint32 NumBytes, const void* NewValues);
302
308
310
311private:
312
314 uint8* PackedGlobalUniforms[CrossCompiler::PACKED_TYPEINDEX_MAX];
315
316 struct FRange
317 {
318 uint32 StartVector;
319 uint32 NumVectors;
320
321 void MarkDirtyRange(uint32 NewStartVector, uint32 NewNumVectors);
322 };
324 FRange PackedGlobalUniformDirty[CrossCompiler::PACKED_TYPEINDEX_MAX];
325
327 uint8* PackedUniformsScratch[CrossCompiler::PACKED_TYPEINDEX_MAX];
328
330 int32 GlobalUniformArraySize;
331};
332
333// unique identifier for a program. (composite of shader keys)
335{
336public:
337 FOpenGLProgramKey() = default;
340
342 {
343 bool bHashMatch = true;
344 for (uint32 i = 0; i < CrossCompiler::NUM_SHADER_STAGES && bHashMatch; ++i)
345 {
346 bHashMatch = A.ShaderHashes[i] == B.ShaderHashes[i];
347 }
348 return bHashMatch;
349 }
350
352 {
353 return !(A==B);
354 }
355
357 {
358 return FCrc::MemCrc32(Key.ShaderHashes, sizeof(Key.ShaderHashes));
359 }
360
362 {
363 for (int32 Stage = 0; Stage < CrossCompiler::NUM_SHADER_STAGES; Stage++)
364 {
365 Ar << HashSet.ShaderHashes[Stage];
366 }
367 return Ar;
368 }
369
370 FString ToString() const
371 {
372 FString retme;
374 {
377 return retme;
378 }
380 {
382 return retme;
383 }
384 else
385 {
386 retme = TEXT("Program with unset key");
387 return retme;
388 }
389 }
390
392};
393
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ OGL_UAV_NOT_SUPPORTED_FOR_GRAPHICS_UNIT
Definition OpenGLShaderResources.h:25
@ OGL_MAX_UNIFORM_BUFFER_BINDINGS
Definition OpenGLShaderResources.h:23
@ OGL_FIRST_UNIFORM_BUFFER
Definition OpenGLShaderResources.h:24
FArchive & operator<<(FArchive &Ar, FOpenGLShaderVarying &Var)
Definition OpenGLShaderResources.h:50
EShaderFrequency
Definition RHIDefinitions.h:202
@ SF_Compute
Definition RHIDefinitions.h:208
@ SF_Vertex
Definition RHIDefinitions.h:203
@ SF_Geometry
Definition RHIDefinitions.h:207
@ SF_Pixel
Definition RHIDefinitions.h:206
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
UE_FORCEINLINE_HINT bool IsSaving() const
Definition Archive.h:248
Definition OpenGLShaderResources.h:161
FOpenGLCompiledShaderKey(GLenum InTypeEnum, uint32 InCodeSize, uint32 InCodeCRC)
Definition OpenGLShaderResources.h:164
friend uint32 GetTypeHash(const FOpenGLCompiledShaderKey &Key)
Definition OpenGLShaderResources.h:180
friend bool operator==(const FOpenGLCompiledShaderKey &A, const FOpenGLCompiledShaderKey &B)
Definition OpenGLShaderResources.h:175
uint32 GetCodeCRC() const
Definition OpenGLShaderResources.h:185
FOpenGLCompiledShaderKey()=default
Definition OpenGLShaderResources.h:262
const TBitArray & GetUAVNeeds(int32 &OutMaxUAVUnitUsed) const
Definition OpenGLShaders.cpp:3086
void ConditionalyCompile()
Definition OpenGLShaders.cpp:1107
FOpenGLLinkedProgram * LinkedProgram
Definition OpenGLShaderResources.h:276
bool NeedsUAVStage(int32 UAVStageIndex) const
Definition OpenGLShaders.cpp:3092
static constexpr EShaderFrequency Frequency
Definition OpenGLShaderResources.h:264
int32 MaxTextureStageUsed()
Definition OpenGLShaders.cpp:3075
bool NeedsTextureStage(int32 TextureStageIndex)
Definition OpenGLShaders.cpp:3070
const TBitArray & GetTextureNeeds(int32 &OutMaxTextureStageUsed)
Definition OpenGLShaders.cpp:3080
Definition OpenGLShaderResources.h:252
void ConditionalyCompile()
Definition OpenGLShaders.cpp:1095
static constexpr EShaderFrequency Frequency
Definition OpenGLShaderResources.h:254
Definition OpenGLShaders.cpp:1262
Definition OpenGLShaderResources.h:242
static constexpr EShaderFrequency Frequency
Definition OpenGLShaderResources.h:244
void ConditionalyCompile()
Definition OpenGLShaders.cpp:1083
Definition OpenGLShaderResources.h:335
FSHAHash ShaderHashes[CrossCompiler::NUM_SHADER_STAGES]
Definition OpenGLShaderResources.h:391
friend bool operator==(const FOpenGLProgramKey &A, const FOpenGLProgramKey &B)
Definition OpenGLShaderResources.h:341
friend bool operator!=(const FOpenGLProgramKey &A, const FOpenGLProgramKey &B)
Definition OpenGLShaderResources.h:351
FString ToString() const
Definition OpenGLShaderResources.h:370
FOpenGLProgramKey()=default
friend FArchive & operator<<(FArchive &Ar, FOpenGLProgramKey &HashSet)
Definition OpenGLShaderResources.h:361
friend uint32 GetTypeHash(const FOpenGLProgramKey &Key)
Definition OpenGLShaderResources.h:356
Definition OpenGLShaderResources.h:283
void CommitPackedUniformBuffers(FOpenGLLinkedProgram *LinkedProgram, CrossCompiler::EShaderStage Stage, FRHIUniformBuffer **UniformBuffers, const TArray< CrossCompiler::FUniformBufferCopyInfo > &UniformBuffersCopyInfo)
Definition OpenGLShaders.cpp:3274
void CommitPackedGlobals(const FOpenGLLinkedProgram *LinkedProgram, CrossCompiler::EShaderStage Stage)
Definition OpenGLShaders.cpp:3211
~FOpenGLShaderParameterCache()
Definition OpenGLShaders.cpp:3166
void InitializeResources(int32 UniformArraySize)
Definition OpenGLShaders.cpp:3139
FOpenGLShaderParameterCache()
Definition OpenGLShaders.cpp:3129
void MarkAllDirty()
Definition OpenGLShaders.cpp:3183
Definition OpenGLShaderResources.h:197
bool bUsesProgrammableBlending
Definition OpenGLShaderResources.h:210
TArray< CrossCompiler::FUniformBufferCopyInfo > UniformBuffersCopyInfo
Definition OpenGLShaderResources.h:206
~FOpenGLShader()
Definition OpenGLShaderResources.h:219
GLuint Resource
Definition OpenGLShaderResources.h:200
FOpenGLShaderBindings Bindings
Definition OpenGLShaderResources.h:203
FOpenGLCompiledShaderKey ShaderCodeKey
Definition OpenGLShaderResources.h:208
Definition OpenGLShaderResources.h:232
void ConditionalyCompile()
Definition OpenGLShaders.cpp:1071
static constexpr EShaderFrequency Frequency
Definition OpenGLShaderResources.h:234
Definition RHIResources.h:1018
Definition RHIResources.h:978
Definition RHIResources.h:972
Definition RHIResources.h:854
Definition RHIResources.h:1232
Definition RHIResources.h:954
Definition SecureHash.h:314
CORE_API void Update(const uint8 *data, uint64 len)
Definition SecureHash.cpp:1205
CORE_API void GetHash(uint8 *puDest) const
Definition SecureHash.cpp:1269
CORE_API void Final()
Definition SecureHash.cpp:1245
Definition SecureHash.h:226
FString ToString() const
Definition SecureHash.h:242
uint8 Hash[20]
Definition SecureHash.h:228
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
void Empty(SizeType Slack=0)
Definition Array.h:2273
@ PACKED_TYPEINDEX_MAX
Definition CrossCompilerCommon.h:72
EShaderStage
Definition CrossCompilerCommon.h:16
@ NUM_SHADER_STAGES
Definition CrossCompilerCommon.h:24
@ SHADER_STAGE_COMPUTE
Definition CrossCompilerCommon.h:23
@ SHADER_STAGE_PIXEL
Definition CrossCompilerCommon.h:18
@ SHADER_STAGE_VERTEX
Definition CrossCompilerCommon.h:17
U16 Index
Definition radfft.cpp:71
Definition CrossCompilerCommon.h:194
Definition CrossCompilerCommon.h:251
static UE_FORCEINLINE_HINT uint32 MemCrc32(const void *Data, int32 Length, uint32 CRC=0)
Definition Crc.h:31
static UE_FORCEINLINE_HINT int32 Memcmp(const void *Buf1, const void *Buf2, SIZE_T Count)
Definition UnrealMemory.h:114
Definition OpenGLShaderResources.h:120
FOpenGLShaderBindings Bindings
Definition OpenGLShaderResources.h:123
uint32 GlslMarker
Definition OpenGLShaderResources.h:121
TArray< CrossCompiler::FUniformBufferCopyInfo > UniformBuffersCopyInfo
Definition OpenGLShaderResources.h:125
FArchive & Serialize(FArchive &Ar, FShaderResourceTable &SRT)
Definition OpenGLShaderResources.h:130
FString ShaderName
Definition OpenGLShaderResources.h:124
uint16 FrequencyMarker
Definition OpenGLShaderResources.h:122
Definition OpenGLShaderResources.h:61
TArray< CrossCompiler::FPackedArrayInfo > PackedGlobalArrays
Definition OpenGLShaderResources.h:63
CrossCompiler::FShaderBindingInOutMask InOutMask
Definition OpenGLShaderResources.h:66
uint8 NumSamplers
Definition OpenGLShaderResources.h:68
FArchive & Serialize(FArchive &Ar, FShaderResourceTable &ShaderResourceTable)
Definition OpenGLShaderResources.h:78
TArray< TArray< CrossCompiler::FPackedArrayInfo > > PackedUniformBuffers
Definition OpenGLShaderResources.h:62
uint8 NumUAVs
Definition OpenGLShaderResources.h:70
TArray< FOpenGLShaderVarying > InputVaryings
Definition OpenGLShaderResources.h:64
bool bFlattenUB
Definition OpenGLShaderResources.h:71
TArray< FOpenGLShaderVarying > OutputVaryings
Definition OpenGLShaderResources.h:65
uint8 NumUniformBuffers
Definition OpenGLShaderResources.h:69
FSHAHash VaryingHash
Definition OpenGLShaderResources.h:73
Definition OpenGLShaderResources.h:29
friend bool operator==(const FOpenGLShaderVarying &A, const FOpenGLShaderVarying &B)
Definition OpenGLShaderResources.h:33
TArray< ANSICHAR > Varying
Definition OpenGLShaderResources.h:30
friend uint32 GetTypeHash(const FOpenGLShaderVarying &Var)
Definition OpenGLShaderResources.h:42
int32 Location
Definition OpenGLShaderResources.h:31
Definition RHIResources.h:755