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
if(EMSCRIPTEN)
add_definitions(-DLOVR_WEB=1)
set(CMAKE_EXECUTABLE_SUFFIX ".html")
add_definitions(-O3)
add_definitions(-s USE_ZLIB=1)
add_definitions(-s ASSERTIONS=1)
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)
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")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LOVR_EMSCRIPTEN_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LOVR_EMSCRIPTEN_FLAGS}")
include_directories("${EMSCRIPTEN_ROOT_PATH}/tests/zlib")
elseif(UNIX)
find_package(PkgConfig REQUIRED)
@ -61,13 +58,11 @@ endif()
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "")
set(GLFW_BUILD_TESTS OFF CACHE BOOL "")
set(GLFW_BUILD_DOCS OFF CACHE BOOL "")
if(EMSCRIPTEN)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s USE_GLFW=3")
elseif(WIN32)
if(WIN32)
add_subdirectory(deps/glfw glfw)
include_directories(deps/glfw/include)
set(LOVR_GLFW glfw ${GLFW_LIBRARIES})
else()
elseif(NOT EMSCRIPTEN)
pkg_search_module(GLFW REQUIRED glfw3)
include_directories(${GLFW_INCLUDE_DIRS})
set(LOVR_GLFW ${GLFW_LIBRARIES})
@ -78,6 +73,7 @@ if(EMSCRIPTEN)
option(LUA_USE_RELATIVE_LOADLIB OFF)
option(LUA_USE_ULONGJMP OFF)
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)
set(LOVR_LUA liblua_static)
elseif(WIN32)
@ -94,7 +90,12 @@ else()
endif()
# 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 "")
add_subdirectory(deps/ode ode)
include_directories(deps/ode/include "${CMAKE_CURRENT_BINARY_DIR}/ode/include")
@ -213,7 +214,6 @@ set(LOVR_SRC
src/graphics/skybox.c
src/graphics/texture.c
src/headset/headset.c
src/lib/glad/glad.c
src/lib/lua-cjson/fpconv.c
src/lib/lua-cjson/lua_cjson.c
src/lib/lua-cjson/strbuf.c
@ -255,6 +255,8 @@ target_link_libraries(lovr
${LOVR_OPENGL}
${LOVR_OPENVR}
${LOVR_PHYSFS}
${LOVR_EMSCRIPTEN_FLAGS}
)
if(WIN32)

View File

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

View File

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

View File

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

View File

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

View File

@ -52,10 +52,12 @@ Font* lovrFontCreate(FontData* fontData) {
font->texture = lovrTextureCreate(textureData);
lovrTextureSetWrap(font->texture, WRAP_CLAMP, WRAP_CLAMP);
if (lovrGraphicsIsSupported(FEATURE_SWIZZLE)) {
int swizzle[4] = { GL_RED, GL_RED, GL_RED, GL_GREEN };
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
}
#ifndef LOVR_WEB
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
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;
}

View File

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

View File

@ -55,18 +55,6 @@ typedef enum {
LIMIT_TEXTURE_MSAA
} 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 {
int x;
int y;
@ -162,7 +150,6 @@ void lovrGraphicsSetWireframe(int wireframe);
int lovrGraphicsGetWidth();
int lovrGraphicsGetHeight();
float lovrGraphicsGetSystemLimit(GraphicsLimit limit);
int lovrGraphicsIsSupported(GraphicsFeature feature);
void lovrGraphicsPushCanvas();
void lovrGraphicsPopCanvas();
void lovrGraphicsSetViewport(int x, int y, int w, int h);

View File

@ -5,7 +5,7 @@
static void lovrMeshBindAttributes(Mesh* mesh) {
Shader* shader = lovrGraphicsGetShader();
if (!shader || (shader == mesh->lastShader && !mesh->attributesDirty && lovrGraphicsIsSupported(FEATURE_VAO))) {
if (!shader || (shader == mesh->lastShader && !mesh->attributesDirty)) {
return;
}
@ -23,11 +23,7 @@ static void lovrMeshBindAttributes(Mesh* mesh) {
glEnableVertexAttribArray(location);
if (attribute.type == MESH_INT) {
if (!lovrGraphicsIsSupported(FEATURE_SHADER_INTS)) {
error("Integer attributes are not supported on this platform.");
} else {
glVertexAttribIPointer(location, attribute.count, attribute.type, mesh->stride, (void*) offset);
}
glVertexAttribIPointer(location, attribute.count, attribute.type, mesh->stride, (void*) offset);
} else {
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;
}
mesh->data = NULL;
mesh->count = count;
mesh->stride = stride;
mesh->enabledAttributes = ~0;
@ -92,13 +87,7 @@ Mesh* lovrMeshCreate(int count, MeshFormat* format, MeshDrawMode drawMode, MeshU
glGenBuffers(1, &mesh->ibo);
glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
glBufferData(GL_ARRAY_BUFFER, mesh->count * mesh->stride, NULL, mesh->usage);
if (lovrGraphicsIsSupported(FEATURE_VAO)) {
glGenVertexArrays(1, &mesh->vao);
}
if (!lovrGraphicsIsSupported(FEATURE_MAPPED_BUFFERS)) {
mesh->data = malloc(mesh->count * mesh->stride);
}
glGenVertexArrays(1, &mesh->vao);
return mesh;
}
@ -110,12 +99,9 @@ void lovrMeshDestroy(const Ref* ref) {
}
glDeleteBuffers(1, &mesh->vbo);
glDeleteBuffers(1, &mesh->ibo);
if (lovrGraphicsIsSupported(FEATURE_VAO)) {
glDeleteVertexArrays(1, &mesh->vao);
}
glDeleteVertexArrays(1, &mesh->vao);
vec_deinit(&mesh->map);
vec_deinit(&mesh->format);
free(mesh->data);
free(mesh);
}
@ -131,9 +117,7 @@ void lovrMeshDraw(Mesh* mesh, mat4 transform) {
lovrGraphicsBindTexture(mesh->texture);
lovrGraphicsPrepare();
if (lovrGraphicsIsSupported(FEATURE_VAO)) {
glBindVertexArray(mesh->vao);
}
glBindVertexArray(mesh->vao);
lovrMeshBindAttributes(mesh);
@ -266,12 +250,6 @@ void lovrMeshSetTexture(Mesh* mesh, Texture* texture) {
}
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.
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) {
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) {
mesh->isMapped = 0;
glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);

View File

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

View File

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

View File

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

View File

@ -12,8 +12,7 @@ typedef enum {
typedef enum {
WRAP_CLAMP = GL_CLAMP_TO_EDGE,
WRAP_REPEAT = GL_REPEAT,
WRAP_MIRRORED_REPEAT = GL_MIRRORED_REPEAT,
WRAP_CLAMP_ZERO = GL_CLAMP_TO_BORDER
WRAP_MIRRORED_REPEAT = GL_MIRRORED_REPEAT
} WrapMode;
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
#define APIENTRY __stdcall
#elif EMSCRIPTEN
#define GLFW_INCLUDE_ES2
#elif LOVR_WEB
#define GLFW_INCLUDE_ES3
#endif
#include "lib/glad/glad.h"
#include <GLFW/glfw3.h>

View File

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