Factorise AZDO related code

This commit is contained in:
Vincent Lejeune 2014-08-26 22:03:52 +02:00
parent 53c52470ee
commit a1ec19e672
2 changed files with 133 additions and 104 deletions

View File

@ -29,6 +29,7 @@
#include "utils/log.hpp"
#include "utils/profiler.hpp"
#include "utils/tuple.hpp"
#include "stkscenemanager.hpp"
#include <algorithm>
@ -222,8 +223,21 @@ void renderInstancedMeshes1stPass(const std::vector<TexUnit> &TexUnits, std::vec
}
static GLsync m_sync;
static GLuint drawindirectcmd;
static DrawElementsIndirectCommand *CommandBufferPtr = 0;
template<typename Shader, MeshMaterial Mat, video::E_VERTEX_TYPE VT, typename...Args>
void multidraw1stPass(Args...args)
{
glUseProgram(Shader::getInstance()->Program);
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(VT, InstanceTypeDefault));
if (SolidPassCmd::getInstance()->Size[Mat])
{
Shader::getInstance()->setUniforms(args...);
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT,
(const void*)(SolidPassCmd::getInstance()->Offset[Mat] * sizeof(DrawElementsIndirectCommand)),
SolidPassCmd::getInstance()->Size[Mat],
sizeof(DrawElementsIndirectCommand));
}
}
void IrrDriver::renderSolidFirstPass()
{
@ -292,18 +306,11 @@ void IrrDriver::renderSolidFirstPass()
if (UserConfigParams::m_azdo)
{
#ifdef Buffer_Storage
if (!CommandBufferPtr)
{
glGenBuffers(1, &drawindirectcmd);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, drawindirectcmd);
glBufferStorage(GL_DRAW_INDIRECT_BUFFER, 100 * sizeof(DrawElementsIndirectCommand), 0, GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT | GL_MAP_COHERENT_BIT);
CommandBufferPtr = (DrawElementsIndirectCommand *)glMapBufferRange(GL_DRAW_INDIRECT_BUFFER, 0, 100 * sizeof(DrawElementsIndirectCommand), GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT | GL_MAP_WRITE_BIT);
}
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, drawindirectcmd);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, SolidPassCmd::getInstance()->drawindirectcmd);
DrawElementsIndirectCommand *CommandBufferPtr = SolidPassCmd::getInstance()->Ptr;
size_t offset = 0;
SolidPassCmd::getInstance()->Offset[MAT_DEFAULT] = offset;
for (unsigned i = 0; i < ListInstancedMatDefault::getInstance()->size(); i++)
{
const GLMesh &mesh = *(STK::tuple_get<0>(ListInstancedMatDefault::getInstance()->at(i)));
@ -315,6 +322,9 @@ void IrrDriver::renderSolidFirstPass()
CurrentCommand.firstIndex = mesh.vaoOffset / 2;
CurrentCommand.baseInstance = mesh.vaoBaseInstance;
}
SolidPassCmd::getInstance()->Size[MAT_DEFAULT] = ListInstancedMatDefault::getInstance()->size();
SolidPassCmd::getInstance()->Offset[MAT_NORMAL_MAP] = offset;
for (unsigned i = 0; i < ListInstancedMatNormalMap::getInstance()->size(); i++)
{
const GLMesh &mesh = *(STK::tuple_get<0>(ListInstancedMatNormalMap::getInstance()->at(i)));
@ -326,6 +336,9 @@ void IrrDriver::renderSolidFirstPass()
CurrentCommand.firstIndex = mesh.vaoOffset / 2;
CurrentCommand.baseInstance = mesh.vaoBaseInstance;
}
SolidPassCmd::getInstance()->Size[MAT_NORMAL_MAP] = ListInstancedMatNormalMap::getInstance()->size();
SolidPassCmd::getInstance()->Offset[MAT_ALPHA_REF] = offset;
for (unsigned i = 0; i < ListInstancedMatAlphaRef::getInstance()->size(); i++)
{
const GLMesh &mesh = *(STK::tuple_get<0>(ListInstancedMatAlphaRef::getInstance()->at(i)));
@ -337,6 +350,9 @@ void IrrDriver::renderSolidFirstPass()
CurrentCommand.firstIndex = mesh.vaoOffset / 2;
CurrentCommand.baseInstance = mesh.vaoBaseInstance;
}
SolidPassCmd::getInstance()->Size[MAT_ALPHA_REF] = ListInstancedMatAlphaRef::getInstance()->size();
SolidPassCmd::getInstance()->Offset[MAT_GRASS] = offset;
for (unsigned i = 0; i < ListInstancedMatGrass::getInstance()->size(); i++)
{
const GLMesh &mesh = *(STK::tuple_get<0>(ListInstancedMatGrass::getInstance()->at(i)));
@ -348,33 +364,13 @@ void IrrDriver::renderSolidFirstPass()
CurrentCommand.firstIndex = mesh.vaoOffset / 2;
CurrentCommand.baseInstance = mesh.vaoBaseInstance;
}
#endif
SolidPassCmd::getInstance()->Size[MAT_GRASS] = ListInstancedMatGrass::getInstance()->size();
#ifdef Multi_Draw_Indirect
unsigned ptr = 0;
glUseProgram(MeshShader::InstancedObjectPass1Shader::getInstance()->Program);
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(video::EVT_STANDARD, InstanceTypeDefault));
if (!ListInstancedMatDefault::getInstance()->empty())
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatDefault::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
ptr += sizeof(DrawElementsIndirectCommand)* ListInstancedMatDefault::getInstance()->size();
glUseProgram(MeshShader::InstancedNormalMapShader::getInstance()->Program);
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(video::EVT_TANGENTS, InstanceTypeDefault));
if (!ListInstancedMatNormalMap::getInstance()->empty())
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatNormalMap::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
ptr += sizeof(DrawElementsIndirectCommand)* ListInstancedMatNormalMap::getInstance()->size();
glUseProgram(MeshShader::InstancedObjectRefPass1Shader::getInstance()->Program);
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(video::EVT_STANDARD, InstanceTypeDefault));
if (!ListInstancedMatAlphaRef::getInstance()->empty())
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatAlphaRef::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
ptr += sizeof(DrawElementsIndirectCommand)* ListInstancedMatAlphaRef::getInstance()->size();
glUseProgram(MeshShader::InstancedGrassPass1Shader::getInstance()->Program);
if (!ListInstancedMatGrass::getInstance()->empty())
{
MeshShader::InstancedGrassPass1Shader::getInstance()->setUniforms(STK::tuple_get<2>(ListInstancedMatGrass::getInstance()->at(0)));
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatGrass::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
}
multidraw1stPass<MeshShader::InstancedObjectPass1Shader, MAT_DEFAULT, video::EVT_STANDARD>();
multidraw1stPass<MeshShader::InstancedObjectRefPass1Shader, MAT_ALPHA_REF, video::EVT_STANDARD>();
multidraw1stPass<MeshShader::InstancedNormalMapShader, MAT_NORMAL_MAP, video::EVT_TANGENTS>();
core::vector3df dir = ListInstancedMatGrass::getInstance()->empty() ? core::vector3df(0., 0., 0.) : STK::tuple_get<2>(ListInstancedMatGrass::getInstance()->at(0));
multidraw1stPass<MeshShader::InstancedGrassPass1Shader, MAT_GRASS, video::EVT_STANDARD>(dir);
#endif
}
else
@ -473,6 +469,23 @@ void renderInstancedMeshes2ndPass(const std::vector<TexUnit> &TexUnits, std::vec
}
}
template<typename Shader, MeshMaterial Mat, video::E_VERTEX_TYPE VT, typename...Args>
void multidraw2ndPass(const std::vector<uint64_t> &Handles, Args... args)
{
glUseProgram(Shader::getInstance()->Program);
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(VT, InstanceTypeDefault));
if (SolidPassCmd::getInstance()->Size[Mat])
{
Shader::getInstance()->SetTextureHandles(Handles);
Shader::getInstance()->setUniforms(args...);
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT,
(const void*)(SolidPassCmd::getInstance()->Offset[Mat] * sizeof(DrawElementsIndirectCommand)),
SolidPassCmd::getInstance()->Size[Mat],
sizeof(DrawElementsIndirectCommand));
}
}
void IrrDriver::renderSolidSecondPass()
{
SColor clearColor(0, 150, 150, 150);
@ -561,34 +574,12 @@ void IrrDriver::renderSolidSecondPass()
if (UserConfigParams::m_azdo)
{
#ifdef Multi_Draw_Indirect
unsigned ptr = 0;
glUseProgram(MeshShader::InstancedObjectPass2Shader::getInstance()->Program);
MeshShader::InstancedObjectPass2Shader::getInstance()->SetTextureHandles(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(video::EVT_STANDARD, InstanceTypeDefault));
if (!ListInstancedMatDefault::getInstance()->empty())
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatDefault::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
ptr += sizeof(DrawElementsIndirectCommand)* ListInstancedMatDefault::getInstance()->size();
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(video::EVT_TANGENTS, InstanceTypeDefault));
MeshShader::InstancedObjectPass2Shader::getInstance()->SetTextureHandles(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
if (!ListInstancedMatNormalMap::getInstance()->empty())
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatNormalMap::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
ptr += sizeof(DrawElementsIndirectCommand)* ListInstancedMatNormalMap::getInstance()->size();
glUseProgram(MeshShader::InstancedObjectRefPass2Shader::getInstance()->Program);
glBindVertexArray(VAOManager::getInstance()->getInstanceVAO(video::EVT_STANDARD, InstanceTypeDefault));
MeshShader::InstancedObjectRefPass2Shader::getInstance()->SetTextureHandles(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
if (!ListInstancedMatAlphaRef::getInstance()->empty())
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatAlphaRef::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
ptr += sizeof(DrawElementsIndirectCommand)* ListInstancedMatAlphaRef::getInstance()->size();
glUseProgram(MeshShader::InstancedGrassPass2Shader::getInstance()->Program);
MeshShader::InstancedGrassPass2Shader::getInstance()->SetTextureHandles(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, DepthHandle, 0));
if (!ListInstancedMatGrass::getInstance()->empty())
{
MeshShader::InstancedGrassPass2Shader::getInstance()->setUniforms(STK::tuple_get<2>(ListInstancedMatGrass::getInstance()->at(0)), STK::tuple_get<3>(ListInstancedMatGrass::getInstance()->at(0)));
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatGrass::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
}
multidraw2ndPass<MeshShader::InstancedObjectPass2Shader, MAT_DEFAULT, video::EVT_STANDARD>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
multidraw2ndPass<MeshShader::InstancedObjectPass2Shader, MAT_NORMAL_MAP, video::EVT_TANGENTS>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
multidraw2ndPass<MeshShader::InstancedObjectRefPass2Shader, MAT_ALPHA_REF, video::EVT_STANDARD>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, 0));
core::vector3df dir = ListInstancedMatGrass::getInstance()->empty() ? core::vector3df(0., 0., 0.) : STK::tuple_get<2>(ListInstancedMatGrass::getInstance()->at(0));
SunLightProvider * const cb = (SunLightProvider *)irr_driver->getCallback(ES_SUNLIGHT);
multidraw2ndPass<MeshShader::InstancedGrassPass2Shader, MAT_GRASS, video::EVT_STANDARD>(createVector<uint64_t>(DiffuseHandle, SpecularHandle, SSAOHandle, DepthHandle, 0), dir, cb->getPosition());
#endif
}
else
@ -904,8 +895,17 @@ void renderInstancedShadow(const std::vector<GLuint> TextureUnits, unsigned casc
}
}
static GLuint shadowdrawindirectcmd;
static DrawElementsIndirectCommand *ShadowCommandBufferPtr = 0;
template<typename Shader, MeshMaterial Mat, video::E_VERTEX_TYPE VT, typename...Args>
static void multidrawShadow(unsigned i, Args ...args)
{
glUseProgram(Shader::getInstance()->Program);
glBindVertexArray(VAOManager::getInstance()->getShadowInstanceVAO(VT, InstanceTypeDefault));
if (ShadowPassCmd::getInstance()->Size[i][Mat])
{
Shader::getInstance()->setUniforms(i, args...);
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)(ShadowPassCmd::getInstance()->Offset[i][Mat] * sizeof(DrawElementsIndirectCommand)), ShadowPassCmd::getInstance()->Size[i][Mat], sizeof(DrawElementsIndirectCommand));
}
}
void IrrDriver::renderShadows()
{
@ -934,6 +934,7 @@ void IrrDriver::renderShadows()
ListInstancedMatGrass::getInstance()->clear();
ListInstancedMatNormalMap::getInstance()->clear();
m_scene_manager->drawAll(scene::ESNRP_SOLID);
size_t offset = 0;
for (unsigned cascade = 0; cascade < 4; cascade++)
{
@ -949,84 +950,70 @@ void IrrDriver::renderShadows()
if (UserConfigParams::m_azdo)
{
#ifdef Buffer_Storage
if (!ShadowCommandBufferPtr)
{
glGenBuffers(1, &shadowdrawindirectcmd);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, shadowdrawindirectcmd);
glBufferStorage(GL_DRAW_INDIRECT_BUFFER, 100 * sizeof(DrawElementsIndirectCommand), 0, GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT | GL_MAP_COHERENT_BIT);
ShadowCommandBufferPtr = (DrawElementsIndirectCommand *)glMapBufferRange(GL_DRAW_INDIRECT_BUFFER, 0, 100 * sizeof(DrawElementsIndirectCommand), GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT | GL_MAP_WRITE_BIT);
}
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, ShadowPassCmd::getInstance()->drawindirectcmd);
DrawElementsIndirectCommand *ShadowCommandBufferPtr = ShadowPassCmd::getInstance()->Ptr;
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, shadowdrawindirectcmd);
size_t offset = 0;
ShadowPassCmd::getInstance()->Offset[cascade][MAT_DEFAULT] = offset;
for (unsigned i = 0; i < ListInstancedMatDefault::getInstance()->size(); i++)
{
const GLMesh &mesh = *(STK::tuple_get<0>(ListInstancedMatDefault::getInstance()->at(i)));
size_t &instanceCount = STK::tuple_get<1>(ListInstancedMatDefault::getInstance()->at(i));
DrawElementsIndirectCommand &CurrentCommand = ShadowCommandBufferPtr[offset++];
CurrentCommand.instanceCount = 4 * instanceCount;
CurrentCommand.instanceCount = instanceCount;
CurrentCommand.baseVertex = mesh.vaoBaseVertex;
CurrentCommand.count = mesh.IndexCount;
CurrentCommand.firstIndex = mesh.vaoOffset / 2;
CurrentCommand.baseInstance = mesh.vaoBaseInstance;
}
ShadowPassCmd::getInstance()->Size[cascade][MAT_DEFAULT] = offset - ShadowPassCmd::getInstance()->Offset[cascade][MAT_DEFAULT];
ShadowPassCmd::getInstance()->Offset[cascade][MAT_NORMAL_MAP] = offset;
for (unsigned i = 0; i < ListInstancedMatNormalMap::getInstance()->size(); i++)
{
const GLMesh &mesh = *(STK::tuple_get<0>(ListInstancedMatNormalMap::getInstance()->at(i)));
size_t &instanceCount = STK::tuple_get<1>(ListInstancedMatNormalMap::getInstance()->at(i));
DrawElementsIndirectCommand &CurrentCommand = ShadowCommandBufferPtr[offset++];
CurrentCommand.instanceCount = 4 * instanceCount;
CurrentCommand.instanceCount = instanceCount;
CurrentCommand.baseVertex = mesh.vaoBaseVertex;
CurrentCommand.count = mesh.IndexCount;
CurrentCommand.firstIndex = mesh.vaoOffset / 2;
CurrentCommand.baseInstance = mesh.vaoBaseInstance;
}
ShadowPassCmd::getInstance()->Size[cascade][MAT_NORMAL_MAP] = offset - ShadowPassCmd::getInstance()->Offset[cascade][MAT_NORMAL_MAP];
ShadowPassCmd::getInstance()->Offset[cascade][MAT_ALPHA_REF] = offset;
for (unsigned i = 0; i < ListInstancedMatAlphaRef::getInstance()->size(); i++)
{
const GLMesh &mesh = *(STK::tuple_get<0>(ListInstancedMatAlphaRef::getInstance()->at(i)));
size_t &instanceCount = STK::tuple_get<1>(ListInstancedMatAlphaRef::getInstance()->at(i));
DrawElementsIndirectCommand &CurrentCommand = ShadowCommandBufferPtr[offset++];
CurrentCommand.instanceCount = 4 * instanceCount;
CurrentCommand.instanceCount = instanceCount;
CurrentCommand.baseVertex = mesh.vaoBaseVertex;
CurrentCommand.count = mesh.IndexCount;
CurrentCommand.firstIndex = mesh.vaoOffset / 2;
CurrentCommand.baseInstance = mesh.vaoBaseInstance;
}
ShadowPassCmd::getInstance()->Size[cascade][MAT_ALPHA_REF] = offset - ShadowPassCmd::getInstance()->Offset[cascade][MAT_ALPHA_REF];
ShadowPassCmd::getInstance()->Offset[cascade][MAT_GRASS] = offset;
for (unsigned i = 0; i < ListInstancedMatGrass::getInstance()->size(); i++)
{
const GLMesh &mesh = *(STK::tuple_get<0>(ListInstancedMatGrass::getInstance()->at(i)));
size_t &instanceCount = STK::tuple_get<1>(ListInstancedMatGrass::getInstance()->at(i));
DrawElementsIndirectCommand &CurrentCommand = ShadowCommandBufferPtr[offset++];
CurrentCommand.instanceCount = 4 * instanceCount;
CurrentCommand.instanceCount = instanceCount;
CurrentCommand.baseVertex = mesh.vaoBaseVertex;
CurrentCommand.count = mesh.IndexCount;
CurrentCommand.firstIndex = mesh.vaoOffset / 2;
CurrentCommand.baseInstance = mesh.vaoBaseInstance;
}
#endif
ShadowPassCmd::getInstance()->Size[cascade][MAT_GRASS] = offset - ShadowPassCmd::getInstance()->Offset[cascade][MAT_GRASS];
#ifdef Multi_Draw_Indirect
unsigned ptr = 0;
glUseProgram(MeshShader::InstancedShadowShader::getInstance()->Program);
glBindVertexArray(VAOManager::getInstance()->getShadowInstanceVAO(video::EVT_STANDARD, InstanceTypeDefault));
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatDefault::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
ptr += sizeof(DrawElementsIndirectCommand)* ListInstancedMatDefault::getInstance()->size();
glUseProgram(MeshShader::InstancedShadowShader::getInstance()->Program);
glBindVertexArray(VAOManager::getInstance()->getShadowInstanceVAO(video::EVT_TANGENTS, InstanceTypeDefault));
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatNormalMap::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
ptr += sizeof(DrawElementsIndirectCommand)* ListInstancedMatNormalMap::getInstance()->size();
glUseProgram(MeshShader::InstancedRefShadowShader::getInstance()->Program);
glBindVertexArray(VAOManager::getInstance()->getShadowInstanceVAO(video::EVT_STANDARD, InstanceTypeDefault));
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatAlphaRef::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
ptr += sizeof(DrawElementsIndirectCommand)* ListInstancedMatAlphaRef::getInstance()->size();
glUseProgram(MeshShader::InstancedGrassShadowShader::getInstance()->Program);
// MeshShader::InstancedGrassShadowShader::getInstance()->setUniforms(STK::tuple_get<2>(ListInstancedMatGrass::getInstance()->at(0)));
glBindVertexArray(VAOManager::getInstance()->getShadowInstanceVAO(video::EVT_STANDARD, InstanceTypeDefault));
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_SHORT, (const void*)ptr, ListInstancedMatGrass::getInstance()->size(), sizeof(DrawElementsIndirectCommand));
multidrawShadow<MeshShader::InstancedShadowShader, MAT_DEFAULT, video::EVT_STANDARD>(cascade);
multidrawShadow<MeshShader::InstancedShadowShader, MAT_NORMAL_MAP, video::EVT_TANGENTS>(cascade);
multidrawShadow<MeshShader::InstancedRefShadowShader, MAT_ALPHA_REF, video::EVT_STANDARD>(cascade);
core::vector3df dir = ListInstancedMatGrass::getInstance()->empty() ? core::vector3df(0., 0., 0.) : STK::tuple_get<2>(ListInstancedMatGrass::getInstance()->at(0));
multidrawShadow<MeshShader::InstancedGrassShadowShader, MAT_GRASS, video::EVT_STANDARD>(cascade, dir);
#endif
}
else

