#pragma once #include #include #include #include #include #include namespace mbgl { namespace gl { class Context; class VertexArrayState { public: VertexArrayState(UniqueVertexArray vertexArray_, Context& context) : vertexArray(std::move(vertexArray_)), bindings(makeBindings(context, std::make_index_sequence())) { } void setDirty() { indexBuffer.setDirty(); for (auto& binding : bindings) { binding.setDirty(); } } UniqueVertexArray vertexArray; State indexBuffer; using AttributeState = State; std::array bindings; private: template std::array makeBindings(Context& context, std::index_sequence) { return {{ AttributeState { context, I }... }}; } }; class VertexArrayStateDeleter { public: VertexArrayStateDeleter(bool destroy_) : destroy(destroy_) {} void operator()(VertexArrayState* ptr) const { if (destroy) { delete ptr; } } private: bool destroy; }; using UniqueVertexArrayState = std::unique_ptr; class VertexArray { public: VertexArray(UniqueVertexArrayState state_) : state(std::move(state_)) { } void bind(Context&, BufferID indexBuffer, const AttributeBindingArray&); private: UniqueVertexArrayState state; }; } // namespace gl } // namespace mbgl