OpenGL ES3; Remove glad;

Stop using OpenGL extensions and drop support for OpenGL ES2,
WebGL 1, and OpenGL 2.  Remove glad.
This commit is contained in:
bjorn 2017-06-17 21:09:03 -07:00
parent 5f3ce18fcd
commit 8beac66db0
18 changed files with 82 additions and 5898 deletions

View File

@ -3,14 +3,11 @@ project(lovr)
# Setup # Setup
if(EMSCRIPTEN) if(EMSCRIPTEN)
add_definitions(-DLOVR_WEB=1)
set(CMAKE_EXECUTABLE_SUFFIX ".html") set(CMAKE_EXECUTABLE_SUFFIX ".html")
add_definitions(-O3) set(LOVR_EMSCRIPTEN_FLAGS "-O3 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_FREETYPE=1 -s USE_GLFW=3 -s USE_ZLIB=1 -s ASSERTIONS=1 -s AGGRESSIVE_VARIABLE_ELIMINATION=1 -s NO_EXIT_RUNTIME=1 -s TOTAL_MEMORY=134217728 -s ELIMINATE_DUPLICATE_FUNCTIONS=1")
add_definitions(-s USE_ZLIB=1) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LOVR_EMSCRIPTEN_FLAGS}")
add_definitions(-s ASSERTIONS=1) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LOVR_EMSCRIPTEN_FLAGS}")
add_definitions(-s FULL_ES2=1)
add_definitions(-s AGGRESSIVE_VARIABLE_ELIMINATION=1)
add_definitions(-s NO_EXIT_RUNTIME=1)
add_definitions(-s TOTAL_MEMORY=134217728)
include_directories("${EMSCRIPTEN_ROOT_PATH}/tests/zlib") include_directories("${EMSCRIPTEN_ROOT_PATH}/tests/zlib")
elseif(UNIX) elseif(UNIX)
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
@ -61,13 +58,11 @@ endif()
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "") set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "")
set(GLFW_BUILD_TESTS OFF CACHE BOOL "") set(GLFW_BUILD_TESTS OFF CACHE BOOL "")
set(GLFW_BUILD_DOCS OFF CACHE BOOL "") set(GLFW_BUILD_DOCS OFF CACHE BOOL "")
if(EMSCRIPTEN) if(WIN32)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s USE_GLFW=3")
elseif(WIN32)
add_subdirectory(deps/glfw glfw) add_subdirectory(deps/glfw glfw)
include_directories(deps/glfw/include) include_directories(deps/glfw/include)
set(LOVR_GLFW glfw ${GLFW_LIBRARIES}) set(LOVR_GLFW glfw ${GLFW_LIBRARIES})
else() elseif(NOT EMSCRIPTEN)
pkg_search_module(GLFW REQUIRED glfw3) pkg_search_module(GLFW REQUIRED glfw3)
include_directories(${GLFW_INCLUDE_DIRS}) include_directories(${GLFW_INCLUDE_DIRS})
set(LOVR_GLFW ${GLFW_LIBRARIES}) set(LOVR_GLFW ${GLFW_LIBRARIES})
@ -78,6 +73,7 @@ if(EMSCRIPTEN)
option(LUA_USE_RELATIVE_LOADLIB OFF) option(LUA_USE_RELATIVE_LOADLIB OFF)
option(LUA_USE_ULONGJMP OFF) option(LUA_USE_ULONGJMP OFF)
add_subdirectory(deps/lua lua) add_subdirectory(deps/lua lua)
set_target_properties(lua luac liblua liblua_static PROPERTIES EXCLUDE_FROM_ALL 1)
include_directories(deps/lua/src ${CMAKE_BINARY_DIR}/lua) include_directories(deps/lua/src ${CMAKE_BINARY_DIR}/lua)
set(LOVR_LUA liblua_static) set(LOVR_LUA liblua_static)
elseif(WIN32) elseif(WIN32)
@ -94,7 +90,12 @@ else()
endif() endif()
# ODE # ODE
if (WIN32 OR EMSCRIPTEN) if(EMSCRIPTEN)
set(ODE_BUILD_SHARED OFF CACHE BOOL "")
add_subdirectory(deps/ode ode)
include_directories(deps/ode/include "${CMAKE_CURRENT_BINARY_DIR}/ode/include")
set(LOVR_ODE ode)
elseif(WIN32)
set(ODE_BUILD_SHARED ON CACHE BOOL "") set(ODE_BUILD_SHARED ON CACHE BOOL "")
add_subdirectory(deps/ode ode) add_subdirectory(deps/ode ode)
include_directories(deps/ode/include "${CMAKE_CURRENT_BINARY_DIR}/ode/include") include_directories(deps/ode/include "${CMAKE_CURRENT_BINARY_DIR}/ode/include")
@ -213,7 +214,6 @@ set(LOVR_SRC
src/graphics/skybox.c src/graphics/skybox.c
src/graphics/texture.c src/graphics/texture.c
src/headset/headset.c src/headset/headset.c
src/lib/glad/glad.c
src/lib/lua-cjson/fpconv.c src/lib/lua-cjson/fpconv.c
src/lib/lua-cjson/lua_cjson.c src/lib/lua-cjson/lua_cjson.c
src/lib/lua-cjson/strbuf.c src/lib/lua-cjson/strbuf.c
@ -255,6 +255,8 @@ target_link_libraries(lovr
${LOVR_OPENGL} ${LOVR_OPENGL}
${LOVR_OPENVR} ${LOVR_OPENVR}
${LOVR_PHYSFS} ${LOVR_PHYSFS}
${LOVR_EMSCRIPTEN_FLAGS}
) )
if(WIN32) if(WIN32)

