Fixed bug in CommandBuffer class
This commit is contained in:
parent
6ba82eaac9
commit
331cc0827f
@ -159,14 +159,21 @@ void SolidCommandBuffer::fill(MeshMap *mesh_map, std::vector<GLMesh *> instanced
|
||||
//Three textures materials
|
||||
InstanceDataThreeTex *instance_buffer_three_tex;
|
||||
|
||||
if (!CVS->supportsAsyncInstanceUpload())
|
||||
|
||||
|
||||
if (CVS->supportsAsyncInstanceUpload())
|
||||
{
|
||||
instance_buffer_three_tex =
|
||||
(InstanceDataThreeTex*)VAOManager::getInstance()->getInstanceBufferPtr(InstanceTypeThreeTex);
|
||||
}
|
||||
else
|
||||
{
|
||||
glUnmapBuffer(GL_ARRAY_BUFFER);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, VAOManager::getInstance()->getInstanceBuffer(InstanceTypeThreeTex));
|
||||
instance_buffer_three_tex = (InstanceDataThreeTex*)
|
||||
glMapBufferRange(GL_ARRAY_BUFFER, 0,
|
||||
10000 * sizeof(InstanceDataSingleTex),
|
||||
GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
|
||||
instance_buffer_three_tex =
|
||||
(InstanceDataThreeTex*) glMapBufferRange(GL_ARRAY_BUFFER, 0,
|
||||
10000 * sizeof(InstanceDataSingleTex), //TODO: why single?
|
||||
GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
|
||||
}
|
||||
|
||||
Material::ShaderType three_tex_materials[2] =
|
||||
|
@ -125,34 +125,33 @@ public:
|
||||
CommandBuffer();
|
||||
virtual ~CommandBuffer();
|
||||
|
||||
inline size_t getPolyCount() {return m_poly_count;}
|
||||
inline size_t getPolyCount() const {return m_poly_count;}
|
||||
|
||||
inline void bind()
|
||||
inline void bind() const
|
||||
{
|
||||
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_draw_indirect_cmd_id);
|
||||
}
|
||||
|
||||
/** Draw the i-th mesh with the specified material
|
||||
* (require GL_ARB_base_instance and GL_ARB_draw_indirect extensions)
|
||||
* \param shader_type Only render meshes with the specified material
|
||||
* (require at least OpenGL 4.0
|
||||
* or GL_ARB_base_instance and GL_ARB_draw_indirect extensions)
|
||||
*/
|
||||
inline void drawIndirect(Material::ShaderType shader_type, int i)
|
||||
inline void drawIndirect(int material_id, int i) const
|
||||
{
|
||||
glDrawElementsIndirect(GL_TRIANGLES,
|
||||
GL_UNSIGNED_SHORT,
|
||||
(const void*)(m_offset[static_cast<int>(shader_type) + i] * sizeof(DrawElementsIndirectCommand)));
|
||||
(const void*)((m_offset[material_id] + i) * sizeof(DrawElementsIndirectCommand)));
|
||||
}
|
||||
|
||||
/** Draw the meshes with the specified material
|
||||
* (require AZDO extensions)
|
||||
* \param shader_type Only render meshes with the specified material
|
||||
* (require at least OpenGL 4.3 or AZDO extensions)
|
||||
*/
|
||||
inline void multidrawIndirect(Material::ShaderType shader_type)
|
||||
inline void multidrawIndirect(int material_id) const
|
||||
{
|
||||
glMultiDrawElementsIndirect(GL_TRIANGLES,
|
||||
GL_UNSIGNED_SHORT,
|
||||
(const void*)(m_offset[static_cast<int>(shader_type)] * sizeof(DrawElementsIndirectCommand)),
|
||||
(int) m_size[static_cast<int>(shader_type)],
|
||||
(const void*)(m_offset[material_id] * sizeof(DrawElementsIndirectCommand)),
|
||||
(int) m_size[material_id],
|
||||
sizeof(DrawElementsIndirectCommand));
|
||||
}
|
||||
};
|
||||
|
@ -547,7 +547,7 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer
|
||||
{
|
||||
|
||||
//TODO
|
||||
/*std::vector<GLMesh *> instanced_lists[Material::SHADERTYPE_COUNT];
|
||||
std::vector<GLMesh *> instanced_lists[Material::SHADERTYPE_COUNT];
|
||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_SOLID)] = ListInstancedMatDefault::getInstance()->SolidPass;
|
||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_ALPHA_TEST)] = ListInstancedMatAlphaRef::getInstance()->SolidPass;
|
||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_SOLID_UNLIT)] = ListInstancedMatUnlit::getInstance()->SolidPass;
|
||||
@ -556,8 +556,7 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer
|
||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_DETAIL_MAP)] = ListInstancedMatDetails::getInstance()->SolidPass;
|
||||
instanced_lists[static_cast<int>(Material::SHADERTYPE_NORMAL_MAP)] = ListInstancedMatNormalMap::getInstance()->SolidPass;
|
||||
|
||||
m_solid_cmd_buffer.fill(m_solid_pass_mesh, instanced_lists);*/
|
||||
|
||||
m_solid_cmd_buffer.fill(m_solid_pass_mesh, instanced_lists);
|
||||
|
||||
|
||||
size_t offset = 0, current_cmd = 0;
|
||||
@ -759,3 +758,21 @@ void DrawCalls::renderParticlesList() const
|
||||
for(auto particles: m_particles_list)
|
||||
particles->render();
|
||||
}
|
||||
|
||||
|
||||
/** Draw the i-th mesh with the specified material for the solid pass
|
||||
* (require at least OpenGL 4.0
|
||||
* or GL_ARB_base_instance and GL_ARB_draw_indirect extensions)
|
||||
*/
|
||||
void DrawCalls::drawIndirectSolidCmd(Material::ShaderType shader_type, int i) const
|
||||
{
|
||||
m_solid_cmd_buffer.drawIndirect(static_cast<int>(shader_type), i);
|
||||
}
|
||||
|
||||
/** Draw the meshes with the specified material
|
||||
* (require at least OpenGL 4.3 or AZDO extensions)
|
||||
*/
|
||||
void DrawCalls::multidrawIndirectSolidCmd(Material::ShaderType shader_type) const
|
||||
{
|
||||
m_solid_cmd_buffer.multidrawIndirect(static_cast<int>(shader_type));
|
||||
}
|
||||
|
@ -97,7 +97,9 @@ public:
|
||||
void renderBillboardList() const;
|
||||
void renderParticlesList() const;
|
||||
|
||||
|
||||
inline void bindSolidCmd() const { m_solid_cmd_buffer.bind(); }
|
||||
void drawIndirectSolidCmd(Material::ShaderType shader_type, int i) const;
|
||||
void multidrawIndirectSolidCmd(Material::ShaderType shader_type) const;
|
||||
};
|
||||
|
||||
#endif //HEADER_DRAW_CALLS_HPP
|
||||
|
Loading…
x
Reference in New Issue
Block a user