From a1ec19e672d6236d1d7c9b7ab84f0580f5544fd9 Mon Sep 17 00:00:00 2001 From: Vincent Lejeune Date: Tue, 26 Aug 2014 22:03:52 +0200 Subject: [PATCH] Factorise AZDO related code --- src/graphics/render_geometry.cpp | 195 +++++++++++++++---------------- src/graphics/stkscenemanager.hpp | 42 +++++++ 2 files changed, 133 insertions(+), 104 deletions(-) create mode 100644 src/graphics/stkscenemanager.hpp diff --git a/src/graphics/render_geometry.cpp b/src/graphics/render_geometry.cpp index 987218d8c..829721c7c 100644 --- a/src/graphics/render_geometry.cpp +++ b/src/graphics/render_geometry.cpp @@ -29,6 +29,7 @@ #include "utils/log.hpp" #include "utils/profiler.hpp" #include "utils/tuple.hpp" +#include "stkscenemanager.hpp" #include @@ -222,8 +223,21 @@ void renderInstancedMeshes1stPass(const std::vector &TexUnits, std::vec } static GLsync m_sync; -static GLuint drawindirectcmd; -static DrawElementsIndirectCommand *CommandBufferPtr = 0; +template +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(); + multidraw1stPass(); + multidraw1stPass(); + core::vector3df dir = ListInstancedMatGrass::getInstance()->empty() ? core::vector3df(0., 0., 0.) : STK::tuple_get<2>(ListInstancedMatGrass::getInstance()->at(0)); + multidraw1stPass(dir); #endif } else @@ -473,6 +469,23 @@ void renderInstancedMeshes2ndPass(const std::vector &TexUnits, std::vec } } +template +void multidraw2ndPass(const std::vector &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(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(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(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(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(createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0)); + multidraw2ndPass(createVector(DiffuseHandle, SpecularHandle, SSAOHandle, 0)); + multidraw2ndPass(createVector(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(createVector(DiffuseHandle, SpecularHandle, SSAOHandle, DepthHandle, 0), dir, cb->getPosition()); #endif } else @@ -904,8 +895,17 @@ void renderInstancedShadow(const std::vector TextureUnits, unsigned casc } } -static GLuint shadowdrawindirectcmd; -static DrawElementsIndirectCommand *ShadowCommandBufferPtr = 0; +template +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(cascade); + multidrawShadow(cascade); + multidrawShadow(cascade); + core::vector3df dir = ListInstancedMatGrass::getInstance()->empty() ? core::vector3df(0., 0., 0.) : STK::tuple_get<2>(ListInstancedMatGrass::getInstance()->at(0)); + multidrawShadow(cascade, dir); #endif } else diff --git a/src/graphics/stkscenemanager.hpp b/src/graphics/stkscenemanager.hpp new file mode 100644 index 000000000..fa924e05d --- /dev/null +++ b/src/graphics/stkscenemanager.hpp @@ -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 +class CommandBuffer : public Singleton +{ +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 +{ +public: + size_t Offset[MAT_COUNT], Size[MAT_COUNT]; +}; + +class ShadowPassCmd : public CommandBuffer +{ +public: + size_t Offset[4][MAT_COUNT], Size[4][MAT_COUNT]; +}; + + +#endif \ No newline at end of file