~FScopeContext( void ) { if (!bSameDCAndContext) { // glFlush(); // not needed on Windows, it does flush by itself before switching contexts if (PrevContext) { ContextMakeCurrent(PrevDC,PrevContext); } else { ContextMakeCurrent(NULL,NULL); } } }
void PlatformSharedContextSetup(FPlatformOpenGLDevice* Device) { check(Device && Device->SharedContext.DeviceContext && Device->SharedContext.OpenGLContext); // no need to glFlush() on Windows, it does flush by itself before switching contexts ContextMakeCurrent(Device->SharedContext.DeviceContext, Device->SharedContext.OpenGLContext); }
void PlatformNULLContextSetup() { if (wglGetCurrentDC()) { // no need to glFlush() on Windows, it does flush by itself before switching contexts ContextMakeCurrent(NULL, NULL); } }
void PlatformRenderingContextSetup(FPlatformOpenGLDevice* Device) { check(Device && Device->RenderingContext.DeviceContext && Device->RenderingContext.OpenGLContext); if (GetCurrentContext()) { glFlush(); } if (Device->ViewportContexts.Num() == 1) { // use the HDC of the window, to reduce context swap overhead ContextMakeCurrent(Device->ViewportContexts[0]->DeviceContext, Device->RenderingContext.OpenGLContext); } else { ContextMakeCurrent(Device->RenderingContext.DeviceContext, Device->RenderingContext.OpenGLContext); } }
void PlatformRenderingContextSetup(FPlatformOpenGLDevice* Device) { check(Device && Device->RenderingContext.DeviceContext && Device->RenderingContext.OpenGLContext); if (GetCurrentContext()) { glFlush(); } ContextMakeCurrent(Device->RenderingContext.DeviceContext, Device->RenderingContext.OpenGLContext); }
FScopeContext( FPlatformOpenGLContext* Context ) { check(Context); PrevDC = wglGetCurrentDC(); PrevContext = GetCurrentContext(); bSameDCAndContext = (PrevContext == Context->OpenGLContext) && (PrevDC == Context->DeviceContext); if (!bSameDCAndContext) { // if (PrevContext) // { // glFlush(); // } // no need to glFlush() on Windows, it does flush by itself before switching contexts ContextMakeCurrent(Context->DeviceContext,Context->OpenGLContext); } }
bool PlatformInitOpenGL() { static bool bInitialized = false; static bool bOpenGLSupported = false; if (!bInitialized) { // Disable warning C4191: 'type cast' : unsafe conversion from 'PROC' to 'XXX' while getting GL entry points. #pragma warning(push) #pragma warning(disable:4191) // Create a dummy context so that wglCreateContextAttribsARB can be initialized. FPlatformOpenGLContext DummyContext; PlatformCreateDummyGLWindow(&DummyContext); DummyContext.OpenGLContext = wglCreateContext(DummyContext.DeviceContext); check(DummyContext.OpenGLContext); ContextMakeCurrent(DummyContext.DeviceContext, DummyContext.OpenGLContext); wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB"); if (wglCreateContextAttribsARB) { int MajorVersion = 0; int MinorVersion = 0; ContextMakeCurrent(NULL,NULL); wglDeleteContext(DummyContext.OpenGLContext); PlatformOpenGLVersionFromCommandLine(MajorVersion, MinorVersion); PlatformCreateOpenGLContextCore(&DummyContext, MajorVersion, MinorVersion, NULL); if (DummyContext.OpenGLContext) { bOpenGLSupported = true; ContextMakeCurrent(DummyContext.DeviceContext, DummyContext.OpenGLContext); } else { UE_LOG(LogRHI,Error,TEXT("OpenGL %d.%d not supported by driver"),MajorVersion,MinorVersion); } } if (bOpenGLSupported) { // Retrieve the OpenGL DLL. void* OpenGLDLL = FPlatformProcess::GetDllHandle(TEXT("opengl32.dll")); if (!OpenGLDLL) { UE_LOG(LogRHI,Fatal,TEXT("Couldn't load opengl32.dll")); } // Initialize entry points required by Unreal from opengl32.dll #define GET_GL_ENTRYPOINTS_DLL(Type,Func) Func = (Type)FPlatformProcess::GetDllExport(OpenGLDLL,TEXT(#Func)); ENUM_GL_ENTRYPOINTS_DLL(GET_GL_ENTRYPOINTS_DLL); // Release the OpenGL DLL. FPlatformProcess::FreeDllHandle(OpenGLDLL); // Initialize all entry points required by Unreal. #define GET_GL_ENTRYPOINTS(Type,Func) Func = (Type)wglGetProcAddress(#Func); ENUM_GL_ENTRYPOINTS(GET_GL_ENTRYPOINTS); ENUM_GL_ENTRYPOINTS_OPTIONAL(GET_GL_ENTRYPOINTS); // Restore warning C4191. #pragma warning(pop) // Check that all of the entry points have been initialized. bool bFoundAllEntryPoints = true; #define CHECK_GL_ENTRYPOINTS(Type,Func) if (Func == NULL) { bFoundAllEntryPoints = false; UE_LOG(LogRHI, Warning, TEXT("Failed to find entry point for %s"), TEXT(#Func)); } ENUM_GL_ENTRYPOINTS_DLL(CHECK_GL_ENTRYPOINTS); ENUM_GL_ENTRYPOINTS(CHECK_GL_ENTRYPOINTS); checkf(bFoundAllEntryPoints, TEXT("Failed to find all OpenGL entry points.")); FString VendorName( ANSI_TO_TCHAR((const ANSICHAR*)glGetString(GL_VENDOR) ) ); if ( VendorName.Contains(TEXT("ATI ")) ) { // Workaround for AMD driver not handling GL_SRGB8_ALPHA8 in glTexStorage2D() properly (gets treated as non-sRGB) glTexStorage1D = NULL; glTexStorage2D = NULL; glTexStorage3D = NULL; } } // The dummy context can now be released. if (DummyContext.OpenGLContext) { ContextMakeCurrent(NULL,NULL); wglDeleteContext(DummyContext.OpenGLContext); } ReleaseDC(DummyContext.WindowHandle, DummyContext.DeviceContext); check(DummyContext.bReleaseWindowOnDestroy); DestroyWindow(DummyContext.WindowHandle); } return bOpenGLSupported; }