UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
OpenGLDrvPrivate.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 OpenGLDrvPrivate.h: Private OpenGL RHI definitions.
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "Stats/Stats.h"
11#include "RHI.h"
12#include "RenderResource.h"
13#include "OpenGLDrv.h"
14
15#define SUBALLOCATED_CONSTANT_BUFFER 0
16
17#define GL_CHECK(x) x; do { GLint Err = glGetError(); if (Err != 0) {FPlatformMisc::LowLevelOutputDebugStringf(TEXT("(%s:%d) GL_CHECK Failed '%s'! %d (%x)\n"), ANSI_TO_TCHAR(__FILE__), __LINE__, ANSI_TO_TCHAR( #x ), Err, Err); check(!Err);}} while (0)
18
19//
20// #if !defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) && !(defined(_MSC_VER) && _MSC_VER >= 1900)
21// #define LOG_AND_GET_GL_INT_TEMP(IntEnum,Default)
22// GLint Value_##IntEnum = Default; if (IntEnum) {glGetIntegerv(IntEnum, &Value_##IntEnum); glGetError();} else {Value_##IntEnum = Default;}
23// UE_LOG(LogRHI, Log, TEXT(" ") ## TEXT(#IntEnum) ## TEXT(": %d"), Value_##IntEnum)
24// #else
25// #define LOG_AND_GET_GL_INT_TEMP(IntEnum,Default) GLint Value_##IntEnum = Default; if (IntEnum) {glGetIntegerv(IntEnum, &Value_##IntEnum); glGetError();} else {Value_##IntEnum = Default;}
26// UE_LOG(LogRHI, Log, TEXT(" " #IntEnum ": %d"), Value_##IntEnum)
27// #endif
28
29#if !defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) && !(defined(_MSC_VER) && _MSC_VER >= 1900)
30#define LOG_AND_GET_GL_INT(IntEnum, Default, Dest) \
31 do \
32 { \
33 Dest = Default; \
34 extern bool GDisableOpenGLDebugOutput; \
35 GDisableOpenGLDebugOutput = true; \
36 glGetIntegerv(IntEnum, &Dest); \
37 GDisableOpenGLDebugOutput = false; \
38 \
39 UE_LOG(LogRHI, Log, TEXT(" ") ## TEXT(#IntEnum) ## TEXT(": %d"), Dest); \
40 } \
41 while (0)
42#else
43 #define LOG_AND_GET_GL_INT(IntEnum, Default, Dest) \
44 do \
45 { \
46 Dest = Default; \
47 extern bool GDisableOpenGLDebugOutput; \
48 GDisableOpenGLDebugOutput = true; \
49 glGetIntegerv(IntEnum, &Dest); \
50 GDisableOpenGLDebugOutput = false; \
51 UE_LOG(LogRHI, Log, TEXT(" " #IntEnum ": %d"), Dest); \
52 } \
53 while (0)
54#endif
55
56#define GET_GL_INT(IntEnum, Default, Dest) \
57 do \
58 { \
59 Dest = Default; \
60 extern bool GDisableOpenGLDebugOutput; \
61 GDisableOpenGLDebugOutput = true; \
62 glGetIntegerv(IntEnum, &Dest); \
63 GDisableOpenGLDebugOutput = false; \
64 } \
65 while (0)
66
92DECLARE_MEMORY_STAT_EXTERN(TEXT("Active Program binary memory (estimate driver use)"), STAT_OpenGLProgramBinaryMemory, STATGROUP_OpenGLRHI, );
96
104
105#if OPENGLRHI_DETAILED_STATS
113#endif
114
115/*------------------------------------------------------------------------------
116 All platforms using OpenGL must implement the following API.
117------------------------------------------------------------------------------*/
118
121
124
130bool PlatformInitOpenGL();
131
137
142
152
157
162
168
173
179
180// Some platforms require flushing and rebinding renderbuffers after context/thread changes
182
187
188// Creates a platform-specific back buffer
190
197
201void PlatformResizeGLContext( FPlatformOpenGLDevice* Device, FPlatformOpenGLContext* Context, uint32 SizeX, uint32 SizeY, bool bFullscreen, bool bWasFullscreen, GLenum BackBufferTarget, GLuint BackBufferResource);
202
203
207void PlatformGetSupportedResolution(uint32 &Width, uint32 &Height);
208
213
218
219// Returns native window handle.
220void* PlatformGetWindow(FPlatformOpenGLContext* Context, void** AddParam);
221
222/*------------------------------------------------------------------------------
223 OpenGL texture format table.
224------------------------------------------------------------------------------*/
225
227{
228 // [0]: without sRGB, [1]: with sRGB
232 bool bCompressed = false;
233 // Reorder to B and R elements using texture swizzle
234 bool bBGRA = false;
235
237
249};
250
252
254{
255 uint32 MipCount = 1;
256 while( Size >>= 1 )
257 {
258 MipCount++;
259 }
260 return MipCount;
261}
262
264{
265 return FindMaxMipmapLevel((Width > Height) ? Width : Height);
266}
267
269{
270 return FindMaxMipmapLevel((Width > Height) ? Width : Height, Depth);
271}
272
274{
275 DrawMode = GL_TRIANGLES;
276 NumElements = InNumPrimitives;
277
278 switch (InPrimitiveType)
279 {
280 case PT_TriangleList:
281 DrawMode = GL_TRIANGLES;
282 NumElements = InNumPrimitives * 3;
283 break;
284 case PT_TriangleStrip:
285 DrawMode = GL_TRIANGLE_STRIP;
286 NumElements = InNumPrimitives + 2;
287 break;
288 case PT_LineList:
289 DrawMode = GL_LINES;
290 NumElements = InNumPrimitives * 2;
291 break;
292 case PT_PointList:
293 DrawMode = GL_POINTS;
294 NumElements = InNumPrimitives;
295 break;
296 default:
297 UE_LOG(LogRHI, Fatal,TEXT("Unsupported primitive type %u"), InPrimitiveType);
298 break;
299 }
300}
301
303{
304 switch (UniformType)
305 {
306 case GL_FLOAT:
307 return sizeof(float);
308 case GL_FLOAT_VEC2:
309 return sizeof(float) * 2;
310 case GL_FLOAT_VEC3:
311 return sizeof(float) * 3;
312 case GL_FLOAT_VEC4:
313 return sizeof(float) * 4;
314
315 case GL_INT:
316 case GL_BOOL:
317 return sizeof(uint32);
318 case GL_INT_VEC2:
319 case GL_BOOL_VEC2:
320 return sizeof(uint32) * 2;
321 case GL_INT_VEC3:
322 case GL_BOOL_VEC3:
323 return sizeof(uint32) * 3;
324 case GL_INT_VEC4:
325 case GL_BOOL_VEC4:
326 return sizeof(uint32) * 4;
327
328 case GL_FLOAT_MAT2:
329 return sizeof(float) * 4;
330 case GL_FLOAT_MAT3:
331 return sizeof(float) * 9;
332 case GL_FLOAT_MAT4:
333 return sizeof(float) * 16;
334 case GL_FLOAT_MAT2x3:
335 return sizeof(float) * 6;
336 case GL_FLOAT_MAT2x4:
337 return sizeof(float) * 8;
338 case GL_FLOAT_MAT3x2:
339 return sizeof(float) * 6;
340 case GL_FLOAT_MAT3x4:
341 return sizeof(float) * 12;
342 case GL_FLOAT_MAT4x2:
343 return sizeof(float) * 8;
344 case GL_FLOAT_MAT4x3:
345 return sizeof(float) * 12;
346
347 case GL_SAMPLER_1D:
348 case GL_SAMPLER_2D:
349 case GL_SAMPLER_3D:
350 case GL_SAMPLER_CUBE:
353 default:
354 return sizeof(uint32);
355 }
356}
357
362{
363 // Allocate dynamic buffers in MB increments.
364 return Align(Size, (1 << 20));
365}
366
371
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define GL_SAMPLER_1D
Definition AndroidOpenGLPlatform.h:52
#define GL_SAMPLER_1D_SHADOW
Definition AndroidOpenGLPlatform.h:55
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define DECLARE_CYCLE_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:679
#define DECLARE_DWORD_COUNTER_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:682
#define DECLARE_DWORD_ACCUMULATOR_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:684
#define DECLARE_MEMORY_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:687
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
int32 PlatformGlGetError()
Definition LinuxOpenGLPlatform.cpp:807
class FOpenGLTexture * PlatformCreateBuiltinBackBuffer(FOpenGLDynamicRHI *OpenGLRHI, uint32 SizeX, uint32 SizeY)
Definition LinuxOpenGLPlatform.cpp:819
void PlatformRenderingContextSetup(FPlatformOpenGLDevice *Device)
Definition LinuxOpenGLPlatform.cpp:512
uint32 CalcDynamicBufferSize(uint32 Size)
Definition OpenGLDrvPrivate.h:361
bool GUseEmulatedUniformBuffers
Definition OpenGLDevice.cpp:52
uint32 FindUniformElementSize(GLenum UniformType)
Definition OpenGLDrvPrivate.h:302
bool PlatformGetAvailableResolutions(FScreenResolutionArray &Resolutions, bool bIgnoreRefreshRate)
Definition LinuxOpenGLPlatform.cpp:609
void * PlatformGetWindow(FPlatformOpenGLContext *Context, void **AddParam)
Definition LinuxOpenGLPlatform.cpp:320
bool PlatformInitOpenGL()
Definition LinuxOpenGLPlatform.cpp:694
void PlatformGetSupportedResolution(uint32 &Width, uint32 &Height)
Definition LinuxOpenGLPlatform.cpp:577
void PlatformNULLContextSetup()
Definition LinuxOpenGLPlatform.cpp:524
FOpenGLTextureFormat OPENGLDRV_API GOpenGLTextureFormats[PF_MAX]
Definition OpenGLDevice.cpp:46
bool PlatformOpenGLThreadHasRenderingContext()
Definition LinuxOpenGLPlatform.cpp:812
bool PlatformCanEnableGPUCapture()
Definition LinuxOpenGLPlatform.cpp:237
void PlatformFlushIfNeeded()
Definition LinuxOpenGLPlatform.cpp:507
void InitDefaultGLContextState(void)
Definition OpenGLDrv.cpp:771
void PlatformResizeGLContext(FPlatformOpenGLDevice *Device, FPlatformOpenGLContext *Context, uint32 SizeX, uint32 SizeY, bool bFullscreen, bool bWasFullscreen, GLenum BackBufferTarget, GLuint BackBufferResource)
Definition LinuxOpenGLPlatform.cpp:537
bool PlatformBlitToViewport(IRHICommandContext &RHICmdContext, FPlatformOpenGLDevice *Device, const FOpenGLViewport &Viewport, uint32 BackbufferSizeX, uint32 BackbufferSizeY, bool bPresent, bool bLockToVsync)
Definition LinuxOpenGLPlatform.cpp:351
void PlatformRestoreDesktopDisplayMode()
Definition LinuxOpenGLPlatform.cpp:689
uint32 FindMaxMipmapLevel(uint32 Size)
Definition OpenGLDrvPrivate.h:253
FPlatformOpenGLContext * PlatformCreateOpenGLContext(FPlatformOpenGLDevice *Device, void *InWindowHandle)
Definition LinuxOpenGLPlatform.cpp:250
void FindPrimitiveType(uint32 InPrimitiveType, uint32 InNumPrimitives, GLenum &DrawMode, GLsizei &NumElements)
Definition OpenGLDrvPrivate.h:273
void PlatformDestroyOpenGLDevice(FPlatformOpenGLDevice *Device)
Definition LinuxOpenGLPlatform.cpp:242
FPlatformOpenGLDevice * PlatformCreateOpenGLDevice()
Definition LinuxOpenGLPlatform.cpp:232
void PlatformDestroyOpenGLContext(FPlatformOpenGLDevice *Device, FPlatformOpenGLContext *Context)
Definition LinuxOpenGLPlatform.cpp:314
@ PF_MAX
Definition PixelFormat.h:111
@ PT_PointList
Definition RHIDefinitions.h:837
@ PT_LineList
Definition RHIDefinitions.h:830
@ PT_TriangleList
Definition RHIDefinitions.h:824
@ PT_TriangleStrip
Definition RHIDefinitions.h:827
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
uint32 Size
Definition VulkanMemory.cpp:4034
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition OpenGLDrv.h:254
Definition OpenGLResources.h:918
Definition OpenGLResources.h:1365
Definition RHIContext.h:693
Definition Array.h:670
Definition OpenGLDrvPrivate.h:227
FOpenGLTextureFormat(GLenum InInternalFormat, GLenum InInternalFormatSRGB, GLenum InFormat, GLenum InType, bool bInCompressed, bool bInBGRA)
Definition OpenGLDrvPrivate.h:238
FOpenGLTextureFormat()=default
bool bCompressed
Definition OpenGLDrvPrivate.h:232
GLenum Format
Definition OpenGLDrvPrivate.h:230
GLenum Type
Definition OpenGLDrvPrivate.h:231
bool bBGRA
Definition OpenGLDrvPrivate.h:234
GLenum InternalFormat[2]
Definition OpenGLDrvPrivate.h:229
Definition LinuxOpenGLPlatform.cpp:39
Definition LinuxOpenGLPlatform.cpp:175