Added love.graphics.getSystemLimit (resolves issue #840). Deprecated love.graphics.getMaxPointSize.

love.graphics.getSystemLimit currently accepts these enum strings: “pointsize”, “texturesize”, “multicanvas”, and “canvasfsaa”.
This commit is contained in:
Alex Szpakowski
2014-01-27 02:19:30 -04:00
parent 7556fde5e6
commit 988404e4ca
9 changed files with 119 additions and 38 deletions
+20
View File
@@ -109,6 +109,16 @@ bool Graphics::getConstant(RendererInfo in, const char *&out)
return rendererInfo.find(in, out);
}
bool Graphics::getConstant(const char *in, SystemLimit &out)
{
return systemLimits.find(in, out);
}
bool Graphics::getConstant(SystemLimit in, const char *&out)
{
return systemLimits.find(in, out);
}
StringMap<Graphics::DrawMode, Graphics::DRAW_MAX_ENUM>::Entry Graphics::drawModeEntries[] =
{
{ "line", Graphics::DRAW_LINE },
@@ -190,5 +200,15 @@ StringMap<Graphics::RendererInfo, Graphics::RENDERER_INFO_MAX_ENUM>::Entry Graph
StringMap<Graphics::RendererInfo, Graphics::RENDERER_INFO_MAX_ENUM> Graphics::rendererInfo(Graphics::rendererInfoEntries, sizeof(Graphics::rendererInfoEntries));
StringMap<Graphics::SystemLimit, Graphics::LIMIT_MAX_ENUM>::Entry Graphics::systemLimitEntries[] =
{
{"pointsize", Graphics::LIMIT_POINT_SIZE},
{"texturesize", Graphics::LIMIT_TEXTURE_SIZE},
{"multicanvas", Graphics::LIMIT_MULTI_CANVAS},
{"canvasfsaa", Graphics::LIMIT_CANVAS_FSAA},
};
StringMap<Graphics::SystemLimit, Graphics::LIMIT_MAX_ENUM> Graphics::systemLimits(Graphics::systemLimitEntries, sizeof(Graphics::systemLimitEntries));
} // graphics
} // love
+15
View File
@@ -107,6 +107,15 @@ public:
RENDERER_INFO_MAX_ENUM
};
enum SystemLimit
{
LIMIT_POINT_SIZE,
LIMIT_TEXTURE_SIZE,
LIMIT_MULTI_CANVAS,
LIMIT_CANVAS_FSAA,
LIMIT_MAX_ENUM
};
virtual ~Graphics();
/**
@@ -151,6 +160,9 @@ public:
static bool getConstant(const char *in, RendererInfo &out);
static bool getConstant(RendererInfo in, const char *&out);
static bool getConstant(const char *in, SystemLimit &out);
static bool getConstant(SystemLimit in, const char *&out);
private:
static StringMap<DrawMode, DRAW_MAX_ENUM>::Entry drawModeEntries[];
@@ -177,6 +189,9 @@ private:
static StringMap<RendererInfo, RENDERER_INFO_MAX_ENUM>::Entry rendererInfoEntries[];
static StringMap<RendererInfo, RENDERER_INFO_MAX_ENUM> rendererInfo;
static StringMap<SystemLimit, LIMIT_MAX_ENUM>::Entry systemLimitEntries[];
static StringMap<SystemLimit, LIMIT_MAX_ENUM> systemLimits;
}; // Graphics
} // graphics
+2 -11
View File
@@ -939,17 +939,8 @@ bool Canvas::isHDRSupported()
bool Canvas::isMultiCanvasSupported()
{
if (!(isSupported() && (GLEE_VERSION_2_0 || GLEE_ARB_draw_buffers)))
return false;
if (maxFBOColorAttachments == 0 || maxDrawBuffers == 0)
{
glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxFBOColorAttachments);
glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
}
// system must support at least 4 simultanious active canvases
return maxFBOColorAttachments >= 4 && maxDrawBuffers >= 4;
// system must support at least 4 simultanious active canvases.
return gl.getMaxRenderTargets() >= 4;
}
void Canvas::bindDefaultCanvas()
+35 -12
View File
@@ -313,11 +313,6 @@ void Graphics::discardStencil()
glDisable(GL_STENCIL_TEST);
}
int Graphics::getMaxTextureSize() const
{
return gl.getMaxTextureSize();
}
Image *Graphics::newImage(love::image::ImageData *data)
{
// Create the image.
@@ -717,13 +712,6 @@ Graphics::PointStyle Graphics::getPointStyle() const
return POINT_ROUGH;
}
int Graphics::getMaxPointSize() const
{
GLint max;
glGetIntegerv(GL_POINT_SIZE_MAX, &max);
return (int)max;
}
void Graphics::print(const std::string &str, float x, float y , float angle, float sx, float sy, float ox, float oy, float kx, float ky)
{
if (currentFont != nullptr)
@@ -1031,6 +1019,41 @@ std::string Graphics::getRendererInfo(Graphics::RendererInfo infotype) const
return std::string(infostr);
}
double Graphics::getSystemLimit(SystemLimit limittype) const
{
double limit = 0.0;
switch (limittype)
{
case Graphics::LIMIT_POINT_SIZE:
{
GLfloat limits[2];
glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, limits);
limit = limits[1];
}
break;
case Graphics::LIMIT_TEXTURE_SIZE:
limit = (double) gl.getMaxTextureSize();
break;
case Graphics::LIMIT_MULTI_CANVAS:
limit = (double) gl.getMaxRenderTargets();
break;
case Graphics::LIMIT_CANVAS_FSAA:
if (GLEE_VERSION_3_0 || GLEE_ARB_framebuffer_object
|| GLEE_EXT_framebuffer_multisample)
{
GLint intlimit = 0;
glGetIntegerv(GL_MAX_SAMPLES, &intlimit);
limit = (double) intlimit;
}
break;
default:
break;
}
return limit;
}
void Graphics::push()
{
if (userMatrices == matrixLimit)
+5 -11
View File
@@ -186,11 +186,6 @@ public:
*/
void discardStencil();
/**
* Gets the maximum supported width or height of Textures on this system.
**/
int getMaxTextureSize() const;
/**
* Creates an Image object with padding and/or optimization.
**/
@@ -337,12 +332,6 @@ public:
**/
PointStyle getPointStyle() const;
/**
* Gets the maximum point size supported.
* This may vary from computer to computer.
**/
int getMaxPointSize() const;
/**
* Draws text at the specified coordinates, with rotation and
* scaling along both axes.
@@ -444,6 +433,11 @@ public:
**/
std::string getRendererInfo(Graphics::RendererInfo infotype) const;
/**
* Gets the system-dependent numeric limit for the specified parameter.
**/
double getSystemLimit(SystemLimit limittype) const;
void push();
void pop();
void rotate(float r);
+19
View File
@@ -43,6 +43,7 @@ OpenGL::OpenGL()
: contextInitialized(false)
, maxAnisotropy(1.0f)
, maxTextureSize(0)
, maxRenderTargets(0)
, vendor(VENDOR_UNKNOWN)
, state()
{
@@ -190,6 +191,19 @@ void OpenGL::initMaxValues()
maxAnisotropy = 1.0f;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
if (Canvas::isSupported() && (GLEE_VERSION_2_0 || GLEE_ARB_draw_buffers))
{
int maxattachments = 0;
glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxattachments);
int maxdrawbuffers = 0;
glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxdrawbuffers);
maxRenderTargets = std::min(maxattachments, maxdrawbuffers);
}
else
maxRenderTargets = 0;
}
void OpenGL::createDefaultTexture()
@@ -577,6 +591,11 @@ int OpenGL::getMaxTextureSize() const
return maxTextureSize;
}
int OpenGL::getMaxRenderTargets() const
{
return maxRenderTargets;
}
OpenGL::Vendor OpenGL::getVendor() const
{
return vendor;
+6
View File
@@ -215,6 +215,11 @@ public:
**/
int getMaxTextureSize() const;
/**
* Returns the maximum supported number of simultaneous render targets.
**/
int getMaxRenderTargets() const;
/**
* Get the GPU vendor of this OpenGL context.
**/
@@ -231,6 +236,7 @@ private:
float maxAnisotropy;
int maxTextureSize;
int maxRenderTargets;
Vendor vendor;
+16 -4
View File
@@ -146,7 +146,7 @@ int w_setInvertedStencil(lua_State *L)
int w_getMaxTextureSize(lua_State *L)
{
lua_pushinteger(L, instance->getMaxTextureSize());
lua_pushinteger(L, instance->getSystemLimit(Graphics::LIMIT_TEXTURE_SIZE));
return 1;
}
@@ -831,7 +831,7 @@ int w_getPointStyle(lua_State *L)
int w_getMaxPointSize(lua_State *L)
{
lua_pushnumber(L, instance->getMaxPointSize());
lua_pushnumber(L, instance->getSystemLimit(Graphics::LIMIT_POINT_SIZE));
return 1;
}
@@ -1026,6 +1026,18 @@ int w_getRendererInfo(lua_State *L)
return 4;
}
int w_getSystemLimit(lua_State *L)
{
const char *limitstr = luaL_checkstring(L, 1);
Graphics::SystemLimit limittype;
if (!Graphics::getConstant(limitstr, limittype))
return luaL_error(L, "Invalid system limit type: %s", limitstr);
lua_pushnumber(L, instance->getSystemLimit(limittype));
return 1;
}
int w_draw(lua_State *L)
{
Drawable *drawable = nullptr;
@@ -1363,8 +1375,6 @@ static const luaL_Reg functions[] =
{ "setPointStyle", w_setPointStyle },
{ "getPointSize", w_getPointSize },
{ "getPointStyle", w_getPointStyle },
{ "getMaxPointSize", w_getMaxPointSize },
{ "getMaxTextureSize", w_getMaxTextureSize },
{ "newScreenshot", w_newScreenshot },
{ "setCanvas", w_setCanvas },
{ "getCanvas", w_getCanvas },
@@ -1374,6 +1384,7 @@ static const luaL_Reg functions[] =
{ "isSupported", w_isSupported },
{ "getRendererInfo", w_getRendererInfo },
{ "getSystemLimit", w_getSystemLimit },
{ "draw", w_draw },
@@ -1409,6 +1420,7 @@ static const luaL_Reg functions[] =
// Deprecated since 0.9.1.
{ "getMaxImageSize", w_getMaxTextureSize },
{ "getMaxPointSize", w_getMaxPointSize },
{ 0, 0 }
};
@@ -92,6 +92,7 @@ int w_setShader(lua_State *L);
int w_getShader(lua_State *L);
int w_isSupported(lua_State *L);
int w_getRendererInfo(lua_State *L);
int w_getSystemLimit(lua_State *L);
int w_draw(lua_State *L);
int w_print(lua_State *L);
int w_printf(lua_State *L);