Skip to content

Commit

Permalink
[Wasm] Make GL backend ready for Emscripten.
Browse files Browse the repository at this point in the history
- Added WebGL profile to OpenGL backend; Can be loaded for Emscripten as "WebGL" backend.
- Fixed various compile issues with Emscripten.
- Deprecated versioned identifiers for RendererID::OpenGLES* and replaced it with OpenGLES, WebGL, and WebGPU identifiers.
  • Loading branch information
LukasBanana committed Aug 22, 2024
1 parent 5c69511 commit 7305882
Show file tree
Hide file tree
Showing 35 changed files with 910 additions and 161 deletions.
20 changes: 15 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,9 @@ option(LLGL_BUILD_EXAMPLES "Include example projects" OFF)
option(LLGL_BUILD_RENDERER_NULL "Include Null renderer project" ON)

if(NOT LLGL_UWP_PLATFORM)
if(LLGL_MOBILE_PLATFORM OR EMSCRIPTEN)
if(EMSCRIPTEN)
option(LLGL_BUILD_RENDERER_WEBGL "Include WebGL renderer project" ON)
elseif(LLGL_MOBILE_PLATFORM)
option(LLGL_BUILD_RENDERER_OPENGLES3 "Include OpenGLES 3 renderer project" ON)
else()
option(LLGL_BUILD_RENDERER_OPENGL "Include OpenGL renderer project" ON)
Expand Down Expand Up @@ -485,9 +487,13 @@ else()
set(SUMMARY_TARGET_ARCH "x86")
endif()

if(EMSCRIPTEN)
if(EMSCRIPTEN)
add_compile_options("SHELL:-s USE_PTHREADS")
add_link_options("SHELL:-s USE_PTHREADS")
add_link_options("SHELL:-s USE_PTHREADS")

# LLGL needs at least WebGL 2.0
add_link_options("SHELL:-s MIN_WEBGL_VERSION=2")
add_link_options("SHELL:-s MAX_WEBGL_VERSION=2")
endif()


Expand Down Expand Up @@ -690,7 +696,7 @@ elseif(APPLE)
target_link_libraries(LLGL "-framework CoreVideo")
endif()
elseif(EMSCRIPTEN)
###
target_link_libraries(LLGL embind)
elseif(UNIX)
target_link_libraries(LLGL X11 pthread Xrandr)
#elseif(LLGL_UWP_PLATFORM)
Expand All @@ -709,7 +715,7 @@ if(LLGL_BUILD_RENDERER_NULL)
add_subdirectory(sources/Renderer/Null)
endif()

if(LLGL_BUILD_RENDERER_OPENGL OR LLGL_BUILD_RENDERER_OPENGLES3)
if(LLGL_BUILD_RENDERER_OPENGL OR LLGL_BUILD_RENDERER_OPENGLES3 OR LLGL_BUILD_RENDERER_WEBGL)
add_subdirectory(sources/Renderer/OpenGL)
endif()

Expand Down Expand Up @@ -799,6 +805,10 @@ if(LLGL_BUILD_RENDERER_OPENGLES3)
message(STATUS "Build Renderer: ${LLGL_GL_ENABLE_OPENGLES}")
endif()

if(LLGL_BUILD_RENDERER_WEBGL)
message(STATUS "Build Renderer: WebGL")
endif()

if(LLGL_BUILD_RENDERER_VULKAN)
message(STATUS "Build Renderer: Vulkan")
endif()
Expand Down
4 changes: 3 additions & 1 deletion examples/Cpp/ExampleBase/ExampleBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ static constexpr const char* GetDefaultRendererModule()
return "Metal";
#elif defined LLGL_OS_ANDROID
return "OpenGLES3";
#elif defined LLGL_OS_EMSCRIPTEN
return "WebGL";
#else
return "OpenGL";
#endif
Expand Down Expand Up @@ -941,7 +943,7 @@ bool ExampleBase::IsOpenGL() const
return
(
renderer->GetRendererID() == LLGL::RendererID::OpenGL ||
renderer->GetRendererID() == LLGL::RendererID::OpenGLES3
renderer->GetRendererID() == LLGL::RendererID::OpenGLES
);
}

