diff options
author | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2016-05-06 13:31:23 +0300 |
---|---|---|
committer | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-05-12 10:38:32 +0300 |
commit | e956ba3c5b585dfd7cb8310aa0a50931dae7d386 (patch) | |
tree | fbe304583ae0db45833f442e8e1200e30c8d820d /drape | |
parent | 601a2b9a148c6de34cdbab479c5ba529fe41b37c (diff) |
Unbind VAO after each binding.
Diffstat (limited to 'drape')
-rw-r--r-- | drape/vertex_array_buffer.cpp | 30 | ||||
-rw-r--r-- | drape/vertex_array_buffer.hpp | 3 |
2 files changed, 25 insertions, 8 deletions
diff --git a/drape/vertex_array_buffer.cpp b/drape/vertex_array_buffer.cpp index ba836c9e59..fa7d78d114 100644 --- a/drape/vertex_array_buffer.cpp +++ b/drape/vertex_array_buffer.cpp @@ -79,14 +79,14 @@ void VertexArrayBuffer::RenderRange(IndicesRange const & range) ASSERT(m_program != nullptr, ("Somebody not call Build. It's very bad. Very very bad")); /// if OES_vertex_array_object is supported than all bindings already saved in VAO /// and we need only bind VAO. - if (GLExtensionsList::Instance().IsSupported(GLExtensionsList::VertexArrayObject)) - Bind(); - else + if (!Bind()) BindStaticBuffers(); BindDynamicBuffers(); GetIndexBuffer()->Bind(); GLFunctions::glDrawElements(dp::IndexStorage::SizeOfIndex(), range.m_idxCount, range.m_idxStart); + + Unbind(); } } @@ -111,6 +111,7 @@ void VertexArrayBuffer::Build(ref_ptr<GpuProgram> program) m_VAO = GLFunctions::glGenVertexArray(); Bind(); BindStaticBuffers(); + Unbind(); } void VertexArrayBuffer::UploadData(BindingInfo const & bindingInfo, void const * data, uint32_t count) @@ -232,8 +233,7 @@ void VertexArrayBuffer::ApplyMutation(ref_ptr<IndexBufferMutator> indexMutator, { /// We need to bind current VAO before calling glBindBuffer if OES_vertex_array_object is supported. /// Otherwise we risk affecting a previously binded VAO. - if (GLExtensionsList::Instance().IsSupported(GLExtensionsList::VertexArrayObject)) - Bind(); + Bind(); if (indexMutator != nullptr) { @@ -247,7 +247,10 @@ void VertexArrayBuffer::ApplyMutation(ref_ptr<IndexBufferMutator> indexMutator, } if (attrMutator == nullptr) + { + Unbind(); return; + } typedef AttributeBufferMutator::TMutateData TMutateData; typedef AttributeBufferMutator::TMutateNodes TMutateNodes; @@ -266,12 +269,25 @@ void VertexArrayBuffer::ApplyMutation(ref_ptr<IndexBufferMutator> indexMutator, mapper.UpdateData(node.m_data.get(), node.m_region.m_offset, node.m_region.m_count); } } + + Unbind(); } -void VertexArrayBuffer::Bind() const +bool VertexArrayBuffer::Bind() const { ASSERT(m_VAO != 0, ("You need to call Build method before bind it and render")); - GLFunctions::glBindVertexArray(m_VAO); + if (GLExtensionsList::Instance().IsSupported(GLExtensionsList::VertexArrayObject)) + { + GLFunctions::glBindVertexArray(m_VAO); + return true; + } + return false; +} + +void VertexArrayBuffer::Unbind() const +{ + if (GLExtensionsList::Instance().IsSupported(GLExtensionsList::VertexArrayObject)) + GLFunctions::glBindVertexArray(0); } void VertexArrayBuffer::BindStaticBuffers() const diff --git a/drape/vertex_array_buffer.hpp b/drape/vertex_array_buffer.hpp index 2ac9c1fb09..8ba2db50f2 100644 --- a/drape/vertex_array_buffer.hpp +++ b/drape/vertex_array_buffer.hpp @@ -76,7 +76,8 @@ private: ref_ptr<DataBuffer> GetOrCreateBuffer(BindingInfo const & bindingInfo, bool isDynamic); ref_ptr<DataBuffer> GetBuffer(BindingInfo const & bindingInfo, bool isDynamic) const; - void Bind() const; + bool Bind() const; + void Unbind() const; void BindStaticBuffers() const; void BindDynamicBuffers() const; void BindBuffers(TBuffersMap const & buffers) const; |