From b1ade2698d44723b34187c76e5d34dd75d1b0a4e Mon Sep 17 00:00:00 2001 From: ExMix Date: Tue, 12 Nov 2013 17:30:49 +0300 Subject: [PATCH] [drape] -remove unbind method. Binded VAO will be currect before other VAO not bind -move creation of VAO from constructor to Build for correct behavior in multithread env -for build VAO we not need set program as current --- drape/vertex_array_buffer.cpp | 42 +++++++++++++++++------------------ drape/vertex_array_buffer.hpp | 13 +++++++---- drape_head/glwidget.cpp | 4 ++-- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/drape/vertex_array_buffer.cpp b/drape/vertex_array_buffer.cpp index 3afa8cde4f..4eedbc262f 100644 --- a/drape/vertex_array_buffer.cpp +++ b/drape/vertex_array_buffer.cpp @@ -7,44 +7,42 @@ VertexArrayBuffer::VertexArrayBuffer(uint32_t indexBufferSize, uint32_t dataBuff : m_VAO(0) , m_dataBufferSize(dataBufferSize) { - m_VAO = GLFunctions::glGenVertexArray(); m_indexBuffer.Reset(new IndexBuffer(indexBufferSize)); } VertexArrayBuffer::~VertexArrayBuffer() { - Unbind(); - buffers_map_t::iterator it = m_buffers.begin(); for (; it != m_buffers.end(); ++it) it->second.Destroy(); m_buffers.clear(); - GLFunctions::glDeleteVertexArray(m_VAO); -} -void VertexArrayBuffer::Bind() -{ - GLFunctions::glBindVertexArray(m_VAO); -} - -void VertexArrayBuffer::Unbind() -{ - GLFunctions::glBindVertexArray(0); + if (m_VAO != 0) + { + /// Build called only when VertexArrayBuffer fulled and transfer to FrontendRenderer + /// but if user move screen before all geometry readed from MWM we delete VertexArrayBuffer on BackendRenderer + /// in this case m_VAO will be equal a 0 + GLFunctions::glDeleteVertexArray(m_VAO); + } } void VertexArrayBuffer::Render() { - Bind(); - GLFunctions::glDrawElements(m_indexBuffer->GetCurrentSize()); + if (!m_buffers.empty()) + { + Bind(); + GLFunctions::glDrawElements(m_indexBuffer->GetCurrentSize()); + } } -void VertexArrayBuffer::BuildVertexArray(ReferencePoiner program) +void VertexArrayBuffer::Build(ReferencePoiner program) { + ASSERT(m_VAO == 0, ("No-no-no! You can't rebuild VertexArrayBuffer")); if (m_buffers.empty()) return; - program->Bind(); + m_VAO = GLFunctions::glGenVertexArray(); Bind(); buffers_map_t::iterator it = m_buffers.begin(); @@ -67,13 +65,9 @@ void VertexArrayBuffer::BuildVertexArray(ReferencePoiner program) decl.m_stride, decl.m_offset); } - buffer->Unbind(); } m_indexBuffer->Bind(); - Unbind(); - m_indexBuffer->Unbind(); - program->Unbind(); } ReferencePoiner VertexArrayBuffer::GetBuffer(const BindingInfo & bindingInfo) @@ -129,3 +123,9 @@ void VertexArrayBuffer::UploadIndexes(uint16_t * data, uint16_t count) ASSERT(count <= m_indexBuffer->GetAvailableSize(), ()); m_indexBuffer->UploadData(data, count); } + +void VertexArrayBuffer::Bind() +{ + ASSERT(m_VAO != 0, ("You need to call Build method before bind it and render")); + GLFunctions::glBindVertexArray(m_VAO); +} diff --git a/drape/vertex_array_buffer.hpp b/drape/vertex_array_buffer.hpp index d7dbbbd31f..169088b52b 100644 --- a/drape/vertex_array_buffer.hpp +++ b/drape/vertex_array_buffer.hpp @@ -14,11 +14,13 @@ public: VertexArrayBuffer(uint32_t indexBufferSize, uint32_t dataBufferSize); ~VertexArrayBuffer(); - void Bind(); - void Unbind(); + ///{@ + /// On devices where implemented OES_vertex_array_object extensions we use it for build VertexArrayBuffer + /// OES_vertex_array_object create OpenGL resource that belong only one GL context (which was created by) + /// by this reason Build/Bind and Render must be called only on Frontendrendere thread void Render(); - - void BuildVertexArray(ReferencePoiner program); + void Build(ReferencePoiner program); + ///@} ReferencePoiner GetBuffer(const BindingInfo & bindingInfo); @@ -27,6 +29,9 @@ public: uint16_t GetStartIndexValue() const; void UploadIndexes(uint16_t * data, uint16_t count); +private: + void Bind(); + private: int m_VAO; typedef map > buffers_map_t; diff --git a/drape_head/glwidget.cpp b/drape_head/glwidget.cpp index 0bb99abcdd..3de56dbfd9 100644 --- a/drape_head/glwidget.cpp +++ b/drape_head/glwidget.cpp @@ -10,14 +10,14 @@ GLWidget::GLWidget() void GLWidget::FlushFullBucket(const GLState & state, OwnedPointer bucket) { ReferencePoiner program = m_programManager->GetProgram(state.GetProgramIndex()); - bucket->BuildVertexArray(program); + bucket->Build(program); m_frames[state].push_back(bucket); } void GLWidget::UseIncompleteBucket(const GLState &state, ReferencePoiner bucket) { ReferencePoiner program = m_programManager->GetProgram(state.GetProgramIndex()); - bucket->BuildVertexArray(program); + bucket->Build(program); renderBucket(state, bucket); }