Expand Down
2 changes: 1 addition & 1 deletion examples/Cpp/ShadowMapping/Example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ class Example_ShadowMapping : public ExampleBase
LLGL::SamplerDescriptor shadowSamplerDesc;
{
// Clamp-to-border sampler address mode requires GLES 3.2, so use standard clamp mode in case hardware only supports GLES 3.0
if (renderer->GetRendererID() == LLGL::RendererID::OpenGLES3)
if (renderer->GetRendererID() == LLGL::RendererID::OpenGLES)
{
shadowSamplerDesc.addressModeU = LLGL::SamplerAddressMode::Clamp;
shadowSamplerDesc.addressModeV = LLGL::SamplerAddressMode::Clamp;
Expand Down
15 changes: 12 additions & 3 deletions include/LLGL/RenderSystemFlags.h
Original file line number Diff line number Diff line change
Expand Up @@ -240,16 +240,25 @@ struct RendererID

static constexpr int Null = 0x00000001; //!< ID number for a Null renderer. This renderer does not render anything but provides the same interface for debugging purposes.
static constexpr int OpenGL = 0x00000002; //!< ID number for an OpenGL renderer.
static constexpr int OpenGLES1 = 0x00000003; //!< ID number for an OpenGL ES 1 renderer.
static constexpr int OpenGLES2 = 0x00000004; //!< ID number for an OpenGL ES 2 renderer.
static constexpr int OpenGLES3 = 0x00000005; //!< ID number for an OpenGL ES 3 renderer.
static constexpr int OpenGLES = 0x00000003; //!< ID number for an OpenGL ES renderer.
static constexpr int WebGL = 0x00000004; //!< ID number for a WebGL renderer.
static constexpr int WebGPU = 0x00000005; //!< ID number for a WebGPU renderer.
static constexpr int Direct3D9 = 0x00000006; //!< ID number for a Direct3D 9 renderer.
static constexpr int Direct3D10 = 0x00000007; //!< ID number for a Direct3D 10 renderer.
static constexpr int Direct3D11 = 0x00000008; //!< ID number for a Direct3D 11 renderer.
static constexpr int Direct3D12 = 0x00000009; //!< ID number for a Direct3D 12 renderer.
static constexpr int Vulkan = 0x0000000A; //!< ID number for a Vulkan renderer.
static constexpr int Metal = 0x0000000B; //!< ID number for a Metal renderer.

LLGL_DEPRECATED("LLGL::RendererID::OpenGLES1 is deprecated since 0.04b; Use LLGL::RendererID::OpenGLES instead!", "OpenGLES")
static constexpr int OpenGLES1 = RendererID::OpenGLES;

LLGL_DEPRECATED("LLGL::RendererID::OpenGLES2 is deprecated since 0.04b; Use LLGL::RendererID::OpenGLES instead!", "OpenGLES")
static constexpr int OpenGLES2 = RendererID::OpenGLES;

LLGL_DEPRECATED("LLGL::RendererID::OpenGLES3 is deprecated since 0.04b; Use LLGL::RendererID::OpenGLES instead!", "OpenGLES")
static constexpr int OpenGLES3 = RendererID::OpenGLES;

static constexpr int Reserved = 0x000000FF; //!< Highest ID number for reserved future renderers. Value is 0x000000ff.
};

Expand Down
5 changes: 5 additions & 0 deletions sources/Platform/Emscripten/EmscriptenDebug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ LLGL_EXPORT void DebugPuts(const char* text)
::fprintf(stderr, "%s\n", text);
}

LLGL_EXPORT UTF8String DebugStackTrace(unsigned firstStackFrame, unsigned maxNumStackFrames)
{
return {}; //TODO
}


} // /namespace LLGL

Expand Down
6 changes: 3 additions & 3 deletions sources/Platform/Emscripten/EmscriptenDisplay.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* LinuxDisplay.h
* EmscriptenDisplay.cpp
*
* Copyright (c) 2015 Lukas Hermanns. All rights reserved.
* Licensed under the terms of the BSD 3-Clause license (see LICENSE.txt).
Expand Down Expand Up @@ -73,7 +73,7 @@ bool Display::SetCursorPosition(const Offset2D& position)
Offset2D Display::GetCursorPosition()
{
Offset2D rootPosition = { 0, 0 };
Offset2D childPosition = { 0, 0 };
//Offset2D childPosition = { 0, 0 };
return rootPosition;
}

Expand All @@ -83,7 +83,7 @@ Offset2D Display::GetCursorPosition()
*/

EmscriptenDisplay::EmscriptenDisplay(int screenIndex) :
screen_ { screenIndex }
screen_ { screenIndex }
{
}

Expand Down
2 changes: 1 addition & 1 deletion sources/Platform/Emscripten/EmscriptenTimer.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* LinuxTimer.cpp
* EmscriptenTimer.cpp
*
* Copyright (c) 2015 Lukas Hermanns. All rights reserved.
* Licensed under the terms of the BSD 3-Clause license (see LICENSE.txt).
Expand Down
4 changes: 1 addition & 3 deletions sources/Platform/Emscripten/EmscriptenWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,7 @@ namespace LLGL

bool Surface::ProcessEvents()
{


return true;
return true; // dummy - handled by web browser
}


