From 9a8ec588dcc7b9fe4429ef0c91ed1feffff01ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 4 Jul 2013 00:54:16 +0200 Subject: [PATCH] Text: fallback to OES_mapbuffer if EXT_map_buffer_range is not supported. The renderer emits warning about crappy hardware, similarly to what GlyphCache does. --- src/Text/Test/GlyphCacheGLTest.cpp | 2 ++ src/Text/Test/TextRendererGLTest.cpp | 9 +++++++ src/Text/TextRenderer.cpp | 38 +++++++++++++++++++++++----- src/Text/TextRenderer.h | 7 ++--- 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/Text/Test/GlyphCacheGLTest.cpp b/src/Text/Test/GlyphCacheGLTest.cpp index 7578f57b5..0e2b42874 100644 --- a/src/Text/Test/GlyphCacheGLTest.cpp +++ b/src/Text/Test/GlyphCacheGLTest.cpp @@ -46,7 +46,9 @@ void GlyphCacheGLTest::initialize() { Text::GlyphCache cache({1024, 2048}); MAGNUM_VERIFY_NO_ERROR(); + #ifndef MAGNUM_TARGET_GLES CORRADE_COMPARE(cache.texture()->imageSize(0), Vector2i(1024, 2048)); + #endif } void GlyphCacheGLTest::access() { diff --git a/src/Text/Test/TextRendererGLTest.cpp b/src/Text/Test/TextRendererGLTest.cpp index 22f32a8d4..fdfc9f5c8 100644 --- a/src/Text/Test/TextRendererGLTest.cpp +++ b/src/Text/Test/TextRendererGLTest.cpp @@ -168,6 +168,8 @@ void TextRendererGLTest::renderMesh() { std::tie(mesh, bounds) = Text::TextRenderer3D::render(&font, nullptr, 0.25f, "abc", &vertexBuffer, &indexBuffer, Buffer::Usage::StaticDraw); MAGNUM_VERIFY_NO_ERROR(); + /** @todo How to verify this on ES? */ + #ifndef MAGNUM_TARGET_GLES /* Vertex buffer contents */ Containers::Array vertices = vertexBuffer.data(); CORRADE_COMPARE(std::vector(vertices.begin(), vertices.end()), (std::vector{ @@ -193,6 +195,7 @@ void TextRendererGLTest::renderMesh() { 4, 5, 6, 5, 7, 6, 8, 9, 10, 9, 11, 10 })); + #endif /* Bounds */ CORRADE_COMPARE(bounds, Rectangle({0.0f, -0.5f}, {5.0f, 1.0f})); @@ -209,6 +212,8 @@ void TextRendererGLTest::mutableText() { renderer.reserve(4, Buffer::Usage::StaticDraw, Buffer::Usage::StaticDraw); MAGNUM_VERIFY_NO_ERROR(); CORRADE_COMPARE(renderer.capacity(), 4); + /** @todo How to verify this on ES? */ + #ifndef MAGNUM_TARGET_GLES Containers::Array indices = renderer.indexBuffer()->data(); CORRADE_COMPARE(std::vector(indices.begin(), indices.end()), (std::vector{ 0, 1, 2, 1, 3, 2, @@ -216,10 +221,13 @@ void TextRendererGLTest::mutableText() { 8, 9, 10, 9, 11, 10, 12, 13, 14, 13, 15, 14 })); + #endif /* Render text */ renderer.render("abc"); MAGNUM_VERIFY_NO_ERROR(); + /** @todo How to verify this on ES? */ + #ifndef MAGNUM_TARGET_GLES Containers::Array vertices = renderer.vertexBuffer()->subData(0, 48); CORRADE_COMPARE(std::vector(vertices.begin(), vertices.end()), (std::vector{ 0.0f, 0.5f, 0.0f, 10.0f, @@ -237,6 +245,7 @@ void TextRendererGLTest::mutableText() { 5.0f, 1.0f, 18.0f, 10.0f, 5.0f, -0.5f, 18.0f, 0.0f })); + #endif /* Updated bounds */ CORRADE_COMPARE(renderer.rectangle(), Rectangle({0.0f, -0.5f}, {5.0f, 1.0f})); diff --git a/src/Text/TextRenderer.cpp b/src/Text/TextRenderer.cpp index 19833c636..c2d7d0686 100644 --- a/src/Text/TextRenderer.cpp +++ b/src/Text/TextRenderer.cpp @@ -208,10 +208,13 @@ template std::tuple TextRendererisExtensionSupported()) { + MAGNUM_ASSERT_EXTENSION_SUPPORTED(Extensions::GL::OES::mapbuffer); + Warning() << "Text::TextRenderer:" << Extensions::GL::EXT::map_buffer_range::string() + << "is not supported, using less efficient" << Extensions::GL::OES::mapbuffer::string() + << "instead"; + } #endif /* Vertex buffer configuration depends on dimension count, done in subclass */ @@ -254,8 +257,18 @@ void AbstractTextRenderer::reserve(const uint32_t glyphCount, const Buffer::Usag _mesh.setIndexCount(0) ->setIndexBuffer(&_indexBuffer, 0, indexType, 0, vertexCount); + /* Map buffer for filling */ + void* indices; + #ifdef MAGNUM_TARGET_GLES2 + if(Context::current()->isExtensionSupported()) + #endif + CORRADE_INTERNAL_ASSERT_OUTPUT(indices = _indexBuffer.map(0, indicesSize, + Buffer::MapFlag::InvalidateBuffer|Buffer::MapFlag::Write)); + #ifdef MAGNUM_TARGET_GLES2 + else CORRADE_INTERNAL_ASSERT_OUTPUT(indices = _indexBuffer.map(Buffer::MapAccess::WriteOnly)); + #endif + /* Prefill index buffer */ - void* indices = _indexBuffer.map(0, indicesSize, Buffer::MapFlag::InvalidateBuffer|Buffer::MapFlag::Write); if(vertexCount < 255) createIndices(indices, glyphCount); else if(vertexCount < 65535) @@ -274,9 +287,20 @@ void AbstractTextRenderer::render(const std::string& text) { /* Reset rendered rectangle */ _rectangle = {}; + /* Map buffer for rendering */ + Vertex* vertices; + #ifdef MAGNUM_TARGET_GLES2 + if(Context::current()->isExtensionSupported()) + #endif + CORRADE_INTERNAL_ASSERT_OUTPUT(vertices = static_cast(_vertexBuffer.map(0, + layouter->glyphCount()*4*sizeof(Vertex), + Buffer::MapFlag::InvalidateBuffer|Buffer::MapFlag::Write))); + #ifdef MAGNUM_TARGET_GLES2 + else CORRADE_INTERNAL_ASSERT_OUTPUT(vertices = + static_cast(_vertexBuffer.map(Buffer::MapAccess::WriteOnly))); + #endif + /* Render all glyphs */ - Vertex* const vertices = static_cast(_vertexBuffer.map(0, layouter->glyphCount()*4*sizeof(Vertex), - Buffer::MapFlag::InvalidateBuffer|Buffer::MapFlag::Write)); Vector2 cursorPosition; for(UnsignedInt i = 0; i != layouter->glyphCount(); ++i) { /* Position of the texture in the resulting glyph, texture coordinates */ diff --git a/src/Text/TextRenderer.h b/src/Text/TextRenderer.h index 57ba2d6fa..289d44940 100644 --- a/src/Text/TextRenderer.h +++ b/src/Text/TextRenderer.h @@ -197,9 +197,10 @@ renderer.mesh().draw(); @section TextRenderer-extensions Required OpenGL functionality -Mutable text rendering requires @extension{ARB,map_buffer_range} (also part of -OpenGL ES 3.0 or available as @es_extension{EXT,map_buffer_range} in ES 2.0) -for asynchronous buffer updates. +Mutable text rendering requires @extension{ARB,map_buffer_range} on desktop +OpenGL (also part of OpenGL ES 3.0). If @es_extension{EXT,map_buffer_range} is +not available in ES 2.0, at least @es_extension{OES,mapbuffer} must be +supported for asynchronous buffer updates. @see TextRenderer2D, TextRenderer3D, Font, Shaders::AbstractVectorShader */