Skip to content

Commit

Permalink
Allow selective compilation of only GLES code for embedded devices
Browse files Browse the repository at this point in the history
  • Loading branch information
inniyah committed Aug 3, 2020
1 parent 57ec98a commit 93c0a56
Show file tree
Hide file tree
Showing 8 changed files with 112 additions and 50 deletions.
107 changes: 82 additions & 25 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,16 @@ SET(VERSION 0.1)
INCLUDE(GNUInstallDirs)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src)
ADD_COMPILE_OPTIONS(-Wall -Werror -Wno-unused-but-set-variable -Wno-unused-variable)
ADD_COMPILE_OPTIONS(-Wall -Werror)
ADD_LINK_OPTIONS(LINKER:--as-needed LINKER:--no-undefined LINKER:--no-allow-shlib-undefined)

option(NANOVG_BUILD_EXAMPLES "Build examples" ON)
option(NANOVG_BUILD_GL2 "Build OpenGL 2" ON)
option(NANOVG_BUILD_GL3 "Build OpenGL 2" ON)
option(NANOVG_BUILD_GLES2 "Build OpenGL 2" ON)
option(NANOVG_BUILD_GLES3 "Build OpenGL 2" ON)
option(NANOVG_BUILD_OUI "Build OUI/Blendish" ON)

SET(NANOVG_DEFINES "")
SET(NANOVG_SOURCES "src/nanovg.c")
SET(NANOVG_GL_DEFINES "")
Expand All @@ -16,7 +23,9 @@ SET(NANOVG_GLES_SOURCES "src/nanovg_gl.c" "src/nanovg_gl_utils.c")
SET(NANOVG_OUI_DEFINES "")
SET(NANOVG_OUI_SOURCES "src/oui.c" "src/blendish.c")

IF(NANOVG_BUILD_GL2 OR NANOVG_BUILD_GL3)
LIST(APPEND NANOVG_GL_DEFINES NANOVG_USE_GLEW)
ENDIF()

# Build Library

