Issue/525 (#593)

* Add initializeGL and deinitializeGL methods to OpenSpaceModule Call releaseAll from ProgramObjectManager in deinitializeGL to guard against errors when deinitializing assets

* Change removeProgramObject function in RenderEngine to take a non-owning pointer instead of a reference to a unique pointer to make it compatible with the ProgramObjectManager
Update Ghoul repository

* Using ProgramObjectManager in more modules to reduce the number of programs compiled at startup
This commit is contained in:
Alexander Bock
2018-04-10 15:55:52 -04:00
committed by GitHub
parent 34987e9f85
commit 40dbf875c5
55 changed files with 621 additions and 332 deletions
+19 -10
View File
@@ -24,8 +24,8 @@
#include <modules/base/rendering/renderablemodel.h>
#include <modules/base/basemodule.h>
#include <modules/base/rendering/modelgeometry.h>
#include <openspace/documentation/documentation.h>
#include <openspace/documentation/verifier.h>
#include <openspace/engine/configurationmanager.h>
@@ -43,7 +43,8 @@
#include <ghoul/opengl/textureunit.h>
namespace {
const char* KeyGeometry = "Geometry";
constexpr const char* ProgramName = "ModelProgram";
constexpr const char* KeyGeometry = "Geometry";
static const openspace::properties::Property::PropertyInfo TextureInfo = {
"ColorTexture",
@@ -154,10 +155,15 @@ bool RenderableModel::isReady() const {
}
void RenderableModel::initializeGL() {
_programObject = OsEng.renderEngine().buildRenderProgram(
"ModelProgram",
absPath("${MODULE_BASE}/shaders/model_vs.glsl"),
absPath("${MODULE_BASE}/shaders/model_fs.glsl")
_programObject = BaseModule::ProgramObjectManager.requestProgramObject(
ProgramName,
[]() -> std::unique_ptr<ghoul::opengl::ProgramObject> {
return OsEng.renderEngine().buildRenderProgram(
ProgramName,
absPath("${MODULE_BASE}/shaders/model_vs.glsl"),
absPath("${MODULE_BASE}/shaders/model_fs.glsl")
);
}
);
_uniformCache.opacity = _programObject->uniformLocation("opacity");
@@ -188,10 +194,13 @@ void RenderableModel::deinitializeGL() {
}
_texture = nullptr;
if (_programObject) {
OsEng.renderEngine().removeRenderProgram(_programObject);
_programObject = nullptr;
}
BaseModule::ProgramObjectManager.releaseProgramObject(
ProgramName,
[](ghoul::opengl::ProgramObject* p) {
OsEng.renderEngine().removeRenderProgram(p);
}
);
_programObject = nullptr;
}
void RenderableModel::render(const RenderData& data, RendererTasks&) {
+1 -1
View File
@@ -73,7 +73,7 @@ private:
properties::BoolProperty _performShading;
properties::Mat3Property _modelTransform;
std::unique_ptr<ghoul::opengl::ProgramObject> _programObject;
ghoul::opengl::ProgramObject* _programObject;
UniformCache(opacity, directionToSunViewSpace, modelViewTransform,
projectionTransform, performShading, texture) _uniformCache;
+20 -10
View File
@@ -24,6 +24,7 @@
#include <modules/base/rendering/renderableplane.h>
#include <modules/base/basemodule.h>
#include <openspace/documentation/documentation.h>
#include <openspace/documentation/verifier.h>
#include <openspace/engine/openspaceengine.h>
@@ -39,6 +40,8 @@
#include <ghoul/opengl/textureunit.h>
namespace {
constexpr const char* ProgramName = "Plane";
enum BlendMode {
BlendModeNormal = 0,
BlendModeAdditive
@@ -164,11 +167,16 @@ void RenderablePlane::initializeGL() {
glGenBuffers(1, &_vertexPositionBuffer); // generate buffer
createPlane();
_shader = OsEng.renderEngine().buildRenderProgram(
"PlaneProgram",
absPath("${MODULE_BASE}/shaders/plane_vs.glsl"),
absPath("${MODULE_BASE}/shaders/plane_fs.glsl")
);
_shader = BaseModule::ProgramObjectManager.requestProgramObject(
ProgramName,
[]() -> std::unique_ptr<ghoul::opengl::ProgramObject> {
return OsEng.renderEngine().buildRenderProgram(
ProgramName,
absPath("${MODULE_BASE}/shaders/plane_vs.glsl"),
absPath("${MODULE_BASE}/shaders/plane_fs.glsl")
);
}
);
}
void RenderablePlane::deinitializeGL() {
@@ -178,11 +186,13 @@ void RenderablePlane::deinitializeGL() {
glDeleteBuffers(1, &_vertexPositionBuffer);
_vertexPositionBuffer = 0;
RenderEngine& renderEngine = OsEng.renderEngine();
if (_shader) {
renderEngine.removeRenderProgram(_shader);
_shader = nullptr;
}
BaseModule::ProgramObjectManager.releaseProgramObject(
ProgramName,
[](ghoul::opengl::ProgramObject* p) {
OsEng.renderEngine().removeRenderProgram(p);
}
);
_shader = nullptr;
}
void RenderablePlane::render(const RenderData& data, RendererTasks&) {
+1 -1
View File
@@ -73,7 +73,7 @@ private:
properties::FloatProperty _size;
properties::OptionProperty _blendMode;
std::unique_ptr<ghoul::opengl::ProgramObject> _shader;
ghoul::opengl::ProgramObject* _shader;
GLuint _quad;
GLuint _vertexPositionBuffer;
+20 -10
View File
@@ -24,6 +24,7 @@
#include <modules/base/rendering/renderablesphere.h>
#include <modules/base/basemodule.h>
#include <openspace/documentation/documentation.h>
#include <openspace/documentation/verifier.h>
#include <openspace/engine/openspaceengine.h>
@@ -39,6 +40,8 @@
#include <ghoul/opengl/programobject.h>
namespace {
constexpr const char* ProgramName = "Sphere";
enum Orientation {
Outside = 1,
Inside = 2
@@ -238,11 +241,15 @@ void RenderableSphere::initializeGL() {
);
_sphere->initialize();
// pscstandard
_shader = OsEng.renderEngine().buildRenderProgram(
"Sphere",
absPath("${MODULE_BASE}/shaders/sphere_vs.glsl"),
absPath("${MODULE_BASE}/shaders/sphere_fs.glsl")
_shader = BaseModule::ProgramObjectManager.requestProgramObject(
ProgramName,
[]() -> std::unique_ptr<ghoul::opengl::ProgramObject> {
return OsEng.renderEngine().buildRenderProgram(
ProgramName,
absPath("${MODULE_BASE}/shaders/sphere_vs.glsl"),
absPath("${MODULE_BASE}/shaders/sphere_fs.glsl")
);
}
);
_uniformCache.opacity = _shader->uniformLocation("opacity");
@@ -256,10 +263,13 @@ void RenderableSphere::initializeGL() {
void RenderableSphere::deinitializeGL() {
_texture = nullptr;
if (_shader) {
OsEng.renderEngine().removeRenderProgram(_shader);
_shader = nullptr;
}
BaseModule::ProgramObjectManager.releaseProgramObject(
ProgramName,
[](ghoul::opengl::ProgramObject* p) {
OsEng.renderEngine().removeRenderProgram(p);
}
);
_shader = nullptr;
}
void RenderableSphere::render(const RenderData& data, RendererTasks&) {
@@ -275,7 +285,7 @@ void RenderableSphere::render(const RenderData& data, RendererTasks&) {
_shader->setUniform(_uniformCache.viewProjection, data.camera.viewProjectionMatrix());
_shader->setUniform(_uniformCache.modelTransform, transform);
setPscUniforms(*_shader.get(), data.camera, data.position);
setPscUniforms(*_shader, data.camera, data.position);
float adjustedTransparency = _opacity;
+1 -1
View File
@@ -74,7 +74,7 @@ private:
float _fadeOutThreshold;
float _fadeInThreshold;
std::unique_ptr<ghoul::opengl::ProgramObject> _shader;
ghoul::opengl::ProgramObject* _shader;
std::unique_ptr<ghoul::opengl::Texture> _texture;
std::unique_ptr<PowerScaledSphere> _sphere;
@@ -24,6 +24,7 @@
#include <modules/base/rendering/renderablesphericalgrid.h>
#include <modules/base/basemodule.h>
#include <openspace/engine/configurationmanager.h>
#include <openspace/engine/openspaceengine.h>
#include <openspace/rendering/renderengine.h>
@@ -36,6 +37,8 @@
#include <ghoul/opengl/programobject.h>
namespace {
constexpr const char* ProgramName = "GridProgram";
static const openspace::properties::Property::PropertyInfo GridColorInfo = {
"GridColor",
"Grid Color",
@@ -182,10 +185,15 @@ bool RenderableSphericalGrid::isReady() const {
}
void RenderableSphericalGrid::initializeGL() {
_gridProgram = OsEng.renderEngine().buildRenderProgram(
"GridProgram",
absPath("${MODULE_BASE}/shaders/grid_vs.glsl"),
absPath("${MODULE_BASE}/shaders/grid_fs.glsl")
_gridProgram = BaseModule::ProgramObjectManager.requestProgramObject(
ProgramName,
[]() -> std::unique_ptr<ghoul::opengl::ProgramObject> {
return OsEng.renderEngine().buildRenderProgram(
ProgramName,
absPath("${MODULE_BASE}/shaders/grid_vs.glsl"),
absPath("${MODULE_BASE}/shaders/grid_fs.glsl")
);
}
);
glGenVertexArrays(1, &_vaoID);
@@ -208,6 +216,14 @@ void RenderableSphericalGrid::deinitializeGL() {
glDeleteBuffers(1, &_iBufferID);
_iBufferID = 0;
BaseModule::ProgramObjectManager.releaseProgramObject(
ProgramName,
[](ghoul::opengl::ProgramObject* p) {
OsEng.renderEngine().removeRenderProgram(p);
}
);
_gridProgram = nullptr;
}
void RenderableSphericalGrid::render(const RenderData& data, RendererTasks&){
@@ -63,7 +63,7 @@ protected:
float location[3];
};
std::unique_ptr<ghoul::opengl::ProgramObject> _gridProgram;
ghoul::opengl::ProgramObject* _gridProgram;
properties::DMat4Property _gridMatrix;
properties::Vec4Property _gridColor;
+20 -12
View File
@@ -24,6 +24,7 @@
#include <modules/base/rendering/renderabletrail.h>
#include <modules/base/basemodule.h>
#include <openspace/documentation/documentation.h>
#include <openspace/documentation/verifier.h>
#include <openspace/engine/openspaceengine.h>
@@ -35,7 +36,8 @@
#include <ghoul/opengl/programobject.h>
namespace {
const char* KeyTranslation = "Translation";
constexpr const char* ProgramName = "EphemerisProgram";
constexpr const char* KeyTranslation = "Translation";
// The possible values for the _renderingModes property
enum RenderingMode {
@@ -222,11 +224,15 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary)
}
void RenderableTrail::initializeGL() {
RenderEngine& renderEngine = OsEng.renderEngine();
_programObject = renderEngine.buildRenderProgram(
"EphemerisProgram",
absPath("${MODULE_BASE}/shaders/renderabletrail_vs.glsl"),
absPath("${MODULE_BASE}/shaders/renderabletrail_fs.glsl")
_programObject = BaseModule::ProgramObjectManager.requestProgramObject(
ProgramName,
[]() -> std::unique_ptr<ghoul::opengl::ProgramObject> {
return OsEng.renderEngine().buildRenderProgram(
ProgramName,
absPath("${MODULE_BASE}/shaders/renderabletrail_vs.glsl"),
absPath("${MODULE_BASE}/shaders/renderabletrail_fs.glsl")
);
}
);
_uniformCache.opacity = _programObject->uniformLocation("opacity");
@@ -246,11 +252,13 @@ void RenderableTrail::initializeGL() {
}
void RenderableTrail::deinitializeGL() {
RenderEngine& renderEngine = OsEng.renderEngine();
if (_programObject) {
renderEngine.removeRenderProgram(_programObject);
_programObject = nullptr;
}
BaseModule::ProgramObjectManager.releaseProgramObject(
ProgramName,
[](ghoul::opengl::ProgramObject* p) {
OsEng.renderEngine().removeRenderProgram(p);
}
);
_programObject = nullptr;
}
bool RenderableTrail::isReady() const {
@@ -305,7 +313,7 @@ void RenderableTrail::render(const RenderData& data, RendererTasks&) {
glEnable(GL_PROGRAM_POINT_SIZE);
}
auto render = [renderLines, renderPoints, p = _programObject.get(), &data,
auto render = [renderLines, renderPoints, p = _programObject, &data,
&modelTransform, pointSize = _pointSize.value(), c = _uniformCache]
(RenderInformation& info, int nVertices, int offset)
{
+1 -1
View File
@@ -158,7 +158,7 @@ private:
properties::OptionProperty _renderingModes;
/// Program object used to render the data stored in RenderInformation
std::unique_ptr<ghoul::opengl::ProgramObject> _programObject;
ghoul::opengl::ProgramObject* _programObject;
UniformCache(opacity, modelView, projection, color, useLineFade, lineFade,
vertexSorting, idOffset, nVertices, stride, pointSize, renderPhase) _uniformCache;