From 0bbc6b814cbec44be7026a0bac83d56e4d71a287 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 8 Feb 2017 15:57:58 -0800 Subject: [PATCH] [core] Restore support for GL implementations without VAO extension --- src/mbgl/gl/context.cpp | 14 +++++++++----- src/mbgl/gl/context.hpp | 4 ++++ src/mbgl/gl/segment.hpp | 15 ++++++++++----- test/fixtures/map/no_vao/expected.png | Bin 0 -> 9832 bytes test/map/map.test.cpp | 19 +++++++++++++++++++ 5 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 test/fixtures/map/no_vao/expected.png diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index a74e941bc..5726eca5d 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -123,12 +123,16 @@ UniqueTexture Context::createTexture() { } UniqueVertexArray Context::createVertexArray() { - if (!gl::GenVertexArrays) { - throw std::runtime_error("GL_ARB_vertex_array_object extension is required"); - } - VertexArrayID id = 0; - MBGL_CHECK_ERROR(gl::GenVertexArrays(1, &id)); + if (gl::GenVertexArrays && !disableVAOExtension) { + MBGL_CHECK_ERROR(gl::GenVertexArrays(1, &id)); + } else { + static bool reported = false; + if (!reported) { + Log::Warning(Event::OpenGL, "Not using Vertex Array Objects"); + reported = true; + } + } return UniqueVertexArray(std::move(id), { this }); } diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 636dfc9ea..d1be79424 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -222,6 +222,10 @@ private: std::vector abandonedVertexArrays; std::vector abandonedFramebuffers; std::vector abandonedRenderbuffers; + +public: + // For testing + bool disableVAOExtension = false; }; } // namespace gl diff --git a/src/mbgl/gl/segment.hpp b/src/mbgl/gl/segment.hpp index bb9f2f1ee..7ce90e53a 100644 --- a/src/mbgl/gl/segment.hpp +++ b/src/mbgl/gl/segment.hpp @@ -37,12 +37,17 @@ public: context.vertexBuffer.setDirty(); } - context.vertexArrayObject = *vao; - - if (indexBuffer != indexBuffer_) { - indexBuffer = indexBuffer_; - context.elementBuffer.setDirty(); + if (*vao) { + context.vertexArrayObject = *vao; + if (indexBuffer != indexBuffer_) { + indexBuffer = indexBuffer_; + context.elementBuffer.setDirty(); + context.elementBuffer = indexBuffer_; + } + } else { + // No VAO support. Force attributes to be rebound. context.elementBuffer = indexBuffer_; + variableBindings = {}; } Attributes::bind(context, diff --git a/test/fixtures/map/no_vao/expected.png b/test/fixtures/map/no_vao/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b7c427628f8e092434558973d25fa44ea61f2a GIT binary patch literal 9832 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 literal 0 HcmV?d00001 diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index fd3bfe58d..aec181e05 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -305,6 +306,24 @@ TEST(Map, AddLayer) { test::checkImage("test/fixtures/map/add_layer", test::render(map, test.view)); } +TEST(Map, WithoutVAOExtension) { + MapTest test; + + test.backend.getContext().disableVAOExtension = true; + +#ifdef MBGL_ASSET_ZIP + // Regenerate with `cd test/fixtures/api/ && zip -r assets.zip assets/` + DefaultFileSource fileSource(":memory:", "test/fixtures/api/assets.zip"); +#else + DefaultFileSource fileSource(":memory:", "test/fixtures/api/assets"); +#endif + + Map map(test.backend, test.view.size, 1, fileSource, test.threadPool, MapMode::Still); + map.setStyleJSON(util::read_file("test/fixtures/api/water.json")); + + test::checkImage("test/fixtures/map/no_vao", test::render(map, test.view), 0.002); +} + TEST(Map, RemoveLayer) { MapTest test;