diff --git a/src/api/graphics.c b/src/api/graphics.c index 3f3822cc..ca813d05 100644 --- a/src/api/graphics.c +++ b/src/api/graphics.c @@ -367,14 +367,15 @@ int l_lovrGraphicsGetDimensions(lua_State* L) { } int l_lovrGraphicsGetSystemLimits(lua_State* L) { + GraphicsLimits limits = lovrGraphicsGetLimits(); lua_newtable(L); - lua_pushnumber(L, lovrGraphicsGetSystemLimit(LIMIT_POINT_SIZE)); + lua_pushnumber(L, limits.pointSizes[1]); lua_setfield(L, -2, "pointsize"); - lua_pushinteger(L, lovrGraphicsGetSystemLimit(LIMIT_TEXTURE_SIZE)); + lua_pushinteger(L, limits.textureSize); lua_setfield(L, -2, "texturesize"); - lua_pushinteger(L, lovrGraphicsGetSystemLimit(LIMIT_TEXTURE_MSAA)); + lua_pushinteger(L, limits.textureMSAA); lua_setfield(L, -2, "texturemsaa"); - lua_pushinteger(L, lovrGraphicsGetSystemLimit(LIMIT_TEXTURE_ANISOTROPY)); + lua_pushinteger(L, limits.textureAnisotropy); lua_setfield(L, -2, "anisotropy"); return 1; } diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index 3072abce..d9513c04 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -86,19 +86,6 @@ void lovrGraphicsInit() { state.fullscreenShader = lovrShaderCreate(lovrNoopVertexShader, lovrDefaultFragmentShader); state.defaultTexture = lovrTextureCreate(lovrTextureDataGetBlank(1, 1, 0xff, FORMAT_RGBA)); - // System Limits - glGetIntegerv(GL_MAX_TEXTURE_SIZE, &state.maxTextureSize); - glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &state.maxTextureAnisotropy); -#ifdef EMSCRIPTEN - 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 lovrGraphicsReset(); atexit(lovrGraphicsDestroy); @@ -411,14 +398,16 @@ int lovrGraphicsGetHeight() { return height; } -float lovrGraphicsGetSystemLimit(GraphicsLimit limit) { - switch (limit) { - case LIMIT_POINT_SIZE: return state.maxPointSize; - case LIMIT_TEXTURE_SIZE: return state.maxTextureSize; - case LIMIT_TEXTURE_MSAA: return state.maxTextureMSAA; - case LIMIT_TEXTURE_ANISOTROPY: return state.maxTextureAnisotropy; - default: error("Unknown limit %d\n", limit); +GraphicsLimits lovrGraphicsGetLimits() { + if (!state.limits.initialized) { + glGetFloatv(GL_POINT_SIZE_RANGE, state.limits.pointSizes); + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &state.limits.textureSize); + glGetIntegerv(GL_MAX_SAMPLES, &state.limits.textureMSAA); + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &state.limits.textureAnisotropy); + state.limits.initialized = 1; } + + return state.limits; } void lovrGraphicsPushCanvas() { diff --git a/src/graphics/graphics.h b/src/graphics/graphics.h index 05a3690c..844dd71b 100644 --- a/src/graphics/graphics.h +++ b/src/graphics/graphics.h @@ -49,12 +49,13 @@ typedef enum { COMPARE_GREATER = GL_GREATER } CompareMode; -typedef enum { - LIMIT_POINT_SIZE, - LIMIT_TEXTURE_SIZE, - LIMIT_TEXTURE_MSAA, - LIMIT_TEXTURE_ANISOTROPY -} GraphicsLimit; +typedef struct { + int initialized; + float pointSizes[2]; + int textureSize; + int textureMSAA; + float textureAnisotropy; +} GraphicsLimits; typedef struct { int framebuffer; @@ -93,10 +94,7 @@ typedef struct { int isWireframe; FilterMode defaultFilter; float defaultAnisotropy; - float maxPointSize; - int maxTextureSize; - int maxTextureMSAA; - float maxTextureAnisotropy; + GraphicsLimits limits; } GraphicsState; // Base @@ -140,7 +138,7 @@ void lovrGraphicsGetDefaultFilter(FilterMode* filter, float* anisotropy); void lovrGraphicsSetDefaultFilter(FilterMode filter, float anisotropy); int lovrGraphicsGetWidth(); int lovrGraphicsGetHeight(); -float lovrGraphicsGetSystemLimit(GraphicsLimit limit); +GraphicsLimits lovrGraphicsGetLimits(); void lovrGraphicsPushCanvas(); void lovrGraphicsPopCanvas(); void lovrGraphicsSetViewport(int x, int y, int w, int h);