Expand Down
3 changes: 2 additions & 1 deletion sources/Platform/Emscripten/MapKey.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
/*
* MapKey.cpp (Linux)
* MapKey.cpp (Emscripten)
*
* Copyright (c) 2015 Lukas Hermanns. All rights reserved.
* Licensed under the terms of the BSD 3-Clause license (see LICENSE.txt).
*/

#include "MapKey.h"
#include <map>
#include <emscripten.h>
#include <emscripten/key_codes.h>


Expand Down
1 change: 0 additions & 1 deletion sources/Platform/Emscripten/MapKey.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@


#include <LLGL/Key.h>
#include <emscripten.h>


namespace LLGL
Expand Down
2 changes: 1 addition & 1 deletion sources/Renderer/OpenGL/Buffer/GLBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ void GLBuffer::UnmapBuffer()
#endif // /GL_ARB_direct_state_access
{
GLStateManager::Get().BindGLBuffer(*this);
glUnmapBuffer(GetGLTarget());
GLProfile::UnmapBuffer(GetGLTarget());
}
}

Expand Down
97 changes: 63 additions & 34 deletions sources/Renderer/OpenGL/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ find_source_files(FilesRendererGLShader CXX ${PROJECT_SOURCE_DIR}/Shader
find_source_files(FilesRendererGLTexture CXX ${PROJECT_SOURCE_DIR}/Texture)
find_source_files(FilesRendererGLCoreProfile CXX ${PROJECT_SOURCE_DIR}/GLCoreProfile)
find_source_files(FilesRendererGLESProfile CXX ${PROJECT_SOURCE_DIR}/GLESProfile)
find_source_files(FilesRendererWebGLProfile CXX ${PROJECT_SOURCE_DIR}/WebGLProfile)
find_source_files(FilesIncludeGL INC ${BACKEND_INCLUDE_DIR}/OpenGL)

# Remove selected files if GL2X is disabled
Expand Down Expand Up @@ -107,38 +108,6 @@ elseif(UNIX)
endif()
endif()

set(
FilesGL
${FilesRendererGL}
${FilesRendererGLBuffer}
${FilesRendererGLCommand}
${FilesRendererGLExt}
${FilesRendererGLPlatform}
${FilesRendererGLPlatformBase}
${FilesRendererGLRenderState}
${FilesRendererGLShader}
${FilesRendererGLTexture}
${FilesRendererGLCoreProfile}
${FilesIncludeGL}
${FilesIncludeGLPlatform}
)

set(
FilesGLES3
${FilesRendererGL}
${FilesRendererGLBuffer}
${FilesRendererGLCommand}
${FilesRendererGLExt}
${FilesRendererGLPlatform}
${FilesRendererGLPlatformBase}
${FilesRendererGLRenderState}
${FilesRendererGLES3Shader}
${FilesRendererGLTexture}
${FilesRendererGLESProfile}
${FilesIncludeGL}
${FilesIncludeGLPlatform}
)


# === Source group folders ===

Expand All @@ -152,6 +121,7 @@ source_group("OpenGL\\Shader" FILES ${FilesRendererGLShader})
source_group("OpenGL\\Texture" FILES ${FilesRendererGLTexture})
source_group("OpenGL\\GLCoreProfile" FILES ${FilesRendererGLCoreProfile})
source_group("OpenGL\\GLESProfile" FILES ${FilesRendererGLESProfile})
source_group("OpenGL\\WebGLProfile" FILES ${FilesRendererWebGLProfile})
source_group("Include\\Platform" FILES ${FilesIncludeGL} ${FilesIncludeGLPlatform})


Expand All @@ -165,8 +135,53 @@ endif()

# === Projects ===

if(LLGL_BUILD_RENDERER_WEBGL)
# WebGL Renderer
set(
FilesWebGL
${FilesRendererGL}
${FilesRendererGLBuffer}
${FilesRendererGLCommand}
${FilesRendererGLExt}
${FilesRendererGLPlatform}
${FilesRendererGLPlatformBase}
${FilesRendererGLRenderState}
${FilesRendererGLES3Shader}
${FilesRendererGLTexture}
${FilesRendererWebGLProfile}
${FilesIncludeGL}
${FilesIncludeGLPlatform}
)

include("${EXTERNAL_MODULE_DIR}/FindOpenGLES3.cmake")
if(OPENGLES_FOUND)
include_directories(${OPENGLES_INCLUDE_DIR})
add_llgl_module(LLGL_WebGL LLGL_BUILD_RENDERER_WEBGL "${FilesWebGL}")
target_link_libraries(LLGL_WebGL LLGL ${OPENGLES_LIBRARIES})
ADD_PROJECT_DEFINE(LLGL_WebGL LLGL_WEBGL)
else()
message(FATAL_ERROR "LLGL_BUILD_RENDERER_WEBGL failed: missing OpenGLES libraries")
endif()
endif()

if(LLGL_BUILD_RENDERER_OPENGLES3)
# OpenGLES Renderer
set(
FilesGLES3
${FilesRendererGL}
${FilesRendererGLBuffer}
${FilesRendererGLCommand}
${FilesRendererGLExt}
${FilesRendererGLPlatform}
${FilesRendererGLPlatformBase}
${FilesRendererGLRenderState}
${FilesRendererGLES3Shader}
${FilesRendererGLTexture}
${FilesRendererGLESProfile}
${FilesIncludeGL}
${FilesIncludeGLPlatform}
)

include("${EXTERNAL_MODULE_DIR}/FindOpenGLES3.cmake")
if(OPENGLES_FOUND)
include_directories(${OPENGLES_INCLUDE_DIR})
Expand All @@ -176,8 +191,6 @@ if(LLGL_BUILD_RENDERER_OPENGLES3)
if(APPLE)
target_link_libraries(LLGL_OpenGLES3 LLGL ${OPENGLES_LIBRARIES} "-framework Foundation -framework UIKit -framework QuartzCore -framework OpenGLES -framework GLKit")
ADD_PROJECT_DEFINE(LLGL_OpenGLES3 GLES_SILENCE_DEPRECATION)
elseif(EMSCRIPTEN)
target_link_libraries(LLGL_OpenGLES3 LLGL ${OPENGLES_LIBRARIES})
else()
target_link_libraries(LLGL_OpenGLES3 LLGL EGL GLESv3)
endif()
Expand All @@ -190,6 +203,22 @@ endif()

if(LLGL_BUILD_RENDERER_OPENGL)
# OpenGL Renderer
set(
FilesGL
${FilesRendererGL}
${FilesRendererGLBuffer}
${FilesRendererGLCommand}
${FilesRendererGLExt}
${FilesRendererGLPlatform}
${FilesRendererGLPlatformBase}
${FilesRendererGLRenderState}
${FilesRendererGLShader}
${FilesRendererGLTexture}
${FilesRendererGLCoreProfile}
${FilesIncludeGL}
${FilesIncludeGLPlatform}
)

set(OpenGL_GL_PREFERENCE GLVND)
find_package(OpenGL REQUIRED)
if(OPENGL_FOUND)
Expand Down
6 changes: 3 additions & 3 deletions sources/Renderer/OpenGL/Ext/GLExtensions.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
#define LLGL_GL_EXTENSIONS_H


#ifdef LLGL_OPENGLES3
# include "../GLESProfile/GLESExtensions.h"
#else
#ifdef LLGL_OPENGL
# include "../GLCoreProfile/GLCoreExtensions.h"
#else
# include "../GLESProfile/GLESExtensions.h"
#endif


Expand Down
6 changes: 4 additions & 2 deletions sources/Renderer/OpenGL/GLCore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,10 +177,12 @@ int GLGetVersion()
[[noreturn]]
void ErrUnsupportedGLProc(const char* name)
{
#ifdef LLGL_OPENGLES3
#if defined(LLGL_OPENGL)
LLGL_TRAP("illegal use of unsupported OpenGL procedure: %s", name);
#elif defined(LLGL_OS_EMSCRIPTEN)
LLGL_TRAP("illegal use of unsupported OpenGLES procedure: %s", name);
#else
LLGL_TRAP("illegal use of unsupported OpenGL procedure: %s", name);
LLGL_TRAP("illegal use of unsupported WebGL procedure: %s", name);
#endif
}

Expand Down
5 changes: 5 additions & 0 deletions sources/Renderer/OpenGL/GLCoreProfile/GLCoreProfile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,11 @@ void* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr /*length*/, GLbi
return reinterpret_cast<void*>(ptr + offset);
}

void UnmapBuffer(GLenum target)
{
glUnmapBuffer(target);
}

void DrawBuffer(GLenum buf)
{
glDrawBuffer(buf);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include "GLESExtensionsProxy.h"
#include "OpenGLES.h"
#include "../GLCore.h"
#if defined(LLGL_OS_ANDROID)
#if defined(LLGL_OS_ANDROID) || defined(LLGL_OS_EMSCRIPTEN)
# include <EGL/egl.h>
#endif
#include <LLGL/Utils/ForRange.h>
Expand Down
2 changes: 1 addition & 1 deletion sources/Renderer/OpenGL/GLESProfile/GLESExtensionsDecl.inl
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// THIS FILE MUST NOT HAVE A HEADER GUARD


#ifndef __APPLE__
#if !GL_GLEXT_PROTOTYPES

#ifndef DECL_GLPROC
#error Missing definition of macro DECL_GLPROC(PFNTYPE, NAME, RTYPE, ARGS)
Expand Down
Loading

0 comments on commit 7305882

Please sign in to comment.