Files
FlaxEngine/Source/Engine/GraphicsDevice/OpenGL/Win32/Win32ContextOGL.h
2020-12-07 23:40:54 +01:00

81 lines
1.9 KiB
C++

// Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.
#pragma once
#include "../IncludeOpenGLHeaders.h"
#if GRAPHICS_API_OPENGL && PLATFORM_WINDOWS
#include "Engine/Core/Common.h"
class Win32GPUSwapChainOGL;
class Win32ContextOGL
{
public:
// Platform specific OpenGL context.
struct Data
{
HWND WindowHandle;
HDC DeviceContext;
HGLRC OpenGLContext;
bool bReleaseWindowOnDestroy;
int32 SyncInterval;
GLuint ViewportFramebuffer;
GLuint VertexArrayObject; // one has to be generated and set for each context (OpenGL 3.2 Core requirements)
GLuint BackBufferResource; // TODO: use it
GLenum BackBufferTarget; // TODO: use it
~Data()
{
if (OpenGLContext)
{
ContextMakeCurrent(NULL, NULL);
wglDeleteContext(OpenGLContext);
}
ReleaseDC(WindowHandle, DeviceContext);
ASSERT(bReleaseWindowOnDestroy);
DestroyWindow(WindowHandle);
}
};
static PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;
public:
static HGLRC OpenGLContext;
static HDC OpenGLContextWin;
static Array<Win32GPUSwapChainOGL*, FixedAllocation<32>> ChildWindows;
public:
static bool IsReady()
{
return OpenGLContext != 0;
}
static void ContextMakeCurrent(HDC dc, HGLRC rc)
{
BOOL result = wglMakeCurrent(dc, rc);
if (!result)
{
result = wglMakeCurrent(nullptr, nullptr);
}
ASSERT(result);
}
static HGLRC GetCurrentContext()
{
return wglGetCurrentContext();
}
static void PlatformInitPixelFormatForDevice(HDC context);
static void CreateDummyGLWindow(Data* context);
static void PlatformCreateOpenGLContextCore(Data* result, int majorVersion, int minorVersion, HGLRC parentContext);
static void PlatformCreateOpenGLContextCore(HGLRC* result, HDC deviceContext, int majorVersion, int minorVersion, HGLRC parentContext);
static void PlatformCreateOpenGLContextCore(HGLRC* result, HDC deviceContext, HGLRC parentContext);
};
#endif