Expand All @@ -25,58 +34,88 @@ TARGET_INCLUDE_DIRECTORIES(nanovg PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
TARGET_COMPILE_DEFINITIONS(nanovg PRIVATE ${NANOVG_DEFINES})
SET_PROPERTY(TARGET nanovg PROPERTY POSITION_INDEPENDENT_CODE ON)

IF(NANOVG_BUILD_GL2)
ADD_LIBRARY(nanovg_gl2 OBJECT ${NANOVG_GL_SOURCES})
TARGET_INCLUDE_DIRECTORIES(nanovg_gl2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
TARGET_COMPILE_DEFINITIONS(nanovg_gl2 PRIVATE ${NANOVG_GL_DEFINES} NANOVG_GL2)
SET_PROPERTY(TARGET nanovg_gl2 PROPERTY POSITION_INDEPENDENT_CODE ON)
ENDIF()

IF(NANOVG_BUILD_GL3)
ADD_LIBRARY(nanovg_gl3 OBJECT ${NANOVG_GL_SOURCES})
TARGET_INCLUDE_DIRECTORIES(nanovg_gl3 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
TARGET_COMPILE_DEFINITIONS(nanovg_gl3 PRIVATE ${NANOVG_GL_DEFINES} NANOVG_GL3)
SET_PROPERTY(TARGET nanovg_gl3 PROPERTY POSITION_INDEPENDENT_CODE ON)
ENDIF()

IF(NANOVG_BUILD_GLES2)
ADD_LIBRARY(nanovg_gles2 OBJECT ${NANOVG_GLES_SOURCES})
TARGET_INCLUDE_DIRECTORIES(nanovg_gles2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
TARGET_COMPILE_DEFINITIONS(nanovg_gles2 PRIVATE NANOVG_GLES2)
SET_PROPERTY(TARGET nanovg_gles2 PROPERTY POSITION_INDEPENDENT_CODE ON)
ENDIF()

IF(NANOVG_BUILD_GLES3)
ADD_LIBRARY(nanovg_gles3 OBJECT ${NANOVG_GLES_SOURCES})
TARGET_INCLUDE_DIRECTORIES(nanovg_gles3 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
TARGET_COMPILE_DEFINITIONS(nanovg_gles3 PRIVATE NANOVG_GLES3)
SET_PROPERTY(TARGET nanovg_gles3 PROPERTY POSITION_INDEPENDENT_CODE ON)
ENDIF()

IF(NANOVG_BUILD_OUI)
ADD_LIBRARY(nanovg_oui OBJECT ${NANOVG_OUI_SOURCES})
TARGET_INCLUDE_DIRECTORIES(nanovg_oui PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
TARGET_COMPILE_DEFINITIONS(nanovg_oui PRIVATE ${NANOVG_OUI_DEFINES})
SET_PROPERTY(TARGET nanovg_oui PROPERTY POSITION_INDEPENDENT_CODE ON)


ADD_LIBRARY(nanovg_so SHARED
$<TARGET_OBJECTS:nanovg>
$<TARGET_OBJECTS:nanovg_gl2>
$<TARGET_OBJECTS:nanovg_gl3>
$<TARGET_OBJECTS:nanovg_gles2>
$<TARGET_OBJECTS:nanovg_gles3>
$<TARGET_OBJECTS:nanovg_oui>
)
ENDIF()

SET(NANOVG_LIB_NAMES nanovg)
SET(NANOVG_LIB_OBJECTS $<TARGET_OBJECTS:nanovg>)
IF(NANOVG_BUILD_GL2)
SET(NANOVG_LIB_NAMES ${NANOVG_LIB_NAMES} nanovg_gl2)
SET(NANOVG_LIB_OBJECTS ${NANOVG_LIB_OBJECTS} $<TARGET_OBJECTS:nanovg_gl2>)
ENDIF()
IF(NANOVG_BUILD_GL3)
SET(NANOVG_LIB_NAMES ${NANOVG_LIB_NAMES} nanovg_gl3)
SET(NANOVG_LIB_OBJECTS ${NANOVG_LIB_OBJECTS} $<TARGET_OBJECTS:nanovg_gl3>)
ENDIF()
IF(NANOVG_BUILD_GLES2)
SET(NANOVG_LIB_NAMES ${NANOVG_LIB_NAMES} nanovg_gles2)
SET(NANOVG_LIB_OBJECTS ${NANOVG_LIB_OBJECTS} $<TARGET_OBJECTS:nanovg_gles2>)
ENDIF()
IF(NANOVG_BUILD_GLES3)
SET(NANOVG_LIB_NAMES ${NANOVG_LIB_NAMES} nanovg_gles3)
SET(NANOVG_LIB_OBJECTS ${NANOVG_LIB_OBJECTS} $<TARGET_OBJECTS:nanovg_gles3>)
ENDIF()
IF(NANOVG_BUILD_OUI)
SET(NANOVG_LIB_NAMES ${NANOVG_LIB_NAMES} nanovg_oui)
SET(NANOVG_LIB_OBJECTS ${NANOVG_LIB_OBJECTS} $<TARGET_OBJECTS:nanovg_oui>)
ENDIF()

SET(NANOVG_DEPENDENCIES m)
IF(NANOVG_BUILD_GL2 OR NANOVG_BUILD_GL3)
SET(NANOVG_DEPENDENCIES GLEW GL ${NANOVG_DEPENDENCIES})
ENDIF()
IF(NANOVG_BUILD_GLES2)
SET(NANOVG_DEPENDENCIES GLESv2 ${NANOVG_DEPENDENCIES})
ENDIF()
IF(NANOVG_BUILD_GLES2)
SET(NANOVG_DEPENDENCIES GLESv3 ${NANOVG_DEPENDENCIES})
ENDIF()
SET(NANOVG_DEPENDENCIES EGL ${NANOVG_DEPENDENCIES})

ADD_LIBRARY(nanovg_so SHARED ${NANOVG_LIB_OBJECTS})

SET_TARGET_PROPERTIES(nanovg_so PROPERTIES VERSION ${VERSION} SOVERSION 0)
SET_TARGET_PROPERTIES(nanovg_so PROPERTIES OUTPUT_NAME nanovg)
TARGET_LINK_LIBRARIES(nanovg_so PUBLIC nanovg nanovg_gl2 nanovg_gl3 nanovg_gles2 nanovg_gles3)
TARGET_LINK_LIBRARIES(nanovg_so PRIVATE GLEW EGL GL m)

ADD_LIBRARY(nanovg_a STATIC
$<TARGET_OBJECTS:nanovg>
$<TARGET_OBJECTS:nanovg_gl2>
$<TARGET_OBJECTS:nanovg_gl3>
$<TARGET_OBJECTS:nanovg_gles2>
$<TARGET_OBJECTS:nanovg_gles3>
$<TARGET_OBJECTS:nanovg_oui>
)
TARGET_LINK_LIBRARIES(nanovg_so PUBLIC ${NANOVG_LIB_NAMES})
TARGET_LINK_LIBRARIES(nanovg_so PRIVATE ${NANOVG_DEPENDENCIES})

ADD_LIBRARY(nanovg_a STATIC ${NANOVG_LIB_OBJECTS})

SET_TARGET_PROPERTIES(nanovg_a PROPERTIES OUTPUT_NAME nanovg)
TARGET_LINK_LIBRARIES(nanovg_a PUBLIC nanovg nanovg_gl2 nanovg_gl3 nanovg_gles2 nanovg_gles3)
TARGET_LINK_LIBRARIES(nanovg_a PRIVATE GLEW EGL GL m)
TARGET_LINK_LIBRARIES(nanovg_a PUBLIC ${NANOVG_LIB_NAMES})
TARGET_LINK_LIBRARIES(nanovg_a PRIVATE ${NANOVG_DEPENDENCIES})

CONFIGURE_FILE(pkgconfig/nanovg.pc.in nanovg.pc @ONLY)

Expand All @@ -95,45 +134,63 @@ INSTALL(FILES ${CMAKE_BINARY_DIR}/nanovg.pc

# Build Examples

IF(NANOVG_BUILD_EXAMPLES)

IF(NANOVG_BUILD_GL2)
ADD_EXECUTABLE(example_gl2
example/example_gl2.c example/demo.c example/perf.c
$<TARGET_OBJECTS:nanovg> $<TARGET_OBJECTS:nanovg_gl2>)
TARGET_LINK_LIBRARIES(example_gl2 PRIVATE nanovg nanovg_gl2 GLEW EGL GL glfw m)
TARGET_COMPILE_DEFINITIONS(example_gl2 PRIVATE ${NANOVG_GL_DEFINES} NANOVG_GL2)
ENDIF()

IF(NANOVG_BUILD_GL3)
ADD_EXECUTABLE(example_gl3
example/example_gl3.c example/demo.c example/perf.c
$<TARGET_OBJECTS:nanovg> $<TARGET_OBJECTS:nanovg_gl3>)
TARGET_LINK_LIBRARIES(example_gl3 PRIVATE nanovg nanovg_gl3 GLEW EGL GL glfw m)
TARGET_COMPILE_DEFINITIONS(example_gl3 PRIVATE ${NANOVG_GL_DEFINES} NANOVG_GL3)
ENDIF()

IF(NANOVG_BUILD_GL3)
ADD_EXECUTABLE(example_fbo example/example_fbo.c example/demo.c example/perf.c $<TARGET_OBJECTS:nanovg> $<TARGET_OBJECTS:nanovg_gl3>)
TARGET_LINK_LIBRARIES(example_fbo PRIVATE nanovg_gl3 GLEW EGL GL glfw m)
TARGET_COMPILE_DEFINITIONS(example_fbo PRIVATE ${NANOVG_GL_DEFINES} NANOVG_GL3)
ENDIF()

IF(NANOVG_BUILD_GLES2)
ADD_EXECUTABLE(example_gles2
example/example_gles2.c example/demo.c example/perf.c
$<TARGET_OBJECTS:nanovg> $<TARGET_OBJECTS:nanovg_gles2>)
TARGET_LINK_LIBRARIES(example_gles2 PRIVATE GLEW EGL GL glfw m)
TARGET_COMPILE_DEFINITIONS(example_gles2 PRIVATE NANOVG_GLES2)
ENDIF()

IF(NANOVG_BUILD_GLES3)
ADD_EXECUTABLE(example_gles3
example/example_gles3.c example/demo.c example/perf.c
$<TARGET_OBJECTS:nanovg> $<TARGET_OBJECTS:nanovg_gles3>)
TARGET_LINK_LIBRARIES(example_gles3 PRIVATE GLEW EGL GL glfw m)
TARGET_COMPILE_DEFINITIONS(example_gles3 PRIVATE NANOVG_GLES3)
ENDIF()

ADD_EXECUTABLE(example_svg1 example/example_svg1.c $<TARGET_OBJECTS:nanovg>)
TARGET_LINK_LIBRARIES(example_svg1 PRIVATE GLEW EGL GL glfw m)

ADD_EXECUTABLE(example_svg2 example/example_svg2.c $<TARGET_OBJECTS:nanovg>)
TARGET_LINK_LIBRARIES(example_svg2 PRIVATE GLEW EGL GL glfw m)

IF(NANOVG_BUILD_GL3 AND NANOVG_BUILD_OUI)
ADD_EXECUTABLE(example_oui
example/example_oui.c
$<TARGET_OBJECTS:nanovg> $<TARGET_OBJECTS:nanovg_gl3> $<TARGET_OBJECTS:nanovg_oui>)
TARGET_LINK_LIBRARIES(example_oui PRIVATE GLEW EGL GL glfw m)
TARGET_COMPILE_DEFINITIONS(example_oui PRIVATE DATADIR="../data")
ENDIF()

IF(NANOVG_BUILD_GL2 AND NANOVG_BUILD_GL3 AND NANOVG_BUILD_GLES2 AND NANOVG_BUILD_GLES3)
ADD_EXECUTABLE(example_gl_wrapper example/example_gl_wrapper example/demo.c $<TARGET_OBJECTS:nanovg>)
TARGET_LINK_LIBRARIES(example_gl_wrapper PRIVATE nanovg nanovg_gl2 nanovg_gl3 nanovg_gles2 nanovg_gles3 GLEW EGL GL glfw m)
TARGET_LINK_LIBRARIES(example_gl_wrapper PRIVATE ${NANOVG_LIB_NAMES} GLEW EGL GL glfw m)
ENDIF()

ENDIF()
2 changes: 1 addition & 1 deletion example/demo.c
Original file line number Diff line number Diff line change
Expand Up @@ -874,7 +874,7 @@ void drawParagraph(NVGcontext* vg, float x, float y, float width, float height,
const char* hoverText = "Hover your mouse over the text to see calculated caret position.";
float gx,gy;
int gutter = 0;
const char* boxText = "Testing\nsome multiline\ntext.";
//const char* boxText = "Testing\nsome multiline\ntext.";
NVG_NOTUSED(height);

nvgSave(vg);
Expand Down
10 changes: 5 additions & 5 deletions example/example_gl_wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ int main()
DemoData data;
NVGcontext* vg = NULL;
const NanoVG_GL_Functions_VTable *nvgl = NanoVG_GL_Functions[NANOVG_GL2];
double prevt = 0;
//double prevt = 0;

printf("Using NanoVG API: %s\n", nvgl->name);

Expand Down Expand Up @@ -116,18 +116,18 @@ int main()
glfwSwapInterval(0);

glfwSetTime(0);
prevt = glfwGetTime();
//prevt = glfwGetTime();

while (!glfwWindowShouldClose(window))
{
double mx, my, t, dt;
double mx, my, t;
int winWidth, winHeight;
int fbWidth, fbHeight;
float pxRatio;

t = glfwGetTime();
dt = t - prevt;
prevt = t;
//double dt = t - prevt;
//prevt = t;

glfwGetCursorPos(window, &mx, &my);
glfwGetWindowSize(window, &winWidth, &winHeight);
Expand Down
8 changes: 4 additions & 4 deletions example/example_oui.c
Original file line number Diff line number Diff line change
Expand Up @@ -948,7 +948,7 @@ void build_columndemo(int parent) {

void fill_wrap_row_box(int box) {
const int M = 5;
const int S = 100;
//const int S = 100;
const int T = 50;

srand(303);
Expand Down Expand Up @@ -986,7 +986,7 @@ void fill_wrap_row_box(int box) {

void fill_wrap_column_box(int box) {
const int M = 5;
const int S = 100;
//const int S = 100;
const int T = 50;

srand(303);
Expand Down Expand Up @@ -1028,8 +1028,8 @@ void build_wrapdemo(int parent) {
uiSetLayout(col, UI_FILL);

const int M = 5;
const int S = 100;
const int T = 50;
//const int S = 100;
//const int T = 50;

int box;
box = demorect(col, "Box( UI_ROW | UI_WRAP | UI_START )\nLayout( UI_HFILL | UI_TOP )",
Expand Down
8 changes: 4 additions & 4 deletions src/blendish.c
Original file line number Diff line number Diff line change
Expand Up @@ -661,21 +661,21 @@ void bndNodeBackground(NVGcontext *ctx, float x, float y, float w, float h,
iconid, bnd_theme.regularTheme.textColor,
bndOffsetColor(titleColor, BND_BEVEL_SHADE),
BND_LEFT, BND_LABEL_FONT_SIZE, label);
NVGcolor arrowColor;
//NVGcolor arrowColor;
NVGcolor borderColor;
switch(state) {
default:
case BND_DEFAULT: {
borderColor = nvgRGBf(0,0,0);
arrowColor = bndOffsetColor(titleColor, -BND_BEVEL_SHADE);
//arrowColor = bndOffsetColor(titleColor, -BND_BEVEL_SHADE);
} break;
case BND_HOVER: {
borderColor = bnd_theme.nodeTheme.nodeSelectedColor;
arrowColor = bnd_theme.nodeTheme.nodeSelectedColor;
//arrowColor = bnd_theme.nodeTheme.nodeSelectedColor;
} break;
case BND_ACTIVE: {
borderColor = bnd_theme.nodeTheme.activeNodeColor;
arrowColor = bnd_theme.nodeTheme.nodeSelectedColor;
//arrowColor = bnd_theme.nodeTheme.nodeSelectedColor;
} break;
}
bndOutlineBox(ctx,x,y,w,h+1,
Expand Down
18 changes: 10 additions & 8 deletions src/nanovg_gl.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ static int glew_initialized = 0;
# include <GLES3/gl3.h>
#endif

#if defined(NANOVG_GL2) || defined(NANOVG_GL3)
#include <GL/gl.h>
#endif

#include "nanovg_gl.h"

Expand Down Expand Up @@ -1574,13 +1576,13 @@ void nvgDeleteGLES3(NVGcontext* ctx)
}

#if defined NANOVG_GL2
int nvglCreateImageFromHandleGL2(NVGcontext* ctx, GLuint textureId, int w, int h, int imageFlags)
int nvglCreateImageFromHandleGL2(NVGcontext* ctx, unsigned int textureId, int w, int h, int imageFlags)
#elif defined NANOVG_GL3
int nvglCreateImageFromHandleGL3(NVGcontext* ctx, GLuint textureId, int w, int h, int imageFlags)
int nvglCreateImageFromHandleGL3(NVGcontext* ctx, unsigned int textureId, int w, int h, int imageFlags)
#elif defined NANOVG_GLES2
int nvglCreateImageFromHandleGLES2(NVGcontext* ctx, GLuint textureId, int w, int h, int imageFlags)
int nvglCreateImageFromHandleGLES2(NVGcontext* ctx, unsigned int textureId, int w, int h, int imageFlags)
#elif defined NANOVG_GLES3
int nvglCreateImageFromHandleGLES3(NVGcontext* ctx, GLuint textureId, int w, int h, int imageFlags)
int nvglCreateImageFromHandleGLES3(NVGcontext* ctx, unsigned int textureId, int w, int h, int imageFlags)
#endif
{
GLNVGcontext* gl = (GLNVGcontext*)nvgInternalParams(ctx)->userPtr;
Expand All @@ -1598,13 +1600,13 @@ int nvglCreateImageFromHandleGLES3(NVGcontext* ctx, GLuint textureId, int w, int
}

#if defined NANOVG_GL2
GLuint nvglImageHandleGL2(NVGcontext* ctx, int image)
unsigned int nvglImageHandleGL2(NVGcontext* ctx, int image)
#elif defined NANOVG_GL3
GLuint nvglImageHandleGL3(NVGcontext* ctx, int image)
unsigned int nvglImageHandleGL3(NVGcontext* ctx, int image)
#elif defined NANOVG_GLES2
GLuint nvglImageHandleGLES2(NVGcontext* ctx, int image)
unsigned int nvglImageHandleGLES2(NVGcontext* ctx, int image)
#elif defined NANOVG_GLES3
GLuint nvglImageHandleGLES3(NVGcontext* ctx, int image)
unsigned int nvglImageHandleGLES3(NVGcontext* ctx, int image)
#endif
{
GLNVGcontext* gl = (GLNVGcontext*)nvgInternalParams(ctx)->userPtr;
Expand Down
5 changes: 2 additions & 3 deletions src/nanovg_gl.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
#define NANOVG_GL_H_F380EF20_CDA3_11EA_AF55_D3B6DB88CFCC

#include "nanovg.h"
#include <GL/gl.h>

#ifdef __cplusplus
extern "C" {
Expand All @@ -44,8 +43,8 @@ typedef struct {
const char *name;
NVGcontext* (*createContext)(int flags);
void (*deleteContext) (NVGcontext* ctx);
int (*createImageFromHandle) (NVGcontext* ctx, GLuint textureId, int w, int h, int flags);
GLuint (*getImageHandle) (NVGcontext* ctx, int image);
int (*createImageFromHandle) (NVGcontext* ctx, unsigned int textureId, int w, int h, int flags);
unsigned int (*getImageHandle) (NVGcontext* ctx, int image);
} NanoVG_GL_Functions_VTable;

// Create NanoVG contexts for different OpenGL (ES) versions.
Expand Down
4 changes: 4 additions & 0 deletions src/nanovg_gl_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@
# include <GLES3/gl3.h>
#endif

#if defined(NANOVG_GL2) || defined(NANOVG_GL3)
#include <GL/gl.h>
#endif

#include "nanovg_gl_utils.h"

Expand All @@ -53,7 +55,9 @@
# endif
#endif

#ifdef NANOVG_FBO_VALID
static GLint defaultFBO = -1;
#endif

#if defined NANOVG_GL2
NVGLUframebuffer* nvgluCreateFramebufferGL2(NVGcontext* ctx, int w, int h, int imageFlags)
Expand Down

0 comments on commit 93c0a56

Please sign in to comment.