View File

@ -138,7 +138,6 @@ int l_lovrGraphicsInit(lua_State* L) {
map_set(&WrapModes, "clamp", WRAP_CLAMP); map_set(&WrapModes, "clamp", WRAP_CLAMP);
map_set(&WrapModes, "repeat", WRAP_REPEAT); map_set(&WrapModes, "repeat", WRAP_REPEAT);
map_set(&WrapModes, "mirroredrepeat", WRAP_MIRRORED_REPEAT); map_set(&WrapModes, "mirroredrepeat", WRAP_MIRRORED_REPEAT);
map_set(&WrapModes, "clampzero", WRAP_CLAMP_ZERO);
lovrGraphicsInit(); lovrGraphicsInit();
return 1; return 1;

View File

@ -19,7 +19,7 @@ void lovrAudioInit() {
error("Unable to create OpenAL context"); error("Unable to create OpenAL context");
} }
#ifndef EMSCRIPTEN #ifndef LOVR_WEB
static LPALCRESETDEVICESOFT alcResetDeviceSOFT; static LPALCRESETDEVICESOFT alcResetDeviceSOFT;
alcResetDeviceSOFT = (LPALCRESETDEVICESOFT) alcGetProcAddress(device, "alcResetDeviceSOFT"); alcResetDeviceSOFT = (LPALCRESETDEVICESOFT) alcGetProcAddress(device, "alcResetDeviceSOFT");
state.isSpatialized = alcIsExtensionPresent(device, "ALC_SOFT_HRTF"); state.isSpatialized = alcIsExtensionPresent(device, "ALC_SOFT_HRTF");
@ -76,7 +76,7 @@ void lovrAudioAdd(Source* source) {
} }
void lovrAudioGetDopplerEffect(float* factor, float* speedOfSound) { void lovrAudioGetDopplerEffect(float* factor, float* speedOfSound) {
#ifdef EMSCRIPTEN #ifdef LOVR_WEB
*factor = *speedOfSound = 0; *factor = *speedOfSound = 0;
#else #else
alGetFloatv(AL_DOPPLER_FACTOR, factor); alGetFloatv(AL_DOPPLER_FACTOR, factor);
@ -138,7 +138,7 @@ void lovrAudioRewind() {
} }
void lovrAudioSetDopplerEffect(float scale, float speedOfSound) { void lovrAudioSetDopplerEffect(float scale, float speedOfSound) {
#ifndef EMSCRIPTEN #ifndef LOVR_WEB
alDopplerFactor(scale); alDopplerFactor(scale);
alSpeedOfSound(speedOfSound); alSpeedOfSound(speedOfSound);
#endif #endif

View File

@ -2,7 +2,7 @@
#include "lib/vec/vec.h" #include "lib/vec/vec.h"
#include <AL/al.h> #include <AL/al.h>
#include <AL/alc.h> #include <AL/alc.h>
#ifndef EMSCRIPTEN #ifndef LOVR_WEB
#include <AL/alext.h> #include <AL/alext.h>
#endif #endif

View File

@ -78,7 +78,7 @@ int lovrFilesystemGetAppdataDirectory(char* dest, unsigned int size) {
wcstombs(dest, appData, size); wcstombs(dest, appData, size);
CoTaskMemFree(appData); CoTaskMemFree(appData);
return 0; return 0;
#elif EMSCRIPTEN #elif LOVR_WEB
strncpy(dest, "/home/web_user", size); strncpy(dest, "/home/web_user", size);
return 0; return 0;
#else #else
@ -99,7 +99,7 @@ int lovrFilesystemGetExecutablePath(char* dest, unsigned int size) {
} }
#elif _WIN32 #elif _WIN32
return !GetModuleFileName(NULL, dest, size); return !GetModuleFileName(NULL, dest, size);
#elif EMSCRIPTEN #elif LOVR_WEB
return 1; return 1;
#else #else
#error "This platform is missing an implementation for lovrFilesystemGetExecutablePath" #error "This platform is missing an implementation for lovrFilesystemGetExecutablePath"

View File

@ -52,10 +52,12 @@ Font* lovrFontCreate(FontData* fontData) {
font->texture = lovrTextureCreate(textureData); font->texture = lovrTextureCreate(textureData);
lovrTextureSetWrap(font->texture, WRAP_CLAMP, WRAP_CLAMP); lovrTextureSetWrap(font->texture, WRAP_CLAMP, WRAP_CLAMP);
if (lovrGraphicsIsSupported(FEATURE_SWIZZLE)) { #ifndef LOVR_WEB
int swizzle[4] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
} glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_GREEN);
#endif
return font; return font;
} }

View File

@ -25,11 +25,11 @@ static void onCloseWindow(GLFWwindow* window) {
// Base // Base
void lovrGraphicsInit() { void lovrGraphicsInit() {
#ifdef EMSCRIPTEN #ifdef LOVR_WEB
#define loadGLLoader gladLoadGLES2Loader
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
#else #else
#define loadGLLoader gladLoadGLLoader
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
@ -50,15 +50,13 @@ void lovrGraphicsInit() {
glfwMakeContextCurrent(state.window); glfwMakeContextCurrent(state.window);
glfwSetWindowCloseCallback(state.window, onCloseWindow); glfwSetWindowCloseCallback(state.window, onCloseWindow);
glfwSetTime(0); glfwSetTime(0);
loadGLLoader((GLADloadproc) glfwGetProcAddress);
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPixelStorei(GL_UNPACK_ALIGNMENT, 2); glPixelStorei(GL_UNPACK_ALIGNMENT, 2);
if (GLAD_GL_VERSION_3_0) { #ifndef LOVR_WEB
glfwSwapInterval(0); glfwSwapInterval(0);
glEnable(GL_LINE_SMOOTH); glEnable(GL_LINE_SMOOTH);
glEnable(GL_MULTISAMPLE); #endif
}
// Allocations // Allocations
state.activeFont = NULL; state.activeFont = NULL;
@ -66,9 +64,7 @@ void lovrGraphicsInit() {
state.activeTexture = NULL; state.activeTexture = NULL;
glGenBuffers(1, &state.shapeBuffer); glGenBuffers(1, &state.shapeBuffer);
glGenBuffers(1, &state.shapeIndexBuffer); glGenBuffers(1, &state.shapeIndexBuffer);
if (lovrGraphicsIsSupported(FEATURE_VAO)) { glGenVertexArrays(1, &state.shapeArray);
glGenVertexArrays(1, &state.shapeArray);
}
vec_init(&state.shapeData); vec_init(&state.shapeData);
vec_init(&state.shapeIndices); vec_init(&state.shapeIndices);
for (int i = 0; i < MAX_CANVASES; i++) { for (int i = 0; i < MAX_CANVASES; i++) {
@ -85,15 +81,15 @@ void lovrGraphicsInit() {
// System Limits // System Limits
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &state.maxTextureSize); glGetIntegerv(GL_MAX_TEXTURE_SIZE, &state.maxTextureSize);
if (GLAD_GL_VERSION_2_0) { #ifdef LOVR_WEB
float pointSizes[2]; state.maxPointSize = 1.f;
glGetFloatv(GL_POINT_SIZE_RANGE, pointSizes); state.maxTextureMSAA = 1;
state.maxPointSize = pointSizes[1]; #else
glGetIntegerv(GL_MAX_SAMPLES, &state.maxTextureMSAA); float pointSizes[2];
} else { glGetFloatv(GL_POINT_SIZE_RANGE, pointSizes);
state.maxPointSize = 1.f; state.maxPointSize = pointSizes[1];
state.maxTextureMSAA = 1; glGetIntegerv(GL_MAX_SAMPLES, &state.maxTextureMSAA);
} #endif
// State // State
state.depthTest = -1; state.depthTest = -1;
@ -117,9 +113,7 @@ void lovrGraphicsDestroy() {
lovrRelease(&state.defaultTexture->ref); lovrRelease(&state.defaultTexture->ref);
glDeleteBuffers(1, &state.shapeBuffer); glDeleteBuffers(1, &state.shapeBuffer);
glDeleteBuffers(1, &state.shapeIndexBuffer); glDeleteBuffers(1, &state.shapeIndexBuffer);
if (lovrGraphicsIsSupported(FEATURE_VAO)) { glDeleteVertexArrays(1, &state.shapeArray);
glDeleteVertexArrays(1, &state.shapeArray);
}
vec_deinit(&state.shapeData); vec_deinit(&state.shapeData);
vec_deinit(&state.shapeIndices); vec_deinit(&state.shapeIndices);
} }
@ -221,21 +215,13 @@ void lovrGraphicsSetBlendMode(BlendMode mode, BlendAlphaMode alphaMode) {
break; break;
case BLEND_LIGHTEN: case BLEND_LIGHTEN:
if (lovrGraphicsIsSupported(FEATURE_LIGHTEN)) { glBlendEquation(GL_MAX);
glBlendEquation(GL_MAX); glBlendFuncSeparate(srcRGB, GL_ZERO, GL_ONE, GL_ZERO);
glBlendFuncSeparate(srcRGB, GL_ZERO, GL_ONE, GL_ZERO);
} else {
error("The lighten blend mode is not supported on this platform.");
}
break; break;
case BLEND_DARKEN: case BLEND_DARKEN:
if (lovrGraphicsIsSupported(FEATURE_LIGHTEN)) { glBlendEquation(GL_MIN);
glBlendEquation(GL_MIN); glBlendFuncSeparate(srcRGB, GL_ZERO, GL_ONE, GL_ZERO);
glBlendFuncSeparate(srcRGB, GL_ZERO, GL_ONE, GL_ZERO);
} else {
error("The darken blend mode is not supported on this platform.");
}
break; break;
case BLEND_SCREEN: case BLEND_SCREEN:
@ -391,10 +377,10 @@ float lovrGraphicsGetPointSize() {
} }
void lovrGraphicsSetPointSize(float size) { void lovrGraphicsSetPointSize(float size) {
if (lovrGraphicsIsSupported(FEATURE_POINT_SIZE)) { #ifndef LOVR_WEB
state.pointSize = size; state.pointSize = size;
glPointSize(size); glPointSize(size);
} #endif
} }
int lovrGraphicsIsCullingEnabled() { int lovrGraphicsIsCullingEnabled() {
@ -440,10 +426,12 @@ int lovrGraphicsIsWireframe() {
} }
void lovrGraphicsSetWireframe(int wireframe) { void lovrGraphicsSetWireframe(int wireframe) {
if (lovrGraphicsIsSupported(FEATURE_WIREFRAME) && state.isWireframe != wireframe) { #ifndef LOVR_WEB
if (state.isWireframe != wireframe) {
state.isWireframe = wireframe; state.isWireframe = wireframe;
glPolygonMode(GL_FRONT_AND_BACK, wireframe ? GL_LINE : GL_FILL); glPolygonMode(GL_FRONT_AND_BACK, wireframe ? GL_LINE : GL_FILL);
} }
#endif
} }
int lovrGraphicsGetWidth() { int lovrGraphicsGetWidth() {
@ -467,20 +455,6 @@ float lovrGraphicsGetSystemLimit(GraphicsLimit limit) {
} }
} }
int lovrGraphicsIsSupported(GraphicsFeature feature) {
switch (feature) {
case FEATURE_LIGHTEN: return GLAD_GL_VERSION_2_0 || GLAD_GL_EXT_blend_minmax;
case FEATURE_MAPPED_BUFFERS: return GLAD_GL_VERSION_3_0 || GLAD_GL_ARB_map_buffer_range;
case FEATURE_POINT_SIZE: return GLAD_GL_VERSION_2_0;
case FEATURE_SHADER_INTS: return GLAD_GL_VERSION_2_0;
case FEATURE_SWIZZLE: return GLAD_GL_VERSION_3_0;
case FEATURE_TEXTURE_RG: return GLAD_GL_VERSION_3_0 || GLAD_GL_ARB_texture_rg || GLAD_GL_EXT_texture_rg;
case FEATURE_TEXTURE_FANCY_WRAPS: return !GLAD_GL_ES_VERSION_2_0;
case FEATURE_VAO: return GLAD_GL_VERSION_3_0;
case FEATURE_WIREFRAME: return GLAD_GL_VERSION_3_0;
}
}
void lovrGraphicsPushCanvas() { void lovrGraphicsPushCanvas() {
if (++state.canvas >= MAX_CANVASES) { if (++state.canvas >= MAX_CANVASES) {
error("Canvas overflow"); error("Canvas overflow");
@ -561,9 +535,7 @@ void lovrGraphicsDrawPrimitive(GLenum mode, int hasNormals, int hasTexCoords, in
int strideBytes = stride * sizeof(float); int strideBytes = stride * sizeof(float);
lovrGraphicsPrepare(); lovrGraphicsPrepare();
if (lovrGraphicsIsSupported(FEATURE_VAO)) { glBindVertexArray(state.shapeArray);
glBindVertexArray(state.shapeArray);
}
glBindBuffer(GL_ARRAY_BUFFER, state.shapeBuffer); glBindBuffer(GL_ARRAY_BUFFER, state.shapeBuffer);
glBufferData(GL_ARRAY_BUFFER, state.shapeData.length * sizeof(float), state.shapeData.data, GL_STREAM_DRAW); glBufferData(GL_ARRAY_BUFFER, state.shapeData.length * sizeof(float), state.shapeData.data, GL_STREAM_DRAW);
glEnableVertexAttribArray(LOVR_SHADER_POSITION); glEnableVertexAttribArray(LOVR_SHADER_POSITION);
@ -592,9 +564,7 @@ void lovrGraphicsDrawPrimitive(GLenum mode, int hasNormals, int hasTexCoords, in
glDrawArrays(mode, 0, state.shapeData.length / stride); glDrawArrays(mode, 0, state.shapeData.length / stride);
} }
if (lovrGraphicsIsSupported(FEATURE_VAO)) { glBindVertexArray(0);
glBindVertexArray(0);
}
} }
void lovrGraphicsPoints(float* points, int count) { void lovrGraphicsPoints(float* points, int count) {

View File

@ -55,18 +55,6 @@ typedef enum {
LIMIT_TEXTURE_MSAA LIMIT_TEXTURE_MSAA
} GraphicsLimit; } GraphicsLimit;
typedef enum {
FEATURE_LIGHTEN,
FEATURE_MAPPED_BUFFERS,
FEATURE_POINT_SIZE,
FEATURE_SHADER_INTS,
FEATURE_SWIZZLE,
FEATURE_TEXTURE_RG,
FEATURE_TEXTURE_FANCY_WRAPS,
FEATURE_VAO,
FEATURE_WIREFRAME
} GraphicsFeature;
typedef struct { typedef struct {
int x; int x;
int y; int y;
@ -162,7 +150,6 @@ void lovrGraphicsSetWireframe(int wireframe);
int lovrGraphicsGetWidth(); int lovrGraphicsGetWidth();
int lovrGraphicsGetHeight(); int lovrGraphicsGetHeight();
float lovrGraphicsGetSystemLimit(GraphicsLimit limit); float lovrGraphicsGetSystemLimit(GraphicsLimit limit);
int lovrGraphicsIsSupported(GraphicsFeature feature);
void lovrGraphicsPushCanvas(); void lovrGraphicsPushCanvas();
void lovrGraphicsPopCanvas(); void lovrGraphicsPopCanvas();
void lovrGraphicsSetViewport(int x, int y, int w, int h); void lovrGraphicsSetViewport(int x, int y, int w, int h);

View File

@ -5,7 +5,7 @@
static void lovrMeshBindAttributes(Mesh* mesh) { static void lovrMeshBindAttributes(Mesh* mesh) {
Shader* shader = lovrGraphicsGetShader(); Shader* shader = lovrGraphicsGetShader();
if (!shader || (shader == mesh->lastShader && !mesh->attributesDirty && lovrGraphicsIsSupported(FEATURE_VAO))) { if (!shader || (shader == mesh->lastShader && !mesh->attributesDirty)) {
return; return;
} }
@ -23,11 +23,7 @@ static void lovrMeshBindAttributes(Mesh* mesh) {
glEnableVertexAttribArray(location); glEnableVertexAttribArray(location);
if (attribute.type == MESH_INT) { if (attribute.type == MESH_INT) {
if (!lovrGraphicsIsSupported(FEATURE_SHADER_INTS)) { glVertexAttribIPointer(location, attribute.count, attribute.type, mesh->stride, (void*) offset);
error("Integer attributes are not supported on this platform.");
} else {
glVertexAttribIPointer(location, attribute.count, attribute.type, mesh->stride, (void*) offset);
}
} else { } else {
glVertexAttribPointer(location, attribute.count, attribute.type, GL_FALSE, mesh->stride, (void*) offset); glVertexAttribPointer(location, attribute.count, attribute.type, GL_FALSE, mesh->stride, (void*) offset);
} }
@ -72,7 +68,6 @@ Mesh* lovrMeshCreate(int count, MeshFormat* format, MeshDrawMode drawMode, MeshU
return NULL; return NULL;
} }
mesh->data = NULL;
mesh->count = count; mesh->count = count;
mesh->stride = stride; mesh->stride = stride;
mesh->enabledAttributes = ~0; mesh->enabledAttributes = ~0;
@ -92,13 +87,7 @@ Mesh* lovrMeshCreate(int count, MeshFormat* format, MeshDrawMode drawMode, MeshU
glGenBuffers(1, &mesh->ibo); glGenBuffers(1, &mesh->ibo);
glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo); glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
glBufferData(GL_ARRAY_BUFFER, mesh->count * mesh->stride, NULL, mesh->usage); glBufferData(GL_ARRAY_BUFFER, mesh->count * mesh->stride, NULL, mesh->usage);
if (lovrGraphicsIsSupported(FEATURE_VAO)) { glGenVertexArrays(1, &mesh->vao);
glGenVertexArrays(1, &mesh->vao);
}
if (!lovrGraphicsIsSupported(FEATURE_MAPPED_BUFFERS)) {
mesh->data = malloc(mesh->count * mesh->stride);
}
return mesh; return mesh;
} }
@ -110,12 +99,9 @@ void lovrMeshDestroy(const Ref* ref) {
} }
glDeleteBuffers(1, &mesh->vbo); glDeleteBuffers(1, &mesh->vbo);
glDeleteBuffers(1, &mesh->ibo); glDeleteBuffers(1, &mesh->ibo);
if (lovrGraphicsIsSupported(FEATURE_VAO)) { glDeleteVertexArrays(1, &mesh->vao);
glDeleteVertexArrays(1, &mesh->vao);
}
vec_deinit(&mesh->map); vec_deinit(&mesh->map);
vec_deinit(&mesh->format); vec_deinit(&mesh->format);
free(mesh->data);
free(mesh); free(mesh);
} }
@ -131,9 +117,7 @@ void lovrMeshDraw(Mesh* mesh, mat4 transform) {
lovrGraphicsBindTexture(mesh->texture); lovrGraphicsBindTexture(mesh->texture);
lovrGraphicsPrepare(); lovrGraphicsPrepare();
if (lovrGraphicsIsSupported(FEATURE_VAO)) { glBindVertexArray(mesh->vao);
glBindVertexArray(mesh->vao);
}
lovrMeshBindAttributes(mesh); lovrMeshBindAttributes(mesh);
@ -266,12 +250,6 @@ void lovrMeshSetTexture(Mesh* mesh, Texture* texture) {
} }
void* lovrMeshMap(Mesh* mesh, int start, int count) { void* lovrMeshMap(Mesh* mesh, int start, int count) {
if (!lovrGraphicsIsSupported(FEATURE_MAPPED_BUFFERS)) {
mesh->isMapped = 1;
mesh->mapStart = start;
mesh->mapCount = count;
return (char*) mesh->data + start * mesh->stride;
}
// Unmap because the mapped ranges aren't necessarily the same. Could be improved. // Unmap because the mapped ranges aren't necessarily the same. Could be improved.
if (mesh->isMapped && (mesh->mapStart != start || mesh->mapCount != count)) { if (mesh->isMapped && (mesh->mapStart != start || mesh->mapCount != count)) {
@ -287,16 +265,6 @@ void* lovrMeshMap(Mesh* mesh, int start, int count) {
} }
void lovrMeshUnmap(Mesh* mesh) { void lovrMeshUnmap(Mesh* mesh) {
if (!lovrGraphicsIsSupported(FEATURE_MAPPED_BUFFERS)) {
mesh->isMapped = 0;
int start = mesh->mapStart * mesh->stride;
int count = mesh->mapCount * mesh->stride;
char* data = (char*) mesh->data + start;
glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
glBufferSubData(GL_ARRAY_BUFFER, start, count, data);
return;
}
if (mesh->isMapped) { if (mesh->isMapped) {
mesh->isMapped = 0; mesh->isMapped = 0;
glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo); glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);

View File

@ -35,7 +35,6 @@ typedef vec_t(MeshAttribute) MeshFormat;
typedef struct { typedef struct {
Ref ref; Ref ref;
void* data;
int count; int count;
int stride; int stride;
int enabledAttributes; int enabledAttributes;
@ -43,6 +42,7 @@ typedef struct {
int isMapped; int isMapped;
int mapStart; int mapStart;
int mapCount; int mapCount;
void* mappedData;
MeshFormat format; MeshFormat format;
MeshDrawMode drawMode; MeshDrawMode drawMode;
MeshUsage usage; MeshUsage usage;

View File

@ -4,36 +4,31 @@
#include <stdlib.h> #include <stdlib.h>
const char* lovrShaderVertexPrefix = "" const char* lovrShaderVertexPrefix = ""
#ifdef EMSCRIPTEN #ifdef LOVR_WEB
"#version 100 \n" "#version 300 es \n"
"precision mediump float; \n" "precision mediump float; \n"
"attribute vec3 lovrPosition; \n"
"attribute vec3 lovrNormal; \n"
"attribute vec2 lovrTexCoord; \n"
"varying vec2 texCoord; \n"
#else #else
"#version 150 \n" "#version 150 \n"
#endif
"in vec3 lovrPosition; \n" "in vec3 lovrPosition; \n"
"in vec3 lovrNormal; \n" "in vec3 lovrNormal; \n"
"in vec2 lovrTexCoord; \n" "in vec2 lovrTexCoord; \n"
"out vec2 texCoord; \n" "out vec2 texCoord; \n"
#endif
"uniform mat4 lovrTransform; \n" "uniform mat4 lovrTransform; \n"
"uniform mat3 lovrNormalMatrix; \n" "uniform mat3 lovrNormalMatrix; \n"
"uniform mat4 lovrProjection; \n" "uniform mat4 lovrProjection; \n"
""; "";
const char* lovrShaderFragmentPrefix = "" const char* lovrShaderFragmentPrefix = ""
#ifdef EMSCRIPTEN #ifdef LOVR_WEB
"#version 100 \n" "#version 300 es \n"
"precision mediump float; \n" "precision mediump float; \n"
"varying vec2 texCoord; \n"
#else #else
"#version 150 \n" "#version 150 \n"
"in vec2 texCoord; \n"
"in vec4 gl_FragCoord; \n" "in vec4 gl_FragCoord; \n"
"out vec4 lovrFragColor; \n"
#endif #endif
"in vec2 texCoord; \n"
"out vec4 lovrFragColor; \n"
"uniform vec4 lovrColor; \n" "uniform vec4 lovrColor; \n"
"uniform sampler2D lovrTexture; \n" "uniform sampler2D lovrTexture; \n"
""; "";
@ -47,11 +42,7 @@ const char* lovrShaderVertexSuffix = ""
const char* lovrShaderFragmentSuffix = "" const char* lovrShaderFragmentSuffix = ""
"void main() { \n" "void main() { \n"
#ifdef EMSCRIPTEN
" gl_FragColor = color(lovrColor, lovrTexture, texCoord); \n"
#else
" lovrFragColor = color(lovrColor, lovrTexture, texCoord); \n" " lovrFragColor = color(lovrColor, lovrTexture, texCoord); \n"
#endif
"}" "}"
""; "";
@ -63,20 +54,12 @@ const char* lovrDefaultVertexShader = ""
const char* lovrDefaultFragmentShader = "" const char* lovrDefaultFragmentShader = ""
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n" "vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
#ifdef EMSCRIPTEN
" return graphicsColor * texture2D(image, uv); \n"
#else
" return graphicsColor * texture(image, uv); \n" " return graphicsColor * texture(image, uv); \n"
#endif
"}" "}"
""; "";
const char* lovrSkyboxVertexShader = "" const char* lovrSkyboxVertexShader = ""
#ifdef EMSCRIPTEN
"varying vec3 texturePosition; \n"
#else
"out vec3 texturePosition; \n" "out vec3 texturePosition; \n"
#endif
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n" "vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
" texturePosition = vertex.xyz; \n" " texturePosition = vertex.xyz; \n"
" return projection * transform * vertex; \n" " return projection * transform * vertex; \n"
@ -84,19 +67,11 @@ const char* lovrSkyboxVertexShader = ""
""; "";
const char* lovrSkyboxFragmentShader = "" const char* lovrSkyboxFragmentShader = ""
#ifdef EMSCRIPTEN
"varying vec3 texturePosition; \n"
"uniform samplerCube cube; \n"
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
" return graphicsColor * textureCube(cube, texturePosition); \n"
"}"
#else
"in vec3 texturePosition; \n" "in vec3 texturePosition; \n"
"uniform samplerCube cube; \n" "uniform samplerCube cube; \n"
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n" "vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
" return graphicsColor * texture(cube, texturePosition); \n" " return graphicsColor * texture(cube, texturePosition); \n"
"}" "}"
#endif
""; "";
const char* lovrNoopVertexShader = "" const char* lovrNoopVertexShader = ""

View File

@ -7,8 +7,12 @@
GLenum lovrTextureGetGLFormat(TextureFormat format) { GLenum lovrTextureGetGLFormat(TextureFormat format) {
switch (format) { switch (format) {
case FORMAT_RED: return lovrGraphicsIsSupported(FEATURE_TEXTURE_RG) ? GL_RED : GL_LUMINANCE; case FORMAT_RED: return GL_RED;
case FORMAT_RG: return lovrGraphicsIsSupported(FEATURE_TEXTURE_RG) ? GL_RG : GL_LUMINANCE_ALPHA; #ifdef LOVR_WEB
case FORMAT_RG: return GL_LUMINANCE_ALPHA;
#else
case FORMAT_RG: return GL_RG;
#endif
case FORMAT_RGB: return GL_RGB; case FORMAT_RGB: return GL_RGB;
case FORMAT_RGBA: return GL_RGBA; case FORMAT_RGBA: return GL_RGBA;
} }
@ -176,10 +180,6 @@ void lovrTextureGetWrap(Texture* texture, WrapMode* horizontal, WrapMode* vertic
} }
void lovrTextureSetWrap(Texture* texture, WrapMode horizontal, WrapMode vertical) { void lovrTextureSetWrap(Texture* texture, WrapMode horizontal, WrapMode vertical) {
if (!lovrGraphicsIsSupported(FEATURE_TEXTURE_FANCY_WRAPS)) {
horizontal = vertical = WRAP_CLAMP;
}
texture->wrapHorizontal = horizontal; texture->wrapHorizontal = horizontal;
texture->wrapVertical = vertical; texture->wrapVertical = vertical;
lovrGraphicsBindTexture(texture); lovrGraphicsBindTexture(texture);

View File

@ -12,8 +12,7 @@ typedef enum {
typedef enum { typedef enum {
WRAP_CLAMP = GL_CLAMP_TO_EDGE, WRAP_CLAMP = GL_CLAMP_TO_EDGE,
WRAP_REPEAT = GL_REPEAT, WRAP_REPEAT = GL_REPEAT,
WRAP_MIRRORED_REPEAT = GL_MIRRORED_REPEAT, WRAP_MIRRORED_REPEAT = GL_MIRRORED_REPEAT
WRAP_CLAMP_ZERO = GL_CLAMP_TO_BORDER
} WrapMode; } WrapMode;
typedef enum { typedef enum {

View File

@ -1,6 +0,0 @@
GL_ARB_framebuffer_object
GL_ARB_map_buffer_range
GL_ARB_texture_rg
GL_EXT_texture_rg
GL_EXT_blend_minmax
GL_OES_texture_npot

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,9 +2,8 @@
#ifdef _WIN32 #ifdef _WIN32
#define APIENTRY __stdcall #define APIENTRY __stdcall
#elif EMSCRIPTEN #elif LOVR_WEB
#define GLFW_INCLUDE_ES2 #define GLFW_INCLUDE_ES3
#endif #endif
#include "lib/glad/glad.h"
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>

View File

@ -41,7 +41,7 @@ static int lovrGetOS(lua_State* L) {
#elif __APPLE__ #elif __APPLE__
lua_pushstring(L, "macOS"); lua_pushstring(L, "macOS");
return 1; return 1;
#elif EMSCRIPTEN #elif LOVR_WEB
lua_pushstring(L, "Web"); lua_pushstring(L, "Web");
#else #else
lua_pushnil(L); lua_pushnil(L);
@ -120,7 +120,7 @@ void lovrDestroy(int exitCode) {
exit(exitCode); exit(exitCode);
} }
#ifdef EMSCRIPTEN #ifdef LOVR_WEB
#include <emscripten.h> #include <emscripten.h>
static int stepRef = 0; static int stepRef = 0;