Do not upload UBO data when UBO are disabled by graphics restriction

This commit is contained in:
Elderme 2016-07-13 23:19:52 +02:00
parent cc43879308
commit d7ebde2e68
3 changed files with 37 additions and 16 deletions

View File

@ -199,6 +199,8 @@ void ShaderBasedRenderer::updateLightsInfo(scene::ICameraSceneNode * const camno
*/
void ShaderBasedRenderer::uploadLightingData() const
{
assert(CVS->isARBUniformBufferObjectUsable());
float Lighting[36];
core::vector3df sun_direction = irr_driver->getSunDirection();
@ -266,9 +268,12 @@ void ShaderBasedRenderer::renderScene(scene::ICameraSceneNode * const camnode,
float dt,
bool hasShadow,
bool forceRTT)
{
glBindBufferBase(GL_UNIFORM_BUFFER, 0, SharedGPUObjects::getViewProjectionMatricesUBO());
glBindBufferBase(GL_UNIFORM_BUFFER, 1, SharedGPUObjects::getLightingDataUBO());
{
if(CVS->isARBUniformBufferObjectUsable())
{
glBindBufferBase(GL_UNIFORM_BUFFER, 0, SharedGPUObjects::getViewProjectionMatricesUBO());
glBindBufferBase(GL_UNIFORM_BUFFER, 1, SharedGPUObjects::getLightingDataUBO());
}
irr_driver->getSceneManager()->setActiveCamera(camnode);
PROFILER_PUSH_CPU_MARKER("- Draw Call Generation", 0xFF, 0xFF, 0xFF);
@ -832,7 +837,8 @@ void ShaderBasedRenderer::render(float dt)
PROFILER_PUSH_CPU_MARKER("UBO upload", 0x0, 0xFF, 0x0);
computeMatrixesAndCameras(camnode, viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X, viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y);
m_shadow_matrices.updateSunOrthoMatrices();
uploadLightingData();
if(CVS->isARBUniformBufferObjectUsable())
uploadLightingData();
PROFILER_POP_CPU_MARKER();
renderScene(camnode, dt, track->hasShadows(), false);
@ -855,14 +861,17 @@ void ShaderBasedRenderer::render(float dt)
} // for i<world->getNumKarts()
// Use full screen size
float tmp[2];
tmp[0] = float(irr_driver->getActualScreenSize().Width);
tmp[1] = float(irr_driver->getActualScreenSize().Height);
glBindBuffer(GL_UNIFORM_BUFFER,
SharedGPUObjects::getViewProjectionMatricesUBO());
glBufferSubData(GL_UNIFORM_BUFFER, (16 * 9) * sizeof(float),
2 * sizeof(float), tmp);
if(CVS->isARBUniformBufferObjectUsable())
{
// Use full screen size
float tmp[2];
tmp[0] = float(irr_driver->getActualScreenSize().Width);
tmp[1] = float(irr_driver->getActualScreenSize().Height);
glBindBuffer(GL_UNIFORM_BUFFER,
SharedGPUObjects::getViewProjectionMatricesUBO());
glBufferSubData(GL_UNIFORM_BUFFER, (16 * 9) * sizeof(float),
2 * sizeof(float), tmp);
}
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
@ -936,7 +945,9 @@ void ShaderBasedRenderer::renderToTexture(GL3RenderTarget *render_target,
computeMatrixesAndCameras(camera, width, height);
updateLightsInfo(camera, dt);
uploadLightingData();
if(CVS->isARBUniformBufferObjectUsable())
uploadLightingData();
renderScene(camera, dt, false, true);
m_post_processing->render(camera, false, m_rtts, render_target);

View File

@ -449,6 +449,9 @@ void ShadowMatrices::computeMatrixesAndCameras(scene::ICameraSceneNode *const ca
16 * sizeof(float));
}
if(!CVS->isARBUniformBufferObjectUsable())
return;
tmp[144] = float(width);
tmp[145] = float(height);
glBindBuffer(GL_UNIFORM_BUFFER,

View File

@ -16,6 +16,7 @@
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "graphics/shared_gpu_objects.hpp"
#include "graphics/central_settings.hpp"
GLuint SharedGPUObjects::m_billboard_vbo;
GLuint SharedGPUObjects::m_sky_tri_vbo;
@ -147,6 +148,7 @@ void SharedGPUObjects::initFrustrumVBO()
// ----------------------------------------------------------------------------
void SharedGPUObjects::initShadowVPMUBO()
{
assert(CVS->isARBUniformBufferObjectUsable());
glGenBuffers(1, &m_View_projection_matrices_ubo);
glBindBuffer(GL_UNIFORM_BUFFER, m_View_projection_matrices_ubo);
glBufferData(GL_UNIFORM_BUFFER, (16 * 9 + 2) * sizeof(float), 0,
@ -157,6 +159,7 @@ void SharedGPUObjects::initShadowVPMUBO()
// ----------------------------------------------------------------------------
void SharedGPUObjects::initLightingDataUBO()
{
assert(CVS->isARBUniformBufferObjectUsable());
glGenBuffers(1, &m_lighting_data_ubo);
glBindBuffer(GL_UNIFORM_BUFFER, m_lighting_data_ubo);
glBufferData(GL_UNIFORM_BUFFER, 36 * sizeof(float), 0, GL_STREAM_DRAW);
@ -190,9 +193,13 @@ void SharedGPUObjects::init()
initBillboardVBO();
initSkyTriVBO();
initFrustrumVBO();
initShadowVPMUBO();
initLightingDataUBO();
initParticleQuadVBO();
if(CVS->isARBUniformBufferObjectUsable())
{
initShadowVPMUBO();
initLightingDataUBO();
}
m_has_been_initialised = true;
} // SharedGPUObjects
@ -205,4 +212,4 @@ void SharedGPUObjects::init()
void SharedGPUObjects::reset()
{
m_has_been_initialised = false;
} // reset
} // reset