[core] Restore support for GL implementations without VAO extension

This commit is contained in:
John Firebaugh
2017-02-08 15:57:58 -08:00
parent 0b3873c7b5
commit 0bbc6b814c
5 changed files with 42 additions and 10 deletions

View File

@@ -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 });
}

View File

@@ -222,6 +222,10 @@ private:
std::vector<VertexArrayID> abandonedVertexArrays;
std::vector<FramebufferID> abandonedFramebuffers;
std::vector<RenderbufferID> abandonedRenderbuffers;
public:
// For testing
bool disableVAOExtension = false;
};
} // namespace gl

View File

@@ -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,

BIN
test/fixtures/map/no_vao/expected.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@@ -6,6 +6,7 @@
#include <mbgl/map/map.hpp>
#include <mbgl/gl/headless_backend.hpp>
#include <mbgl/gl/offscreen_view.hpp>
#include <mbgl/gl/context.hpp>
#include <mbgl/util/default_thread_pool.hpp>
#include <mbgl/sprite/sprite_image.hpp>
#include <mbgl/storage/network_status.hpp>
@@ -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;