View File

@ -0,0 +1,42 @@
// Not really a scene manager yet but hold algorithm that
// rework scene manager output
#ifndef HEADER_STKSCENEMANAGER_HPP
#define HEADER_STKSCENEMANAGER_HPP
#include "utils/singleton.hpp"
#include "gl_headers.hpp"
#include "stkmesh.hpp"
template<typename T>
class CommandBuffer : public Singleton<T>
{
public:
GLuint drawindirectcmd;
DrawElementsIndirectCommand *Ptr;
CommandBuffer()
{
#ifdef Buffer_Storage
glGenBuffers(1, &drawindirectcmd);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, drawindirectcmd);
glBufferStorage(GL_DRAW_INDIRECT_BUFFER, 10000 * sizeof(DrawElementsIndirectCommand), 0, GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT);
Ptr = (DrawElementsIndirectCommand *)glMapBufferRange(GL_DRAW_INDIRECT_BUFFER, 0, 10000 * sizeof(DrawElementsIndirectCommand), GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT);
#endif
}
};
class SolidPassCmd : public CommandBuffer<SolidPassCmd>
{
public:
size_t Offset[MAT_COUNT], Size[MAT_COUNT];
};
class ShadowPassCmd : public CommandBuffer<ShadowPassCmd>
{
public:
size_t Offset[4][MAT_COUNT], Size[4][MAT_COUNT];
};
#endif