UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
OpenGLResources.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 OpenGLResources.h: OpenGL resource RHI definitions.
5=============================================================================*/
6
7#pragma once
8
9// HEADER_UNIT_SKIP - Not included directly
10
11#include "OpenGLUtil.h"
12#include "OpenGLPlatform.h"
13#include "OpenGL.h"
14
15#include "CoreTypes.h"
17#include "HAL/UnrealMemory.h"
20#include "Containers/Array.h"
22#include "Logging/LogMacros.h"
23#include "Containers/BitArray.h"
24#include "Math/IntPoint.h"
25#include "Misc/CommandLine.h"
27#include "Stats/Stats.h"
28#include "RHI.h"
30#include "RenderResource.h"
32#include "PsoLruCache.h"
33
34#define UE_API OPENGLDRV_API
35
38class FOpenGLTexture;
40
42{
43 extern int32 bUseMapBuffer;
44 extern int32 MaxSubDataSize;
47};
48
49#if PLATFORM_WINDOWS
50#define RESTRICT_SUBDATA_SIZE 1
51#else
52#define RESTRICT_SUBDATA_SIZE 0
53#endif
54
56{
57 void UpdateUniformBufferStats(int64 BufferSize, bool bAllocating);
59}
60
61// Extra stats for finer-grained timing
62// They shouldn't always be on, as they may impact overall performance
63#define OPENGLRHI_DETAILED_STATS 0
64
65
66#if OPENGLRHI_DETAILED_STATS
69 #define SCOPE_CYCLE_COUNTER_DETAILED(Stat) SCOPE_CYCLE_COUNTER(Stat)
70 #define DETAILED_QUICK_SCOPE_CYCLE_COUNTER(x) QUICK_SCOPE_CYCLE_COUNTER(x)
71#else
72 #define SCOPE_CYCLE_COUNTER_DETAILED(Stat)
73 #define DETAILED_QUICK_SCOPE_CYCLE_COUNTER(x)
74#endif
75
76#define GLDEBUG_LABELS_ENABLED (!UE_BUILD_SHIPPING)
77
79{
80public:
82 {
83 checkf(!HasLinkedViews(), TEXT("All linked views must have been removed before the underlying resource can be deleted."));
84 }
85
86 bool HasLinkedViews() const
87 {
88 return LinkedViews != nullptr;
89 }
90
91 void UpdateLinkedViews();
92
93private:
96 class FOpenGLView* LinkedViews = nullptr;
97};
98
100{
101protected:
105
106public:
109
110 void Bind();
111 void OnBufferDeletion();
112};
113
114template <typename BaseType>
115class TOpenGLBuffer : public BaseType, public FOpenGLBufferBase
116{
117 void LoadData(uint32 InOffset, uint32 InSize, const void* InData)
118 {
120 const uint8* Data = (const uint8*)InData;
122
123 if (BlockSize > 0)
124 {
125 while ( InSize > 0)
126 {
127 const uint32 BufferSize = FMath::Min<uint32>( BlockSize, InSize);
128
129 FOpenGL::BufferSubData( Type, InOffset, BufferSize, Data);
130
131 InOffset += BufferSize;
132 InSize -= BufferSize;
133 Data += BufferSize;
134 }
135 }
136 else
137 {
138 FOpenGL::BufferSubData( Type, InOffset, InSize, InData);
139 }
140 }
141
142 GLenum GetAccess()
143 {
144 // Previously there was special-case logic to always use GL_STATIC_DRAW for vertex buffers allocated from staging buffer.
145 // However it seems to be incorrect as NVidia drivers complain (via debug output callback) about VIDEO->HOST copying for buffers with such hints
147 }
148
149public:
150 TOpenGLBuffer(FRHICommandListBase* RHICmdList, GLenum InType, const FRHIBufferCreateDesc& CreateDesc, const void *InData)
151 : BaseType(CreateDesc)
153 {
154 if (RHICmdList && RHICmdList->IsTopOfPipe() && InData)
155 {
156 InData = RHICmdList->AllocCopy(InData, CreateDesc.Size, 16);
157 }
158
159 auto InitLambda = [this, InData]()
160 {
162
163 FOpenGL::GenBuffers(1, &Resource);
164
165 Bind();
166
167#if !RESTRICT_SUBDATA_SIZE
168 glBufferData(Type, BaseType::GetSize(), InData, GetAccess());
169#else
170 glBufferData(Type, BaseType::GetSize(), nullptr, GetAccess());
171 if (InData != nullptr)
172 {
173 LoadData(0, BaseType::GetSize(), InData);
174 }
175#endif
176 BaseType::UpdateBufferStats(true);
177 };
178
179 if (!CreateDesc.IsNull())
180 {
181 if (RHICmdList)
182 {
183 RHICmdList->EnqueueLambda([Lambda = MoveTemp(InitLambda)](FRHICommandListBase&) { Lambda(); });
184 }
185 else
186 {
187 InitLambda();
188 }
189 }
190 }
191
193 {
195 }
196
197 uint8* Lock(uint32 InOffset, uint32 InSize, bool bReadOnly, bool bDiscard)
198 {
200 check(InOffset + InSize <= BaseType::GetSize());
201 //check( LockBuffer == NULL ); // Only one outstanding lock is allowed at a time!
202 check( !bIsLocked ); // Only one outstanding lock is allowed at a time!
204
205 Bind();
206
207 bIsLocked = true;
208 bIsLockReadOnly = bReadOnly;
209 uint8 *Data = NULL;
210
211 // Discard if the input size is the same as the backing store size, regardless of the input argument, as orphaning the backing store will typically be faster.
212 bDiscard = (bDiscard || (!bReadOnly && InSize == BaseType::GetSize())) && FOpenGL::DiscardFrameBufferToResize();
213
214 // Map buffer is faster in some circumstances and slower in others, decide when to use it carefully.
215 bool const bUseMapBuffer = (bReadOnly || OpenGLConsoleVariables::bUseMapBuffer);
216
217 // If we're able to discard the current data, do so right away
218 // If we can then we should orphan the buffer name & reallocate the backing store only once as calls to glBufferData may do so even when the size is the same.
219 uint32 DiscardSize = (bDiscard && !bUseMapBuffer && InSize == BaseType::GetSize() && !RESTRICT_SUBDATA_SIZE) ? 0 : BaseType::GetSize();
220
222 {
223 glBufferData(Type, DiscardSize, NULL, GetAccess());
224 }
225
226 if ( bUseMapBuffer)
227 {
228 FOpenGL::EResourceLockMode LockMode = bReadOnly ? FOpenGL::EResourceLockMode::RLM_ReadOnly : FOpenGL::EResourceLockMode::RLM_WriteOnly;
229 Data = static_cast<uint8*>( FOpenGL::MapBufferRange( Type, InOffset, InSize, LockMode ) );
230// checkf(Data != NULL, TEXT("FOpenGL::MapBufferRange Failed, glError %d (0x%x)"), glGetError(), glGetError());
231
232 LockOffset = InOffset;
233 LockSize = InSize;
234 LockBuffer = Data;
235 bLockBufferWasAllocated = false;
236 }
237 else
238 {
239 // Allocate a temp buffer to write into
240 LockOffset = InOffset;
241 LockSize = InSize;
242 if (CachedBuffer && InSize <= CachedBufferSize)
243 {
244 LockBuffer = CachedBuffer;
245 CachedBuffer = nullptr;
246 // Keep CachedBufferSize to keep the actual size allocated.
247 }
248 else
249 {
251 LockBuffer = FMemory::Malloc( InSize );
252 CachedBufferSize = InSize; // Safegard
253 }
254 Data = static_cast<uint8*>( LockBuffer );
255 bLockBufferWasAllocated = true;
256 }
257
258 if (Data == nullptr)
259 {
260 UE_LOG(LogRHI, Fatal, TEXT("Failed to lock buffer: Resource %u, Size %u, Offset %u, bReadOnly %d, bUseMapBuffer %d, glError (0x%x)"),
262 InSize,
263 InOffset,
264 bReadOnly ? 1:0,
265 bUseMapBuffer ? 1:0,
266 glGetError());
267 }
268
269 return Data;
270 }
271
273 {
274 //SCOPE_CYCLE_COUNTER_DETAILED(STAT_OpenGLMapBufferTime);
275 check(InOffset + InSize <= BaseType::GetSize());
276 //check( LockBuffer == NULL ); // Only one outstanding lock is allowed at a time!
277 check( !bIsLocked ); // Only one outstanding lock is allowed at a time!
279
280 Bind();
281
282 bIsLocked = true;
283 bIsLockReadOnly = false;
284 uint8 *Data = NULL;
285
286 // Discard if the input size is the same as the backing store size, regardless of the input argument, as orphaning the backing store will typically be faster.
287 bDiscard = (bDiscard || InSize == BaseType::GetSize()) && FOpenGL::DiscardFrameBufferToResize();
288
289 // Map buffer is faster in some circumstances and slower in others, decide when to use it carefully.
290 bool const bUseMapBuffer = OpenGLConsoleVariables::bUseMapBuffer;
291
292 // If we're able to discard the current data, do so right away
293 // If we can then we should orphan the buffer name & reallocate the backing store only once as calls to glBufferData may do so even when the size is the same.
294 uint32 DiscardSize = (bDiscard && !bUseMapBuffer && InSize == BaseType::GetSize() && !RESTRICT_SUBDATA_SIZE) ? 0 : BaseType::GetSize();
295
297 {
298 glBufferData( Type, DiscardSize, NULL, GetAccess());
299 }
300
301 if ( bUseMapBuffer)
302 {
303 FOpenGL::EResourceLockMode LockMode = bDiscard ? FOpenGL::EResourceLockMode::RLM_WriteOnly : FOpenGL::EResourceLockMode::RLM_WriteOnlyUnsynchronized;
304 Data = static_cast<uint8*>( FOpenGL::MapBufferRange( Type, InOffset, InSize, LockMode ) );
305 LockOffset = InOffset;
306 LockSize = InSize;
307 LockBuffer = Data;
308 bLockBufferWasAllocated = false;
309 }
310 else
311 {
312 // Allocate a temp buffer to write into
313 LockOffset = InOffset;
314 LockSize = InSize;
315 if (CachedBuffer && InSize <= CachedBufferSize)
316 {
317 LockBuffer = CachedBuffer;
318 CachedBuffer = nullptr;
319 // Keep CachedBufferSize to keep the actual size allocated.
320 }
321 else
322 {
324 LockBuffer = FMemory::Malloc( InSize );
325 CachedBufferSize = InSize; // Safegard
326 }
327 Data = static_cast<uint8*>( LockBuffer );
328 bLockBufferWasAllocated = true;
329 }
330
331 if (Data == nullptr)
332 {
333 UE_LOG(LogRHI, Fatal, TEXT("Failed to lock buffer (write only): Resource %u, Size %u, Offset %u, bUseMapBuffer %d, glError (0x%x)"),
335 InSize,
336 InOffset,
337 bUseMapBuffer ? 1:0,
338 glGetError());
339 }
340
341 return Data;
342 }
343
344 void Unlock()
345 {
346 //SCOPE_CYCLE_COUNTER_DETAILED(STAT_OpenGLUnmapBufferTime);
348 if (bIsLocked)
349 {
350 Bind();
351
352 if (OpenGLConsoleVariables::bUseMapBuffer || bIsLockReadOnly)
353 {
354 check(!bLockBufferWasAllocated);
355 FOpenGL::UnmapBufferRange(Type, LockOffset, LockSize);
356 LockBuffer = NULL;
357 }
358 else
359 {
360#if !RESTRICT_SUBDATA_SIZE
361 // Check for the typical, optimized case
362 if(LockSize == BaseType::GetSize())
363 {
364 if (FOpenGL::DiscardFrameBufferToResize())
365 {
366 glBufferData(Type, BaseType::GetSize(), LockBuffer, GetAccess());
367 }
368 else
369 {
370 FOpenGL::BufferSubData(Type, 0, LockSize, LockBuffer);
371 }
372 check( LockBuffer != NULL );
373 }
374 else
375 {
376 // Only updating a subset of the data
377 FOpenGL::BufferSubData(Type, LockOffset, LockSize, LockBuffer);
378 check( LockBuffer != NULL );
379 }
380#else
381 LoadData(LockOffset, LockSize, LockBuffer);
382 check(LockBuffer != NULL);
383#endif
384
385 check(bLockBufferWasAllocated);
386
387 if (EnumHasAnyFlags(this->GetUsage(), BUF_Volatile))
388 {
389 ReleaseCachedBuffer(); // Safegard
390
391 CachedBuffer = LockBuffer;
392 // Possibly > LockSize when reusing cached allocation.
393 CachedBufferSize = FMath::Max<GLuint>(CachedBufferSize, LockSize);
394 }
395 else
396 {
397 FMemory::Free(LockBuffer);
398 }
399 LockBuffer = NULL;
400 bLockBufferWasAllocated = false;
401 LockSize = 0;
402 }
403 bIsLocked = false;
404 }
405 }
406
407 void Update(void *InData, uint32 InOffset, uint32 InSize, bool bDiscard)
408 {
409 check(InOffset + InSize <= BaseType::GetSize());
411 Bind();
412#if !RESTRICT_SUBDATA_SIZE
413 FOpenGL::BufferSubData(Type, InOffset, InSize, InData);
414#else
415 LoadData(InOffset, InSize, InData);
416#endif
417 }
418
419 bool IsDynamic() const { return EnumHasAnyFlags(this->GetUsage(), BUF_AnyDynamic); }
420 bool IsLocked() const { return bIsLocked; }
421 bool IsLockReadOnly() const { return bIsLockReadOnly; }
422 void* GetLockedBuffer() const { return LockBuffer; }
423
425 {
426 if (CachedBuffer)
427 {
428 FMemory::Free(CachedBuffer);
429 CachedBuffer = nullptr;
430 CachedBufferSize = 0;
431 }
432 // Don't reset CachedBufferSize if !CachedBuffer since it could be the locked buffer allocation size.
433 }
434
436 {
438 check(!bIsLocked && !Other.bIsLocked);
439
441
442 BaseType::TakeOwnership(Other);
443
444 Type = Other.Type;
445 Resource = Other.Resource;
446 CachedBuffer = Other.CachedBuffer;
447 CachedBufferSize = Other.CachedBufferSize;
448
449 Other.Type = 0;
450 Other.Resource = 0;
451 Other.CachedBuffer = nullptr;
452 Other.CachedBufferSize = 0;
453 }
454
456 {
458
459 if (Resource != 0)
460 {
461 if (LockBuffer != NULL)
462 {
463 if (bLockBufferWasAllocated)
464 {
465 FMemory::Free(LockBuffer);
466 }
467 else
468 {
469 UE_LOG(LogRHI, Warning, TEXT("Destroying TOpenGLBuffer without returning memory to the driver; possibly called RHIMapStagingSurface() but didn't call RHIUnmapStagingSurface()? Resource %u"), Resource);
470 }
471 }
472
474
475 FOpenGL::DeleteBuffers(1, &Resource);
476 Resource = 0;
477
478 LockBuffer = nullptr;
479 BaseType::UpdateBufferStats(false);
480
482 }
483
484 BaseType::ReleaseOwnership();
485 }
486
487private:
488 uint32 bIsLocked : 1 = false;
489 uint32 bIsLockReadOnly : 1 = false;
490 uint32 bLockBufferWasAllocated : 1 = false;
491
492 GLuint LockSize = 0;
493 GLuint LockOffset = 0;
494 void* LockBuffer = nullptr;
495
496 // A cached allocation that can be reused. The same allocation can never be in CachedBuffer and LockBuffer at the same time.
497 void* CachedBuffer = nullptr;
498 // The size of the cached buffer allocation. Can be non zero even though CachedBuffer is null, to preserve the allocation size.
499 GLuint CachedBufferSize = 0;
500};
501
503{
504public:
506 : Desc(CreateDesc)
507 {}
508
509 const FRHIBufferDesc& GetDesc() const { return Desc; }
510 uint32 GetSize() const { return Desc.Size; }
511 EBufferUsageFlags GetUsage() const { return Desc.Usage; }
512
514 {
515 Desc = Other.Desc;
517 }
518
520 {
521 Desc = FRHIBufferDesc::Null();
522 }
523
524private:
525 FRHIBufferDesc Desc;
526
527protected:
532};
533
535{
536public:
541
542
543protected:
545 {
546 int64 AllocSize = ( bAllocating ? 1 : -1 ) * static_cast<int64>( GetSize() );
547 LLM_SCOPED_PAUSE_TRACKING_WITH_ENUM_AND_AMOUNT(ELLMTag::GraphicsPlatform, AllocSize, ELLMTracker::Platform, ELLMAllocType::None);
548 LLM_SCOPED_PAUSE_TRACKING_WITH_ENUM_AND_AMOUNT(ELLMTag::Meshes, AllocSize, ELLMTracker::Default, ELLMAllocType::None);
549
551 }
552};
553
556
575
577{
578public:
581
584
587
590
593
596
599
602
605
608
611
613
616
617 // Provides public non-const access to ResourceTable.
618 // @todo refactor uniform buffers to perform updates as a member function, so this isn't necessary.
620
621 void SetLayoutTable(const void* Contents, EUniformBufferValidation Validation);
622};
623
624#define MAX_STREAMED_BUFFERS_IN_ARRAY 2 // must be > 1!
625#define MIN_DRAWS_IN_SINGLE_BUFFER 16
626
627template <typename BaseType, uint32 Stride>
629{
630public:
631
634
635 void Init( uint32 InitialBufferSize )
636 {
637 for( int32 BufferIndex = 0; BufferIndex < MAX_STREAMED_BUFFERS_IN_ARRAY; ++BufferIndex )
638 {
639 Buffer[BufferIndex] = new BaseType(Stride, InitialBufferSize, BUF_Volatile, NULL, true);
640 }
641 CurrentBufferIndex = 0;
642 CurrentOffset = 0;
643 LastOffset = 0;
644 MinNeededBufferSize = InitialBufferSize / MIN_DRAWS_IN_SINGLE_BUFFER;
645 }
646
647 void Cleanup( void )
648 {
649 for( int32 BufferIndex = 0; BufferIndex < MAX_STREAMED_BUFFERS_IN_ARRAY; ++BufferIndex )
650 {
651 Buffer[BufferIndex].SafeRelease();
652 }
653 }
654
656 {
657 check(!Buffer[CurrentBufferIndex]->IsLocked());
658 DataSize = Align(DataSize, (1<<8)); // to keep the speed up, let's start data for each next draw at 256-byte aligned offset
659
660 // Keep our dynamic buffers at least MIN_DRAWS_IN_SINGLE_BUFFER times bigger than max single request size
661 uint32 NeededBufSize = Align( MIN_DRAWS_IN_SINGLE_BUFFER * DataSize, (1 << 20) ); // 1MB increments
662 if (NeededBufSize > MinNeededBufferSize)
663 {
664 MinNeededBufferSize = NeededBufSize;
665 }
666
667 // Check if we need to switch buffer, as the current draw data won't fit in current one
668 bool bDiscard = false;
669 if (Buffer[CurrentBufferIndex]->GetSize() < CurrentOffset + DataSize)
670 {
671 // We do.
672 ++CurrentBufferIndex;
673 if (CurrentBufferIndex == MAX_STREAMED_BUFFERS_IN_ARRAY)
674 {
675 CurrentBufferIndex = 0;
676 }
677 CurrentOffset = 0;
678
679 // Check if we should extend the next buffer, as max request size has changed
680 if (MinNeededBufferSize > Buffer[CurrentBufferIndex]->GetSize())
681 {
682 Buffer[CurrentBufferIndex].SafeRelease();
683 Buffer[CurrentBufferIndex] = new BaseType(Stride, MinNeededBufferSize, BUF_Volatile);
684 }
685
686 bDiscard = true;
687 }
688
689 LastOffset = CurrentOffset;
690 CurrentOffset += DataSize;
691
692 return Buffer[CurrentBufferIndex]->LockWriteOnlyUnsynchronized(LastOffset, DataSize, bDiscard);
693 }
694
695 void Unlock( void )
696 {
697 check(Buffer[CurrentBufferIndex]->IsLocked());
698 Buffer[CurrentBufferIndex]->Unlock();
699 }
700
701 BaseType* GetPendingBuffer( void ) { return Buffer[CurrentBufferIndex]; }
702 uint32 GetPendingOffset( void ) { return LastOffset; }
703
704private:
706 uint32 CurrentBufferIndex;
707 uint32 CurrentOffset;
708 uint32 LastOffset;
709 uint32 MinNeededBufferSize;
710};
711
730
733
752
753
759{
761
762public:
763
765
767
773
780 );
781
785
789
795
801
806
807 virtual ~FOpenGLBoundShaderState();
808};
809
811{
812private:
814 FCriticalSection TextureLRULock;
815
816 static FORCEINLINE_DEBUGGABLE FOpenGLTextureLRUContainer& GetLRUContainer()
817 {
818 const int32 MaxNumLRUs = 10000;
820 return TextureLRU;
821 }
822
823public:
824
826 {
828 return Lru;
829 }
830 uint32 Num() const { return GetLRUContainer().Num(); }
831
835 void TickEviction();
837};
839{
840public:
844
848
849#if GLDEBUG_LABELS_ENABLED
854#else
857#endif
858
859 void SetMipData(uint32 MipIndex, const void* Data, uint32 Bytes);
861
862 void CloneMipData(const FTextureEvictionParams& Src, uint32 NumMips, int32 SrcOffset, int DstOffset);
863
865 {
866 uint32 TotalAllocated = 0;
867 for (const auto& MipData : MipImageData)
868 {
869 TotalAllocated += MipData.Num();
870 }
871 return TotalAllocated;
872 }
873
874 bool AreAllMipsPresent() const
875 {
876 bool bRet = MipImageData.Num() > 0;
877 for (const auto& MipData : MipImageData)
878 {
879 bRet = bRet && MipData.Num() > 0;
880 }
881 return bRet;
882 }
883};
884
906
908{
909public:
911 : FRHITextureCreateDesc(CreateDesc)
912 , FOpenGLTextureDesc(CreateDesc)
913 {
914 }
915};
916
918{
919 // Prevent copying
920 FOpenGLTexture(FOpenGLTexture const&) = delete;
921 FOpenGLTexture& operator = (FOpenGLTexture const&) = delete;
922
923public:
924 // Standard constructor.
925 UE_API explicit FOpenGLTexture(FOpenGLTextureCreateDesc const& CreateDesc);
926#if PLATFORM_ANDROID
927 // Constructor for external hardware buffer.
929#endif
930
931 // Constructor for external resources (RHICreateTexture2DFromResource etc).
932 UE_API explicit FOpenGLTexture(FOpenGLTextureCreateDesc const& CreateDesc, GLuint Resource);
933
934 // Constructor for RHICreateAliasedTexture
937
938 UE_API virtual ~FOpenGLTexture();
939
940 UE_API void Initialize(FRHICommandListBase& RHICmdList);
942
944 {
945 TryRestoreGLResource();
946 return Resource;
947 }
948
950 {
952 TryRestoreGLResource();
953 return Resource;
954 }
955
956 // GetRawResourceName - A const accessor to the resource name, this could potentially be an evicted resource.
957 // It will not trigger the GL resource's creation.
959 {
960 return Resource;
961 }
962
963 // GetRawResourceNameRef - A const accessor to the resource name, this could potentially be an evicted resource.
964 // It will not trigger the GL resource's creation.
966 {
967 return Resource;
968 }
969
971 {
973 Resource = InResource;
974 }
975
977
978 virtual void* GetTextureBaseRHI() override final
979 {
980 return this;
981 }
982
987 UE_API void* Lock(uint32 MipIndex, uint32 ArrayIndex, EResourceLockMode LockMode, uint32& DestStride);
988
993
995 UE_API void Unlock(uint32 MipIndex, uint32 ArrayIndex);
996
998 virtual void* GetNativeResource() const override
999 {
1000 // this must become a full GL resource here, calling the non-const GetResourceRef ensures this.
1001 return const_cast<void*>(reinterpret_cast<const void*>(&const_cast<FOpenGLTexture*>(this)->GetResourceRef()));
1002 }
1003
1009 {
1010 return bAllocatedStorage[MipIndex * (bCubemap ? 6 : 1) + FaceIndex];
1011 }
1013 {
1014 bAllocatedStorage[MipIndex * (bCubemap ? 6 : 1) + FaceIndex] = true;
1015 }
1016
1017 // Set allocated storage state for all mip/faces
1019 {
1020 bAllocatedStorage.Init(bInAllocatedStorage, this->GetNumMips() * (bCubemap ? 6 : 1));
1021 }
1022
1026 UE_API void CloneViaCopyImage(FOpenGLTexture* Src, uint32 InNumMips, int32 SrcOffset, int32 DstOffset);
1027
1031 UE_API void Resolve(uint32 MipIndex, uint32 ArrayIndex);
1032
1033 // Texture eviction
1035 UE_API bool CanBeEvicted();
1038
1039private:
1040 static UE_API void UpdateTextureStats(FOpenGLTexture* Texture, bool bAllocating);
1041
1042 void TryRestoreGLResource()
1043 {
1045 {
1048 {
1050 }
1051 else
1052 {
1053 if(CanBeEvicted())
1054 {
1056 }
1057 }
1058 }
1059 }
1060
1061 UE_API void DeleteGLResource();
1062
1063 UE_API void FillGLTextureImage(const FOpenGLTextureFormat& GLFormat, bool bSRGB, uint32 MipIndex, uint32 ArrayIndex, const FUintVector3& MipExtents, const void* BufferOrPBOOffset, size_t ImageSize);
1064
1065public:
1067 {
1068 FRHITextureDesc const& Desc = GetDesc();
1069
1070 return Desc.IsTexture3D()
1071 ? Desc.Depth
1072 : Desc.ArraySize;
1073 }
1074
1075private:
1077 GLuint Resource = GL_NONE;
1078
1079public:
1081 GLenum const Target = 0;
1082
1085
1087
1088 // Pointer to current sampler state in this unit
1090
1092
1094
1095#if PLATFORM_ANDROID
1096 // The image created from an external hardware buffer.
1098#endif //PLATFORM_ANDROID
1099
1100private:
1102 TBitArray<TInlineAllocator<1> > bAllocatedStorage;
1103
1104public:
1106
1107public:
1111 uint8 const bCubemap : 1;
1114 uint8 const bAlias : 1;
1116};
1117
1118#if RHI_NEW_GPU_PROFILER
1119
1120struct FOpenGLProfiler
1121{
1122 struct FCalibration
1123 {
1124 // FPlatformTime::Cycles64()
1125 int64 CPUTimestamp = 0;
1126 int64 CPUFrequency = 0;
1127
1128 // The GL timestamp as queried directly from the driver by the CPU
1129 int64 GLTimestamp = 0;
1130
1131 // Frequency of the GLTimestamp clock
1132 static constexpr int64 GLFrequency = 1'000'000'000; // one tick per nanosecond
1133 };
1134
1135 struct FFrame
1136 {
1139
1140 class FOpenGLRenderQuery* EndWorkQuery = nullptr;
1142
1143 // True if this frame contained any timestamp queries which the driver flagged as disjoint.
1144 // If this happens, we discard all the timestamp events from this frame, leaving only the
1145 // frame boundary, since the timing will be unreliable.
1146 bool bDisjoint = false;
1147
1148 FFrame(FOpenGLProfiler& Profiler);
1149 };
1150
1151 bool bEnabled = false;
1152
1155
1157
1158 TOptional<uint32> ExternalGPUTime;
1159
1160 FOpenGLRenderQuery* GetQuery();
1162
1164
1165 void Setup();
1166 void Shutdown();
1167
1168 void EndFrame(FDynamicRHI::FRHIEndFrameArgs const& Args);
1169
1170 template <typename TEventType, typename... TArgs>
1171 TEventType& EmplaceEvent(TArgs&&... Args)
1172 {
1173 return Current->EventStream.Emplace<TEventType>(Forward<TArgs>(Args)...);
1174 }
1175};
1176
1177#endif
1178
1180{
1181public:
1182 enum class EType : uint8
1183 {
1184 Timestamp,
1185 Occlusion,
1186 #if RHI_NEW_GPU_PROFILER
1187 Profiler,
1188 #else
1189 Disjoint,
1190 #endif
1191
1192 Num
1193 };
1194
1195#if RHI_NEW_GPU_PROFILER == 0
1196 static constexpr uint64 InvalidDisjointMask = 0x8000000000000000;
1197#endif
1198
1199private:
1200 // Render queries that should be polled by the RHI thread.
1201 struct FActiveQueries
1202 {
1203 FOpenGLRenderQuery* First = nullptr;
1204 FOpenGLRenderQuery* Last = nullptr;
1205 int32 Count = 0;
1206 } static ActiveQueries;
1207
1208 struct FQueryPool : public TStaticArray<TArray<GLuint>, (uint32)EType::Num>
1209 {
1211 } static PooledQueries;
1212
1213 // Linked list pointers. Used to build a list of "active" queries, i.e. queries that need data to be polled from the GPU.
1214 FOpenGLRenderQuery** Prev = nullptr;
1215 FOpenGLRenderQuery* Next = nullptr;
1216
1217 uint64 Result = 0;
1218
1220 GLuint Resource = 0;
1221
1222 // Additional data used for profiler timestamps
1223 uint64* Target = nullptr;
1224
1225protected:
1227
1228 std::atomic<uint8> LastCachedBOPCounter = 0;
1231
1232public:
1236
1238
1239 void AcquireGlQuery();
1240 void ReleaseGlQuery();
1241
1242 bool IsLinked() const { return Prev != nullptr; }
1243
1244 void Begin();
1245 void End(uint64* InTarget = nullptr);
1246
1248 {
1249 return Result;
1250 }
1251
1252 bool CacheResult(bool bWait);
1253
1254 static bool PollQueryResults(FOpenGLRenderQuery* TargetQuery = nullptr);
1255 static void Cleanup();
1256
1257private:
1258 void Link();
1259 void Unlink();
1260
1261 void SetResult(uint64 Value);
1262
1263 bool IsCached();
1264};
1265
1267{
1268public:
1272
1274 {
1275 TOPCounter++;
1276 }
1277
1278 bool GetResult(bool bWait, uint64& OutResult);
1279};
1280
1281class FOpenGLView : public TIntrusiveLinkedList<FOpenGLView>
1282{
1283public:
1284 virtual void UpdateView() = 0;
1285};
1286
1288{
1289public:
1292
1294
1295 void UpdateView() override;
1296
1302
1304 {
1305 return IsBuffer() ? GetBuffer()->GetSize() : 0;
1306 }
1307
1312
1314 {
1315 return 0;
1316 }
1317
1318private:
1319 void Invalidate();
1320 bool OwnsResource = false;
1321};
1322
1324{
1325public:
1328
1330
1331 void UpdateView() override;
1332
1336
1338
1339private:
1340 void Invalidate();
1341 bool OwnsResource = false;
1342};
1343
1345
1348{
1349public:
1353
1355 void IssueEvent();
1356
1358 void WaitForCompletion();
1359
1360private:
1361 UGLsync Sync = {};
1362};
1363
1365{
1366public:
1367
1370
1372
1373 // Accessors.
1374 FIntPoint GetSizeXY() const { return FIntPoint(SizeX, SizeY); }
1375 FOpenGLTexture* GetBackBuffer() const { return BackBuffer; }
1376 bool IsFullscreen( void ) const { return bIsFullscreen; }
1377
1378 virtual void WaitForFrameEventCompletion() override;
1379 virtual void IssueFrameEvent() override;
1380
1381 virtual void* GetNativeWindow(void** AddParam) const override;
1382
1383 struct FPlatformOpenGLContext* GetGLContext() const { return OpenGLContext; }
1384 FOpenGLDynamicRHI* GetOpenGLRHI() const { return OpenGLRHI; }
1385
1387 {
1388 CustomPresent = InCustomPresent;
1389 }
1390 FRHICustomPresent* GetCustomPresent() const { return CustomPresent.GetReference(); }
1391private:
1392
1393 friend class FOpenGLDynamicRHI;
1394
1395 FOpenGLDynamicRHI* OpenGLRHI;
1396 struct FPlatformOpenGLContext* OpenGLContext;
1397 uint32 SizeX;
1398 uint32 SizeY;
1399 bool bIsFullscreen;
1400 EPixelFormat PixelFormat;
1401 bool bIsValid;
1403 TUniquePtr<FOpenGLEventQuery> FrameSyncEvent;
1404 FCustomPresentRHIRef CustomPresent;
1405};
1406
1407class FOpenGLGPUFence final : public FRHIGPUFence
1408{
1409private:
1410 struct FGLSync
1411 {
1412 // The graph event to trigger when the sync is resolved.
1413 FGraphEventRef Event;
1414
1415 // The GL API sync object to poll / wait on.
1416 UGLsync GLSync;
1417
1418 FGLSync() = default;
1419 FGLSync(FGraphEventRef Event, UGLsync GLSync)
1420 : Event(MoveTemp(Event))
1421 , GLSync(GLSync)
1422 {}
1423 };
1424
1426 static void PollFencesUntil(FGraphEvent* Target);
1427
1428 FGraphEventRef Event;
1429
1430public:
1431 FOpenGLGPUFence(FName InName);
1432
1433 void Clear() override;
1434 bool Poll() const override;
1435 void Wait(FRHICommandListImmediate& RHICmdList, FRHIGPUMask GPUMask) const override;
1436
1438
1439 static void PollFences()
1440 {
1441 PollFencesUntil(nullptr);
1442 }
1443};
1444
1446{
1447 friend class FOpenGLDynamicRHI;
1448public:
1453
1454 ~FOpenGLStagingBuffer() override;
1455
1456 // Locks the shadow of VertexBuffer for read. This will stall the RHI thread.
1457 void *Lock(uint32 Offset, uint32 NumBytes) override;
1458
1459 // Unlocks the shadow. This is an error if it was not locked previously.
1460 void Unlock() override;
1461
1462 uint64 GetGPUSizeBytes() const override { return ShadowSize; }
1463private:
1464 void Initialize();
1465
1467 uint32 ShadowSize;
1468 void* Mapping;
1469};
1470
1471template<class T>
1473{
1474};
1475template<>
1480template<>
1485template<>
1490template<>
1495template<>
1500template<>
1505template<>
1510template<>
1515template<>
1520template<>
1525template<>
1530template<>
1535template<>
1540
1541template<>
1546
1547#undef UE_API
#define NULL
Definition oodle2base.h:134
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define GL_TEXTURE_BUFFER
Definition AndroidOpenGLPlatform.h:64
GLsync UGLsync
Definition AndroidOpenGLPlatform.h:11
#define check(expr)
Definition AssertionMacros.h:314
#define checkNoEntry()
Definition AssertionMacros.h:316
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define FORCEINLINE_DEBUGGABLE
Definition CoreMiscDefines.h:74
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
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
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
#define DECLARE_CYCLE_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:679
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
bool IsValidRef(const FVertexBufferAndSRV &Buffer)
Definition GPUSkinVertexFactory.h:92
void Init()
Definition LockFreeList.h:4
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
#define LLM_SCOPED_PAUSE_TRACKING_WITH_ENUM_AND_AMOUNT(...)
Definition LowLevelMemTracker.h:1110
FInt32Point FIntPoint
Definition MathFwd.h:124
TOpenGLBuffer< FOpenGLBasePixelBuffer > FOpenGLPixelBuffer
Definition OpenGLResources.h:554
TOpenGLBuffer< FOpenGLBaseBuffer > FOpenGLBuffer
Definition OpenGLResources.h:555
TArray< ANSICHAR > FAnsiCharArray
Definition OpenGLResources.h:39
#define UE_API
Definition OpenGLResources.h:34
#define SCOPE_CYCLE_COUNTER_DETAILED(Stat)
Definition OpenGLResources.h:72
#define MAX_STREAMED_BUFFERS_IN_ARRAY
Definition OpenGLResources.h:624
TRefCountPtr< FOpenGLEUniformBufferData > FOpenGLEUniformBufferDataRef
Definition OpenGLResources.h:574
void OPENGLDRV_API ReleaseOpenGLFramebuffers(FRHITexture *TextureRHI)
Definition OpenGLRenderTarget.cpp:375
#define RESTRICT_SUBDATA_SIZE
Definition OpenGLResources.h:52
TArray< FOpenGLVertexElement, TFixedAllocator< MaxVertexElementCount > > FOpenGLVertexElements
Definition OpenGLResources.h:732
#define MIN_DRAWS_IN_SINGLE_BUFFER
Definition OpenGLResources.h:625
#define VERIFY_GL_SCOPE(...)
Definition OpenGLUtil.h:133
EPixelFormat
Definition PixelFormat.h:16
@ SF_NumGraphicsFrequencies
Definition RHIDefinitions.h:219
EBufferUsageFlags
Definition RHIDefinitions.h:892
@ MaxVertexElementCount
Definition RHIDefinitions.h:276
#define BUF_Volatile
Definition RHIDefinitions.h:982
EResourceLockMode
Definition RHIDefinitions.h:785
#define BUF_AnyDynamic
Definition RHIDefinitions.h:998
EUniformBufferValidation
Definition RHIDefinitions.h:546
ERenderQueryType
Definition RHIDefinitions.h:258
@ RQT_Occlusion
Definition RHIDefinitions.h:262
@ ShadowBuffer
Indicates this buffer is a full object's memory.
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint32 Offset
Definition VulkanMemory.cpp:4033
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 TaskGraphInterfaces.h:471
Definition NameTypes.h:617
Definition OpenGLResources.h:535
void UpdateBufferStats(bool bAllocating)
Definition OpenGLResources.h:544
FOpenGLBaseBuffer(const FRHIBufferCreateDesc &InCreateDesc)
Definition OpenGLResources.h:537
Definition OpenGLResources.h:503
uint32 GetSize() const
Definition OpenGLResources.h:510
void UpdateBufferStats(bool bAllocating)
Definition OpenGLResources.h:528
const FRHIBufferDesc & GetDesc() const
Definition OpenGLResources.h:509
void TakeOwnership(FOpenGLBasePixelBuffer &Other)
Definition OpenGLResources.h:513
FOpenGLBasePixelBuffer(const FRHIBufferCreateDesc &CreateDesc)
Definition OpenGLResources.h:505
void ReleaseOwnership()
Definition OpenGLResources.h:519
EBufferUsageFlags GetUsage() const
Definition OpenGLResources.h:511
Definition OpenGLResources.h:759
FOpenGLPixelShader * GetPixelShader()
Definition OpenGLResources.h:796
const TBitArray & GetUAVNeeds(int32 &OutMaxUAVUnitUsed) const
Definition OpenGLShaders.cpp:3046
TRefCountPtr< FOpenGLVertexShader > const VertexShader
Definition OpenGLResources.h:770
TRefCountPtr< FOpenGLPixelShader > const PixelShader
Definition OpenGLResources.h:771
TRefCountPtr< FOpenGLGeometryShader > const GeometryShader
Definition OpenGLResources.h:772
uint16 StreamStrides[MaxVertexElementCount]
Definition OpenGLResources.h:766
FOpenGLVertexShader * GetVertexShader()
Definition OpenGLResources.h:790
virtual ~FOpenGLBoundShaderState()
Definition OpenGLShaders.cpp:3011
FOpenGLGeometryShader * GetGeometryShader()
Definition OpenGLResources.h:802
void GetNumUniformBuffers(int32 NumVertexUniformBuffers[SF_NumGraphicsFrequencies])
Definition OpenGLShaders.cpp:3052
bool RequiresDriverInstantiation()
Definition OpenGLShaders.cpp:3062
int32 MaxTextureStageUsed()
Definition OpenGLShaders.cpp:3035
bool NeedsTextureStage(int32 TextureStageIndex)
Definition OpenGLShaders.cpp:3030
TRefCountPtr< FOpenGLVertexDeclaration > const VertexDeclaration
Definition OpenGLResources.h:769
FOpenGLLinkedProgram *const LinkedProgram
Definition OpenGLResources.h:768
const TBitArray & GetTextureNeeds(int32 &OutMaxTextureStageUsed)
Definition OpenGLShaders.cpp:3040
FCachedBoundShaderStateLink CacheLink
Definition OpenGLResources.h:764
Definition OpenGLResources.h:100
GLenum Type
Definition OpenGLResources.h:107
FOpenGLBufferBase(GLenum Type)
Definition OpenGLResources.h:102
GLuint Resource
Definition OpenGLResources.h:108
void OnBufferDeletion()
Definition OpenGLBuffer.cpp:188
void Bind()
Definition OpenGLBuffer.cpp:182
Definition OpenGLShaderResources.h:262
Definition OpenGLDrv.h:254
Definition OpenGLResources.h:1348
void WaitForCompletion()
Definition OpenGLQuery.cpp:496
~FOpenGLEventQuery()
Definition OpenGLQuery.cpp:538
FOpenGLEventQuery()
Definition OpenGLQuery.cpp:528
void IssueEvent()
Definition OpenGLQuery.cpp:482
Definition OpenGLResources.h:1408
static void PollFences()
Definition OpenGLResources.h:1439
bool Poll() const override
Definition OpenGLQuery.cpp:817
void WriteGPUFence_TopOfPipe(FRHICommandListBase &RHICmdList)
Definition OpenGLQuery.cpp:897
void Wait(FRHICommandListImmediate &RHICmdList, FRHIGPUMask GPUMask) const override
Definition OpenGLQuery.cpp:822
void Clear() override
Definition OpenGLQuery.cpp:812
Definition OpenGLShaderResources.h:252
Definition OpenGLShaders.cpp:1262
Definition OpenGLShaderResources.h:242
Definition OpenGLResources.h:1267
FOpenGLRenderQuery_RHI(ERenderQueryType QueryType)
Definition OpenGLResources.h:1269
void End_TopOfPipe()
Definition OpenGLResources.h:1273
Definition OpenGLResources.h:1180
uint64 GetResult() const
Definition OpenGLResources.h:1247
void Begin()
Definition OpenGLQuery.cpp:131
EType
Definition OpenGLResources.h:1183
std::atomic< uint8 > LastCachedBOPCounter
Definition OpenGLResources.h:1228
void AcquireGlQuery()
Definition OpenGLQuery.cpp:81
FOpenGLRenderQuery(EType Type)
Definition OpenGLResources.h:1233
bool CacheResult(bool bWait)
Definition OpenGLQuery.cpp:207
static void Cleanup()
Definition OpenGLQuery.cpp:415
void ReleaseGlQuery()
Definition OpenGLQuery.cpp:110
bool IsLinked() const
Definition OpenGLResources.h:1242
uint8 BOPCounter
Definition OpenGLResources.h:1229
EType const Type
Definition OpenGLResources.h:1226
static bool PollQueryResults(FOpenGLRenderQuery *TargetQuery=nullptr)
Definition OpenGLQuery.cpp:378
uint8 TOPCounter
Definition OpenGLResources.h:1230
~FOpenGLRenderQuery()
Definition OpenGLQuery.cpp:16
static constexpr uint64 InvalidDisjointMask
Definition OpenGLResources.h:1196
Definition OpenGLState.h:67
Definition OpenGLResources.h:1324
GLenum Target
Definition OpenGLResources.h:1335
void UpdateView() override
Definition OpenGLUAV.cpp:57
FOpenGLViewableResource * GetBaseResource() const
Definition OpenGLUAV.cpp:50
int32 LimitMip
Definition OpenGLResources.h:1337
virtual ~FOpenGLShaderResourceView()
Definition OpenGLUAV.cpp:159
GLuint Resource
Definition OpenGLResources.h:1334
Definition OpenGLResources.h:1446
FOpenGLStagingBuffer()
Definition OpenGLResources.h:1449
~FOpenGLStagingBuffer() override
Definition OpenGLBuffer.cpp:328
void Unlock() override
Definition OpenGLBuffer.cpp:363
uint64 GetGPUSizeBytes() const override
Definition OpenGLResources.h:1462
Definition OpenGLResources.h:908
FOpenGLTextureCreateDesc(FRHITextureCreateDesc const &CreateDesc)
Definition OpenGLResources.h:910
Definition OpenGLResources.h:886
uint32 MemorySize
Definition OpenGLResources.h:893
uint8 bStreamable
Definition OpenGLResources.h:897
GLenum Target
Definition OpenGLResources.h:890
uint8 bCanCreateAsEvicted
Definition OpenGLResources.h:899
uint8 bDepthStencil
Definition OpenGLResources.h:898
uint8 bArrayTexture
Definition OpenGLResources.h:896
GLenum Attachment
Definition OpenGLResources.h:891
uint8 bCubemap
Definition OpenGLResources.h:895
uint8 bMultisampleRenderbuffer
Definition OpenGLResources.h:901
uint8 bIsPowerOfTwo
Definition OpenGLResources.h:900
Definition OpenGLResources.h:918
uint8 const bMultisampleRenderbuffer
Definition OpenGLResources.h:1115
TArray< TRefCountPtr< FOpenGLPixelBuffer > > PixelBuffers
Definition OpenGLResources.h:1091
GLenum const Target
Definition OpenGLResources.h:1081
uint8 const bCubemap
Definition OpenGLResources.h:1111
UE_API void RestoreEvictedGLResource(bool bAttemptToRetainMips)
Definition OpenGLTexture.cpp:1243
uint8 const bArrayTexture
Definition OpenGLResources.h:1112
GLuint GetResource()
Definition OpenGLResources.h:943
UE_API void Unlock(uint32 MipIndex, uint32 ArrayIndex)
Definition OpenGLTexture.cpp:1119
uint8 const bIsPowerOfTwo
Definition OpenGLResources.h:1108
bool IsEvicted() const
Definition OpenGLResources.h:976
uint32 const MemorySize
Definition OpenGLResources.h:1105
virtual void * GetTextureBaseRHI() override final
Definition OpenGLResources.h:978
UE_API void CloneViaCopyImage(FOpenGLTexture *Src, uint32 InNumMips, int32 SrcOffset, int32 DstOffset)
Definition OpenGLTexture.cpp:1385
UE_API void TryEvictGLResource()
Definition OpenGLTexture.cpp:1310
GLenum const Attachment
Definition OpenGLResources.h:1084
void SetAllocatedStorage(bool bInAllocatedStorage)
Definition OpenGLResources.h:1018
uint8 const bDepthStencil
Definition OpenGLResources.h:1113
virtual void * GetNativeResource() const override
Definition OpenGLResources.h:998
void SetAllocatedStorageForMip(uint32 MipIndex, uint32 FaceIndex)
Definition OpenGLResources.h:1012
uint8 const bCanCreateAsEvicted
Definition OpenGLResources.h:1109
uint32 GetEffectiveSizeZ() const
Definition OpenGLResources.h:1066
GLuint GetRawResourceName() const
Definition OpenGLResources.h:958
UE_API bool CanBeEvicted()
Definition OpenGLTexture.cpp:1359
GLuint & GetResourceRef()
Definition OpenGLResources.h:949
UE_API void Resolve(uint32 MipIndex, uint32 ArrayIndex)
EAliasConstructorParam
Definition OpenGLResources.h:935
@ AliasResource
Definition OpenGLResources.h:935
UE_API void AliasResources(FOpenGLTexture &Texture)
Definition OpenGLTexture.cpp:317
bool GetAllocatedStorageForMip(uint32 MipIndex, uint32 FaceIndex) const
Definition OpenGLResources.h:1008
uint8 const bStreamable
Definition OpenGLResources.h:1110
bool bInStencilTextureMode
Definition OpenGLResources.h:1093
virtual UE_API ~FOpenGLTexture()
Definition OpenGLTexture.cpp:438
TUniquePtr< FTextureEvictionParams > EvictionParamsPtr
Definition OpenGLResources.h:1086
uint8 const bAlias
Definition OpenGLResources.h:1114
UE_API uint32 GetLockSize(uint32 MipIndex, EResourceLockMode LockMode, uint32 &DestStride)
Definition OpenGLTexture.cpp:909
void SetResource(GLuint InResource)
Definition OpenGLResources.h:970
class FOpenGLSamplerState * SamplerState
Definition OpenGLResources.h:1089
const GLuint & GetRawResourceNameRef() const
Definition OpenGLResources.h:965
UE_API void RemoveEvictionData()
Definition OpenGLTexture.cpp:1373
Definition OpenGLResources.h:577
TArray< TRefCountPtr< FRHIResource > > & GetResourceTable()
Definition OpenGLResources.h:619
bool bStreamDraw
Definition OpenGLResources.h:601
FOpenGLEUniformBufferDataRef EmulatedBufferData
Definition OpenGLResources.h:595
uint32 RangeSize
Definition OpenGLResources.h:586
uint32 Offset
Definition OpenGLResources.h:583
GLuint Resource
Definition OpenGLResources.h:580
bool bIsEmulatedUniformBuffer
Definition OpenGLResources.h:604
uint32 UniqueID
Definition OpenGLResources.h:592
void SetLayoutTable(const void *Contents, EUniformBufferValidation Validation)
Definition OpenGLUniformBuffer.cpp:482
~FOpenGLUniformBuffer()
Definition OpenGLUniformBuffer.cpp:434
uint8 * PersistentlyMappedBuffer
Definition OpenGLResources.h:589
void SetGLUniformBufferParams(GLuint InResource, uint32 InOffset, uint8 *InPersistentlyMappedBuffer, uint32 InAllocatedSize, FOpenGLEUniformBufferDataRef InEmulatedBuffer, bool bInStreamDraw)
Definition OpenGLUniformBuffer.cpp:421
bool bOwnsResource
Definition OpenGLResources.h:607
uint32 AllocatedSize
Definition OpenGLResources.h:598
Definition OpenGLResources.h:1288
GLuint Resource
Definition OpenGLResources.h:1297
uint32 GetBufferSize() const
Definition OpenGLResources.h:1303
virtual ~FOpenGLUnorderedAccessView()
Definition OpenGLUAV.cpp:266
FOpenGLViewableResource * GetBaseResource() const
Definition OpenGLUAV.cpp:177
GLint GetLayer() const
Definition OpenGLResources.h:1313
bool IsLayered() const
Definition OpenGLResources.h:1308
GLuint BufferResource
Definition OpenGLResources.h:1298
GLenum Format
Definition OpenGLResources.h:1299
uint8 Level
Definition OpenGLResources.h:1301
void UpdateView() override
Definition OpenGLUAV.cpp:184
uint8 UnrealFormat
Definition OpenGLResources.h:1300
Definition OpenGLResources.h:736
uint16 StreamStrides[MaxVertexElementCount]
Definition OpenGLResources.h:741
FOpenGLVertexElements VertexElements
Definition OpenGLResources.h:739
virtual bool GetInitializer(FVertexDeclarationElementList &Init) override final
Definition OpenGLVertexDeclaration.cpp:181
FOpenGLVertexDeclaration(const FOpenGLVertexElements &InElements, const uint16 *InStrides)
Definition OpenGLResources.h:744
Definition OpenGLShaderResources.h:232
Definition OpenGLResources.h:1282
virtual void UpdateView()=0
Definition OpenGLResources.h:79
~FOpenGLViewableResource()
Definition OpenGLResources.h:81
bool HasLinkedViews() const
Definition OpenGLResources.h:86
void UpdateLinkedViews()
Definition OpenGLUAV.cpp:10
Definition OpenGLResources.h:1365
bool IsFullscreen(void) const
Definition OpenGLResources.h:1376
FRHICustomPresent * GetCustomPresent() const
Definition OpenGLResources.h:1390
~FOpenGLViewport()
Definition OpenGLViewport.cpp:218
virtual void SetCustomPresent(FRHICustomPresent *InCustomPresent) override
Definition OpenGLResources.h:1386
virtual void IssueFrameEvent() override
Definition OpenGLViewport.cpp:244
FOpenGLTexture * GetBackBuffer() const
Definition OpenGLResources.h:1375
struct FPlatformOpenGLContext * GetGLContext() const
Definition OpenGLResources.h:1383
FOpenGLDynamicRHI * GetOpenGLRHI() const
Definition OpenGLResources.h:1384
void Resize(uint32 InSizeX, uint32 InSizeY, bool bInIsFullscreen)
Definition OpenGLViewport.cpp:250
FIntPoint GetSizeXY() const
Definition OpenGLResources.h:1374
virtual void WaitForFrameEventCompletion() override
Definition OpenGLViewport.cpp:238
virtual void * GetNativeWindow(void **AddParam) const override
Definition OpenGLViewport.cpp:292
Definition RHIResources.h:733
Definition RHIResources.h:1581
const FRHIBufferDesc & GetDesc() const
Definition RHIResources.h:1589
uint32 GetSize() const
Definition RHIResources.h:1595
Definition RHICommandList.h:455
void * AllocCopy(const void *InSourceData, int64 AllocSize, int64 Alignment)
Definition RHICommandList.h:527
void EnqueueLambda(const TCHAR *LambdaName, LAMBDA &&Lambda)
Definition RHICommandList.h:585
bool IsTopOfPipe() const
Definition RHICommandList.h:658
Definition RHICommandList.h:4626
Definition RHIResources.h:1018
Definition RHIResources.h:4294
Definition RHIResources.h:2387
Definition RHIResources.h:978
Definition RHIResources.h:972
Definition RHIResources.h:2444
Definition RHIResources.h:3304
Definition RHIResources.h:3981
Definition RHIResources.h:2153
uint32 GetNumMips() const
Definition RHIResources.h:2338
virtual const FRHITextureDesc & GetDesc() const
Definition RHIResources.h:2170
Definition RHIResources.h:1232
TArray< TRefCountPtr< FRHIResource > > ResourceTable
Definition RHIResources.h:1255
Definition RHIResources.h:3294
Definition RHIResources.h:725
Definition RHIResources.h:954
FRHITexture * GetTexture() const
Definition RHIResources.h:3265
FRHIViewDesc const ViewDesc
Definition RHIResources.h:3290
bool IsBuffer() const
Definition RHIResources.h:3271
bool IsTexture() const
Definition RHIResources.h:3272
FRHIBuffer * GetBuffer() const
Definition RHIResources.h:3259
Definition RHIResources.h:1265
FName Name
Definition RHIResources.h:1310
Definition RHIResources.h:2515
Definition RefCounting.h:252
Definition SetUtilities.h:95
Definition OpenGLResources.h:811
FOpenGLTexture * GetLeastRecent()
Definition OpenGLTexture.cpp:2169
void TickEviction()
Definition OpenGLTexture.cpp:2107
uint32 Num() const
Definition OpenGLResources.h:830
static FORCEINLINE_DEBUGGABLE FTextureEvictionLRU & Get()
Definition OpenGLResources.h:825
void Touch(FOpenGLTexture *TextureBase)
Definition OpenGLTexture.cpp:2159
Definition OpenGLResources.h:839
uint32 bHasRestored
Definition OpenGLResources.h:845
~FTextureEvictionParams()
Definition OpenGLTexture.cpp:2181
void CloneMipData(const FTextureEvictionParams &Src, uint32 NumMips, int32 SrcOffset, int DstOffset)
Definition OpenGLTexture.cpp:2216
bool AreAllMipsPresent() const
Definition OpenGLResources.h:874
FAnsiString & GetDebugLabelName()
Definition OpenGLResources.h:853
void ReleaseMipData(uint32 RetainMips)
Definition OpenGLTexture.cpp:2236
void SetMipData(uint32 MipIndex, const void *Data, uint32 Bytes)
Definition OpenGLTexture.cpp:2197
uint32 FrameLastRendered
Definition OpenGLResources.h:847
FAnsiString TextureDebugName
Definition OpenGLResources.h:850
void SetDebugLabelName(const ANSICHAR *TextureDebugNameIn)
Definition OpenGLResources.h:852
TArray< TArray< uint8 > > MipImageData
Definition OpenGLResources.h:843
uint32 GetTotalAllocated() const
Definition OpenGLResources.h:864
FSetElementId LRUNode
Definition OpenGLResources.h:846
void SetDebugLabelName(const FAnsiString &TextureDebugNameIn)
Definition OpenGLResources.h:851
Definition Array.h:670
UE_FORCEINLINE_HINT SizeType AddUninitialized()
Definition Array.h:1664
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize(void) const
Definition Array.h:1059
void Empty(SizeType Slack=0)
Definition Array.h:2273
Definition List.h:349
Definition OpenGLResources.h:116
bool IsDynamic() const
Definition OpenGLResources.h:419
uint8 * LockWriteOnlyUnsynchronized(uint32 InOffset, uint32 InSize, bool bDiscard)
Definition OpenGLResources.h:272
bool IsLocked() const
Definition OpenGLResources.h:420
void TakeOwnership(TOpenGLBuffer &Other)
Definition OpenGLResources.h:435
void Update(void *InData, uint32 InOffset, uint32 InSize, bool bDiscard)
Definition OpenGLResources.h:407
virtual ~TOpenGLBuffer()
Definition OpenGLResources.h:192
void ReleaseOwnership()
Definition OpenGLResources.h:455
bool IsLockReadOnly() const
Definition OpenGLResources.h:421
uint8 * Lock(uint32 InOffset, uint32 InSize, bool bReadOnly, bool bDiscard)
Definition OpenGLResources.h:197
void * GetLockedBuffer() const
Definition OpenGLResources.h:422
void ReleaseCachedBuffer()
Definition OpenGLResources.h:424
TOpenGLBuffer(FRHICommandListBase *RHICmdList, GLenum InType, const FRHIBufferCreateDesc &CreateDesc, const void *InData)
Definition OpenGLResources.h:150
void Unlock()
Definition OpenGLResources.h:344
Definition OpenGLResources.h:629
virtual ~TOpenGLStreamedBufferArray(void)
Definition OpenGLResources.h:633
uint32 GetPendingOffset(void)
Definition OpenGLResources.h:702
TOpenGLStreamedBufferArray(void)
Definition OpenGLResources.h:632
BaseType * GetPendingBuffer(void)
Definition OpenGLResources.h:701
uint8 * Lock(uint32 DataSize)
Definition OpenGLResources.h:655
void Init(uint32 InitialBufferSize)
Definition OpenGLResources.h:635
void Unlock(void)
Definition OpenGLResources.h:695
void Cleanup(void)
Definition OpenGLResources.h:647
Definition PsoLruCache.h:16
int32 Num() const
Definition PsoLruCache.h:324
Definition Queue.h:48
Definition RefCounting.h:454
UE_FORCEINLINE_HINT ReferencedType * GetReference() const
Definition RefCounting.h:584
UE_FORCEINLINE_HINT void SafeRelease()
Definition RefCounting.h:599
Definition StaticArray.h:26
constexpr InElementType & operator[](uint32 Index)
Definition StaticArray.h:57
Definition UniquePtr.h:107
bool IsValid() const
Definition UniquePtr.h:280
Definition GPUProfiler.h:310
Definition OpenGLResources.h:56
void UpdateUniformBufferStats(int64 BufferSize, bool bAllocating)
Definition OpenGLUtil.cpp:166
void UpdateBufferStats(const FRHIBufferDesc &BufferDesc, bool bAllocating)
Definition OpenGLUtil.cpp:171
Definition OpenGLBuffer.cpp:16
int32 MaxSubDataSize
Definition OpenGLCommands.cpp:65
int32 bUseBufferDiscard
Definition OpenGLCommands.cpp:81
int32 bUseMapBuffer
Definition OpenGLCommands.cpp:47
int32 bUseStagingBuffer
Definition OpenGLBuffer.cpp:20
Definition DynamicRHI.h:238
Definition Stack.h:114
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
Definition OpenGLResources.h:558
FOpenGLEUniformBufferData(uint32 SizeInBytes)
Definition OpenGLResources.h:559
TArray< uint32 > Data
Definition OpenGLResources.h:572
~FOpenGLEUniformBufferData()
Definition OpenGLResources.h:567
Definition OpenGLDrvPrivate.h:227
Definition OpenGLResources.h:713
GLuint Offset
Definition OpenGLResources.h:716
GLenum Type
Definition OpenGLResources.h:714
GLuint Divisor
Definition OpenGLResources.h:718
uint8 Padding
Definition OpenGLResources.h:723
uint8 AttributeIndex
Definition OpenGLResources.h:721
FOpenGLVertexElement()
Definition OpenGLResources.h:725
uint8 bShouldConvertToFloat
Definition OpenGLResources.h:722
GLuint StreamIndex
Definition OpenGLResources.h:715
GLuint HashStride
Definition OpenGLResources.h:719
uint8 bNormalized
Definition OpenGLResources.h:720
GLuint Size
Definition OpenGLResources.h:717
Definition LinuxOpenGLPlatform.cpp:39
Definition RHIResources.h:1417
Definition RHIResources.h:1321
static FRHIBufferDesc Null()
Definition RHIResources.h:1349
uint32 Size
Definition RHIResources.h:1323
EBufferUsageFlags Usage
Definition RHIResources.h:1329
bool IsNull() const
Definition RHIResources.h:1354
Definition MultiGPU.h:33
Definition RHIResources.h:1938
Definition RHIResources.h:1689
ETextureDimension Dimension
Definition RHIResources.h:1871
uint16 Depth
Definition RHIResources.h:1859
uint16 ArraySize
Definition RHIResources.h:1862
bool IsTexture3D() const
Definition RHIResources.h:1795
Definition RHIResources.h:1150
Definition RHIResources.h:2648
static int32 Strlen(const CharType *String)
Definition CString.h:1047
FOpenGLBoundShaderState TConcreteType
Definition OpenGLResources.h:1513
FOpenGLBuffer TConcreteType
Definition OpenGLResources.h:1528
FOpenGLComputeShader TConcreteType
Definition OpenGLResources.h:1508
FOpenGLGPUFence TConcreteType
Definition OpenGLResources.h:1478
FOpenGLGeometryShader TConcreteType
Definition OpenGLResources.h:1498
FOpenGLPixelShader TConcreteType
Definition OpenGLResources.h:1503
FOpenGLRenderQuery_RHI TConcreteType
Definition OpenGLResources.h:1518
FOpenGLShaderResourceView TConcreteType
Definition OpenGLResources.h:1533
FOpenGLStagingBuffer TConcreteType
Definition OpenGLResources.h:1483
FOpenGLUniformBuffer TConcreteType
Definition OpenGLResources.h:1523
FOpenGLUnorderedAccessView TConcreteType
Definition OpenGLResources.h:1538
FOpenGLVertexDeclaration TConcreteType
Definition OpenGLResources.h:1488
FOpenGLVertexShader TConcreteType
Definition OpenGLResources.h:1493
FOpenGLViewport TConcreteType
Definition OpenGLResources.h:1544
Definition OpenGLResources.h:1473
Definition Optional.h:131
Definition IntPoint.h:25
Definition IntVector.h:22