Browse Source

DebugTools: make bufferData()/bufferSubData() available on WebGL 2.0

Co-authored-by: Vladimír Vondruš <mosra@centrum.cz>
gltestlib-symbol-duplication
Pablo Escobar 4 years ago committed by Vladimír Vondruš
parent
commit
1ac982f258
  1. 8
      src/Magnum/DebugTools/BufferData.cpp
  2. 24
      src/Magnum/DebugTools/BufferData.h
  3. 2
      src/Magnum/DebugTools/CMakeLists.txt
  4. 4
      src/Magnum/DebugTools/Test/BufferDataGLTest.cpp
  5. 2
      src/Magnum/DebugTools/Test/CMakeLists.txt
  6. 18
      src/Magnum/DebugTools/Test/TextureImageGLTest.cpp

8
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 <Corrade/Utility/Algorithms.h>
#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<T>() */
@ -49,7 +50,7 @@ void bufferSubData(GL::Buffer& buffer, GLintptr offset, GLsizeiptr size, void* o
#endif
Containers::Array<char> 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<char> data{NoInit, std::size_t(size)};
@ -66,3 +67,4 @@ Containers::Array<char> bufferData(GL::Buffer& buffer) {
}
}}
#endif

24
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<char> 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<class T> 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<char> 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<class T = char> 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

2
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)

4
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();
};

2
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()

18
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};

Loading…
Cancel
Save