GL context on command processor.
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <xenia/gpu/gl4/gl_context.h>
|
||||
|
||||
#include <poly/assert.h>
|
||||
#include <poly/logging.h>
|
||||
|
||||
namespace xe {
|
||||
@@ -20,17 +21,26 @@ thread_local WGLEWContext* tls_wglew_context_ = nullptr;
|
||||
extern "C" GLEWContext* glewGetContext() { return tls_glew_context_; }
|
||||
extern "C" WGLEWContext* wglewGetContext() { return tls_wglew_context_; }
|
||||
|
||||
GLContext::GLContext() : dc_(nullptr), glrc_(nullptr) {}
|
||||
GLContext::GLContext() : hwnd_(nullptr), dc_(nullptr), glrc_(nullptr) {}
|
||||
|
||||
GLContext::GLContext(HWND hwnd, HGLRC glrc)
|
||||
: hwnd_(hwnd), dc_(nullptr), glrc_(glrc) {
|
||||
dc_ = GetDC(hwnd);
|
||||
}
|
||||
|
||||
GLContext::~GLContext() {
|
||||
wglMakeCurrent(nullptr, nullptr);
|
||||
if (glrc_) {
|
||||
wglDeleteContext(glrc_);
|
||||
}
|
||||
if (dc_) {
|
||||
ReleaseDC(hwnd_, dc_);
|
||||
}
|
||||
}
|
||||
|
||||
bool GLContext::Initialize(HDC dc) {
|
||||
dc_ = dc;
|
||||
bool GLContext::Initialize(HWND hwnd) {
|
||||
hwnd_ = hwnd;
|
||||
dc_ = GetDC(hwnd);
|
||||
|
||||
PIXELFORMATDESCRIPTOR pfd = {0};
|
||||
pfd.nSize = sizeof(pfd);
|
||||
@@ -59,6 +69,7 @@ bool GLContext::Initialize(HDC dc) {
|
||||
|
||||
tls_glew_context_ = &glew_context_;
|
||||
tls_wglew_context_ = &wglew_context_;
|
||||
glewExperimental = GL_TRUE;
|
||||
if (glewInit() != GLEW_OK) {
|
||||
PLOGE("Unable to initialize GLEW");
|
||||
return false;
|
||||
@@ -73,11 +84,10 @@ bool GLContext::Initialize(HDC dc) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int context_flags = WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
|
||||
int context_flags = 0;
|
||||
#if DEBUG
|
||||
context_flags |= WGL_CONTEXT_DEBUG_BIT_ARB;
|
||||
#endif // DEBUG
|
||||
|
||||
#endif // DEBUG
|
||||
int attrib_list[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 4, //
|
||||
WGL_CONTEXT_MINOR_VERSION_ARB, 5, //
|
||||
WGL_CONTEXT_FLAGS_ARB, context_flags, //
|
||||
@@ -99,6 +109,45 @@ bool GLContext::Initialize(HDC dc) {
|
||||
return true;
|
||||
}
|
||||
|
||||
std::unique_ptr<GLContext> GLContext::CreateShared() {
|
||||
assert_not_null(glrc_);
|
||||
|
||||
int context_flags = 0;
|
||||
#if DEBUG
|
||||
context_flags |= WGL_CONTEXT_DEBUG_BIT_ARB;
|
||||
#endif // DEBUG
|
||||
int attrib_list[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 4, //
|
||||
WGL_CONTEXT_MINOR_VERSION_ARB, 5, //
|
||||
WGL_CONTEXT_FLAGS_ARB, context_flags, //
|
||||
0};
|
||||
auto new_glrc = wglCreateContextAttribsARB(dc_, glrc_, attrib_list);
|
||||
if (!new_glrc) {
|
||||
PLOGE("Could not create shared context");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto new_context = std::make_unique<GLContext>(hwnd_, new_glrc);
|
||||
if (!new_context->MakeCurrent()) {
|
||||
PLOGE("Could not make new GL context current");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
glewExperimental = GL_TRUE;
|
||||
if (glewInit() != GLEW_OK) {
|
||||
PLOGE("Unable to initialize GLEW");
|
||||
return nullptr;
|
||||
}
|
||||
if (wglewInit() != GLEW_OK) {
|
||||
PLOGE("Unable to initialize WGLEW");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
new_context->ClearCurrent();
|
||||
MakeCurrent();
|
||||
|
||||
return new_context;
|
||||
}
|
||||
|
||||
bool GLContext::MakeCurrent() {
|
||||
if (!wglMakeCurrent(dc_, glrc_)) {
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user