80 lines
2.1 KiB
C++
80 lines
2.1 KiB
C++
/*
|
|
This file is part of Mitsuba, a physically based rendering system.
|
|
|
|
Copyright (c) 2007-2012 by Wenzel Jakob and others.
|
|
|
|
Mitsuba is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License Version 3
|
|
as published by the Free Software Foundation.
|
|
|
|
Mitsuba is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <mitsuba/hw/wglrenderer.h>
|
|
|
|
MTS_NAMESPACE_BEGIN
|
|
|
|
WGLRenderer::WGLRenderer(WGLSession *session)
|
|
: GLRenderer(session) {
|
|
}
|
|
|
|
WGLRenderer::~WGLRenderer() {
|
|
if (m_initialized)
|
|
shutdown();
|
|
}
|
|
|
|
void WGLRenderer::init(Device *device, Renderer *other) {
|
|
WGLDevice *wglDevice = static_cast<WGLDevice *>(device);
|
|
|
|
if (m_session == NULL) {
|
|
Log(EDebug, "Using an existing WGL context");
|
|
m_context = wglGetCurrentContext();
|
|
if (m_context == NULL)
|
|
Log(EError, "Unable to retrieve the current WGL context!");
|
|
m_borrowed = true;
|
|
} else {
|
|
/* Create a GL context */
|
|
Log(EDebug, "Initializing WGL renderer");
|
|
m_context = wglCreateContext(wglDevice->getDeviceContext());
|
|
|
|
if (other != NULL) {
|
|
Assert(other->getClass() == m_theClass);
|
|
if (wglShareLists(m_context,
|
|
static_cast<WGLRenderer *>(other)->m_context) != TRUE)
|
|
Log(EError, "Unable to set up context sharing: %s",
|
|
lastErrorText().c_str());
|
|
}
|
|
|
|
device->makeCurrent(this);
|
|
m_borrowed = false;
|
|
}
|
|
|
|
GLRenderer::init(device);
|
|
|
|
m_initialized = true;
|
|
}
|
|
|
|
void WGLRenderer::shutdown() {
|
|
GLRenderer::shutdown();
|
|
|
|
if (!m_borrowed) {
|
|
Log(EDebug, "Shutting down WGL Renderer");
|
|
wglDeleteContext(m_context);
|
|
}
|
|
|
|
m_initialized = false;
|
|
}
|
|
|
|
void *WGLRenderer::lookupExtension(const std::string &name) const {
|
|
return (void *) wglGetProcAddress(name.c_str());
|
|
}
|
|
|
|
MTS_IMPLEMENT_CLASS(WGLRenderer, true, GLRenderer)
|
|
MTS_NAMESPACE_END
|