From 1ac982f258422effe76165f073d11c19b4ab39b6 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Mon, 23 May 2022 14:14:43 +0200 Subject: [PATCH] DebugTools: make bufferData()/bufferSubData() available on WebGL 2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Vladimír Vondruš --- src/Magnum/DebugTools/BufferData.cpp | 8 ++++--- src/Magnum/DebugTools/BufferData.h | 24 ++++++++++--------- src/Magnum/DebugTools/CMakeLists.txt | 2 +- .../DebugTools/Test/BufferDataGLTest.cpp | 4 ++++ src/Magnum/DebugTools/Test/CMakeLists.txt | 2 +- .../DebugTools/Test/TextureImageGLTest.cpp | 18 ++++++++------ 6 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/Magnum/DebugTools/BufferData.cpp b/src/Magnum/DebugTools/BufferData.cpp index f41fcdea1..cfc4acc32 100644 --- a/src/Magnum/DebugTools/BufferData.cpp +++ b/src/Magnum/DebugTools/BufferData.cpp @@ -29,13 +29,14 @@ #include "Magnum/GL/Buffer.h" -#if defined(MAGNUM_TARGET_GLES) || defined(MAGNUM_BUILD_DEPRECATED) +#if !defined(MAGNUM_TARGET_WEBGL) && (defined(MAGNUM_TARGET_GLES) || defined(MAGNUM_BUILD_DEPRECATED)) #include #endif +#if !(defined(MAGNUM_TARGET_WEBGL) && (defined(MAGNUM_TARGET_GLES2) || __EMSCRIPTEN_major__*10000 + __EMSCRIPTEN_minor__*100 + __EMSCRIPTEN_tiny__ < 20017)) namespace Magnum { namespace DebugTools { -#ifdef MAGNUM_BUILD_DEPRECATED +#if defined(MAGNUM_BUILD_DEPRECATED) && !defined(MAGNUM_TARGET_WEBGL) namespace Implementation { /* Used only by deprecated bufferSubData() */ @@ -49,7 +50,7 @@ void bufferSubData(GL::Buffer& buffer, GLintptr offset, GLsizeiptr size, void* o #endif Containers::Array bufferSubData(GL::Buffer& buffer, GLintptr offset, GLsizeiptr size) { - #ifndef MAGNUM_TARGET_GLES + #if !defined(MAGNUM_TARGET_GLES) || defined(MAGNUM_TARGET_WEBGL) return buffer.subData(offset, size); #else Containers::Array data{NoInit, std::size_t(size)}; @@ -66,3 +67,4 @@ Containers::Array bufferData(GL::Buffer& buffer) { } }} +#endif diff --git a/src/Magnum/DebugTools/BufferData.h b/src/Magnum/DebugTools/BufferData.h index e1c55d8b7..12af8aef9 100644 --- a/src/Magnum/DebugTools/BufferData.h +++ b/src/Magnum/DebugTools/BufferData.h @@ -25,7 +25,7 @@ DEALINGS IN THE SOFTWARE. */ -#if defined(MAGNUM_TARGET_GL) && !defined(MAGNUM_TARGET_WEBGL) +#if defined(MAGNUM_TARGET_GL) && !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) /** @file * @brief Function @ref Magnum::DebugTools::bufferData(), @ref Magnum::DebugTools::bufferSubData() */ @@ -45,7 +45,7 @@ #include "Magnum/GL/Buffer.h" #endif -#if defined(MAGNUM_TARGET_GL) && !defined(MAGNUM_TARGET_WEBGL) +#if defined(MAGNUM_TARGET_GL) && !(defined(MAGNUM_TARGET_WEBGL) && (defined(MAGNUM_TARGET_GLES2) || __EMSCRIPTEN_major__*10000 + __EMSCRIPTEN_minor__*100 + __EMSCRIPTEN_tiny__ < 20017)) namespace Magnum { namespace DebugTools { #ifdef MAGNUM_BUILD_DEPRECATED @@ -60,8 +60,8 @@ namespace Implementation { @brief Buffer subdata Emulates @ref GL::Buffer::subData() call on platforms that don't support it -(such as OpenGL ES) by using @ref GL::Buffer::mapRead(). On desktop GL it's -just an alias to @ref GL::Buffer::subData(). +(such as OpenGL ES) by using @ref GL::Buffer::mapRead(). On desktop GL and +WebGL 2.0 it's just an alias to @ref GL::Buffer::subData(). @note This function is available only if Magnum is compiled with @ref MAGNUM_TARGET_GL "TARGET_GL" enabled (done by default). See @@ -69,11 +69,12 @@ just an alias to @ref GL::Buffer::subData(). @requires_gles30 Extension @gl_extension{EXT,map_buffer_range} in OpenGL ES 2.0. -@requires_gles Buffer mapping is not available in WebGL. +@requires_webgl20 Buffer data queries or buffer mapping are not available in + WebGL 1.0. Emscripten 2.0.17 or higher is required in WebGL2. */ MAGNUM_DEBUGTOOLS_EXPORT Containers::Array bufferSubData(GL::Buffer& buffer, GLintptr offset, GLsizeiptr size); -#ifdef MAGNUM_BUILD_DEPRECATED +#if defined(MAGNUM_BUILD_DEPRECATED) && !defined(MAGNUM_TARGET_WEBGL) /** @copybrief bufferSubData() @m_deprecated_since_latest Use non-templated @ref bufferSubData() and @@ -97,8 +98,8 @@ template CORRADE_DEPRECATED("use non-templated bufferSubData() and Cont @brief Buffer data Emulates @ref GL::Buffer::data() call on platforms that don't support it (such -as OpenGL ES) by using @ref GL::Buffer::mapRead(). On desktop GL it's just an -alias to @ref GL::Buffer::data(). +as OpenGL ES) by using @ref GL::Buffer::mapRead(). On desktop GL and WebGL 2.0 +it's just an alias to @ref GL::Buffer::data(). @note This function is available only if Magnum is compiled with @ref MAGNUM_TARGET_GL "TARGET_GL" enabled (done by default). See @@ -106,11 +107,12 @@ alias to @ref GL::Buffer::data(). @requires_gles30 Extension @gl_extension{EXT,map_buffer_range} in OpenGL ES 2.0. -@requires_gles Buffer mapping is not available in WebGL. +@requires_webgl20 Buffer data queries or buffer mapping are not available in + WebGL 1.0. Emscripten 2.0.17 or higher is required in WebGL2. */ MAGNUM_DEBUGTOOLS_EXPORT Containers::Array bufferData(GL::Buffer& buffer); -#ifdef MAGNUM_BUILD_DEPRECATED +#if defined(MAGNUM_BUILD_DEPRECATED) && !defined(MAGNUM_TARGET_WEBGL) /** @copybrief bufferData() @m_deprecated_since_latest Use non-templated @ref bufferData() and @@ -134,7 +136,7 @@ template CORRADE_DEPRECATED("use non-templated bufferData() and }} #else -#error this header is available only in the OpenGL (ES) build and not available in the WebGL build +#error this header is not available in a WebGL 1.0 build or on Emscripten < 2.0.17 #endif #endif diff --git a/src/Magnum/DebugTools/CMakeLists.txt b/src/Magnum/DebugTools/CMakeLists.txt index f8ddeadfe..2618fbab7 100644 --- a/src/Magnum/DebugTools/CMakeLists.txt +++ b/src/Magnum/DebugTools/CMakeLists.txt @@ -72,7 +72,7 @@ if(TARGET_GL) endif() endif() - if(NOT MAGNUM_TARGET_WEBGL) + if(NOT (MAGNUM_TARGET_WEBGL AND MAGNUM_TARGET_GLES2)) list(APPEND MagnumDebugTools_SRCS BufferData.cpp) diff --git a/src/Magnum/DebugTools/Test/BufferDataGLTest.cpp b/src/Magnum/DebugTools/Test/BufferDataGLTest.cpp index 4faf02eec..e75442ddd 100644 --- a/src/Magnum/DebugTools/Test/BufferDataGLTest.cpp +++ b/src/Magnum/DebugTools/Test/BufferDataGLTest.cpp @@ -37,6 +37,10 @@ namespace Magnum { namespace DebugTools { namespace Test { namespace { struct BufferDataGLTest: GL::OpenGLTester { explicit BufferDataGLTest(); + /* To avoid complex ifdefing on Esmcripten, assumes that tests are built + on 2.0.17+. On older versions the linker will fail due to missing + glGetBufferSubData(). */ + void data(); void subData(); }; diff --git a/src/Magnum/DebugTools/Test/CMakeLists.txt b/src/Magnum/DebugTools/Test/CMakeLists.txt index f71ed0a35..290695b4e 100644 --- a/src/Magnum/DebugTools/Test/CMakeLists.txt +++ b/src/Magnum/DebugTools/Test/CMakeLists.txt @@ -118,7 +118,7 @@ if(TARGET_GL) corrade_add_test(DebugToolsTextureImageGLTest TextureImageGLTest.cpp LIBRARIES MagnumDebugTools MagnumOpenGLTester) - if(NOT MAGNUM_TARGET_WEBGL) + if(NOT (MAGNUM_TARGET_WEBGL AND MAGNUM_TARGET_GLES2)) corrade_add_test(DebugToolsBufferDataGLTest BufferDataGLTest.cpp LIBRARIES MagnumDebugTools MagnumOpenGLTester) endif() diff --git a/src/Magnum/DebugTools/Test/TextureImageGLTest.cpp b/src/Magnum/DebugTools/Test/TextureImageGLTest.cpp index 7bfc0b3b3..e47dfff15 100644 --- a/src/Magnum/DebugTools/Test/TextureImageGLTest.cpp +++ b/src/Magnum/DebugTools/Test/TextureImageGLTest.cpp @@ -38,7 +38,7 @@ #include "Magnum/GL/TextureFormat.h" #include "Magnum/Math/Range.h" -#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) +#ifndef MAGNUM_TARGET_GLES2 #include "Magnum/DebugTools/BufferData.h" #include "Magnum/GL/BufferImage.h" #endif @@ -48,14 +48,18 @@ namespace Magnum { namespace DebugTools { namespace Test { namespace { struct TextureImageGLTest: GL::OpenGLTester { explicit TextureImageGLTest(); + /* To avoid complex ifdefing on Esmcripten, assumes that tests are built + on 2.0.17+. On older versions the linker will fail due to missing + glGetBufferSubData(). */ + void subImage2D(); - #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + #ifndef MAGNUM_TARGET_GLES2 void subImage2DBuffer(); #endif void subImage2DGeneric(); void subImageCube(); - #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + #ifndef MAGNUM_TARGET_GLES2 void subImageCubeBuffer(); #endif @@ -68,13 +72,13 @@ struct TextureImageGLTest: GL::OpenGLTester { TextureImageGLTest::TextureImageGLTest() { addTests({&TextureImageGLTest::subImage2D, - #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + #ifndef MAGNUM_TARGET_GLES2 &TextureImageGLTest::subImage2DBuffer, #endif &TextureImageGLTest::subImage2DGeneric, &TextureImageGLTest::subImageCube, - #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) + #ifndef MAGNUM_TARGET_GLES2 &TextureImageGLTest::subImageCubeBuffer, #endif @@ -111,7 +115,7 @@ void TextureImageGLTest::subImage2D() { Containers::arrayView(Data2D), TestSuite::Compare::Container); } -#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) +#ifndef MAGNUM_TARGET_GLES2 void TextureImageGLTest::subImage2DBuffer() { GL::Texture2D texture; texture.setImage(0, GL::TextureFormat::RGBA8, ImageView2D{GL::PixelFormat::RGBA, GL::PixelType::UnsignedByte, Vector2i{2}, Data2D}); @@ -177,7 +181,7 @@ void TextureImageGLTest::subImageCube() { Containers::arrayView(Data2D), TestSuite::Compare::Container); } -#if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) +#ifndef MAGNUM_TARGET_GLES2 void TextureImageGLTest::subImageCubeBuffer() { ImageView2D view{GL::PixelFormat::RGBA, GL::PixelType::UnsignedByte, Vector2i{2}, Data2D};