updated from latest love-android (228a26ab99bb)

This commit is contained in:
fysx
2014-08-28 10:55:10 +02:00
parent 45b1fc2509
commit b875fffedb
50 changed files with 982 additions and 226 deletions
@@ -119,6 +119,16 @@ bool Graphics::getConstant(StackType in, const char *&out)
return stackTypes.find(in, out);
}
bool Graphics::getConstant(const char *in, StatType &out)
{
return statTypes.find(in, out);
}
bool Graphics::getConstant(StatType in, const char *&out)
{
return statTypes.find(in, out);
}
StringMap<Graphics::DrawMode, Graphics::DRAW_MAX_ENUM>::Entry Graphics::drawModeEntries[] =
{
{ "line", Graphics::DRAW_LINE },
@@ -212,5 +222,17 @@ StringMap<Graphics::StackType, Graphics::STACK_MAX_ENUM>::Entry Graphics::stackT
StringMap<Graphics::StackType, Graphics::STACK_MAX_ENUM> Graphics::stackTypes(Graphics::stackTypeEntries, sizeof(Graphics::stackTypeEntries));
StringMap<Graphics::StatType, Graphics::STAT_MAX_ENUM>::Entry Graphics::statTypeEntries[] =
{
{"drawcalls", Graphics::STAT_DRAW_CALLS},
{"canvasswitches", Graphics::STAT_CANVAS_SWITCHES},
{"canvases", Graphics::STAT_CANVASES},
{"images", Graphics::STAT_IMAGES},
{"fonts", Graphics::STAT_FONTS},
{"texturememory", Graphics::STAT_TEXTURE_MEMORY},
};
StringMap<Graphics::StatType, Graphics::STAT_MAX_ENUM> Graphics::statTypes(Graphics::statTypeEntries, sizeof(Graphics::statTypeEntries));
} // graphics
} // love
+27
View File
@@ -128,6 +128,17 @@ public:
STACK_MAX_ENUM
};
enum StatType
{
STAT_DRAW_CALLS,
STAT_CANVAS_SWITCHES,
STAT_CANVASES,
STAT_IMAGES,
STAT_FONTS,
STAT_TEXTURE_MEMORY,
STAT_MAX_ENUM
};
struct RendererInfo
{
std::string name;
@@ -136,6 +147,16 @@ public:
std::string device;
};
struct Stats
{
int drawCalls;
int canvasSwitches;
int canvases;
int images;
int fonts;
size_t textureMemory;
};
virtual ~Graphics();
// Implements Module.
@@ -200,6 +221,9 @@ public:
static bool getConstant(const char *in, StackType &out);
static bool getConstant(StackType in, const char *&out);
static bool getConstant(const char *in, StatType &out);
static bool getConstant(StatType in, const char *&out);
private:
static StringMap<DrawMode, DRAW_MAX_ENUM>::Entry drawModeEntries[];
@@ -229,6 +253,9 @@ private:
static StringMap<StackType, STACK_MAX_ENUM>::Entry stackTypeEntries[];
static StringMap<StackType, STACK_MAX_ENUM> stackTypes;
static StringMap<StatType, STAT_MAX_ENUM>::Entry statTypeEntries[];
static StringMap<StatType, STAT_MAX_ENUM> statTypes;
}; // Graphics
} // graphics
+4 -13
View File
@@ -43,26 +43,17 @@ Volatile::~Volatile()
bool Volatile::loadAll()
{
bool success = true;
std::list<Volatile *>::iterator i = all.begin();
while (i != all.end())
{
success = success && (*i)->loadVolatile();
i++;
}
for (Volatile *v : all)
success = success && v->loadVolatile();
return success;
}
void Volatile::unloadAll()
{
std::list<Volatile *>::iterator i = all.begin();
while (i != all.end())
{
(*i)->unloadVolatile();
i++;
}
for (Volatile *v : all)
v->unloadVolatile();
}
} // graphics
@@ -185,6 +185,7 @@ struct FramebufferStrategyCore : public FramebufferStrategy
virtual void bindFBO(GLuint framebuffer)
{
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
++Canvas::switchCount;
}
virtual void setAttachments()
@@ -338,6 +339,7 @@ struct FramebufferStrategyPackedEXT : public FramebufferStrategy
virtual void bindFBO(GLuint framebuffer)
{
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
++Canvas::switchCount;
}
virtual void setAttachments()
@@ -433,6 +435,8 @@ FramebufferStrategyEXT strategyEXT;
Canvas *Canvas::current = nullptr;
OpenGL::Viewport Canvas::systemViewport = OpenGL::Viewport();
bool Canvas::screenHasSRGB = false;
int Canvas::switchCount = 0;
int Canvas::canvasCount = 0;
static void getStrategy()
{
@@ -460,6 +464,7 @@ Canvas::Canvas(int width, int height, Format format, int msaa)
, format(format)
, msaa_samples(msaa)
, msaa_dirty(false)
, texture_memory(0)
{
this->width = width;
this->height = height;
@@ -490,10 +495,14 @@ Canvas::Canvas(int width, int height, Format format, int msaa)
getStrategy();
loadVolatile();
++canvasCount;
}
Canvas::~Canvas()
{
--canvasCount;
// reset framebuffer if still using this one
if (current == this)
stopGrab();
@@ -616,6 +625,14 @@ bool Canvas::loadVolatile()
msaa_dirty = (msaa_buffer != 0);
size_t prevmemsize = texture_memory;
texture_memory = (getFormatBitsPerPixel(format) * width * height) / 8;
if (msaa_buffer != 0)
texture_memory += (texture_memory * msaa_samples);
gl.updateTextureMemorySize(prevmemsize, texture_memory);
return true;
}
@@ -630,6 +647,9 @@ void Canvas::unloadVolatile()
resolve_fbo = msaa_buffer = 0;
attachedCanvases.clear();
gl.updateTextureMemorySize(texture_memory, 0);
texture_memory = 0;
}
void Canvas::drawv(const Matrix &t, const Vertex *v)
@@ -647,7 +667,7 @@ void Canvas::drawv(const Matrix &t, const Vertex *v)
gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *) &v[0].x);
gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *) &v[0].s);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
gl.drawArrays(GL_TRIANGLE_FAN, 0, 4);
gl.disableVertexAttribArray(OpenGL::ATTRIB_POS);
gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD);
@@ -1088,6 +1108,27 @@ void Canvas::convertFormat(Canvas::Format format, GLenum &internalformat, GLenum
}
}
size_t Canvas::getFormatBitsPerPixel(Format format)
{
switch (getSizedFormat(format))
{
case FORMAT_RGBA8:
case FORMAT_RGB10A2:
case FORMAT_RG11B10F:
case FORMAT_SRGB:
default:
return 32;
case FORMAT_RGBA4:
case FORMAT_RGB5A1:
case FORMAT_RGB565:
return 16;
case FORMAT_RGBA16F:
return 64;
case FORMAT_RGBA32F:
return 128;
}
}
bool Canvas::isSupported()
{
getStrategy();
@@ -26,6 +26,7 @@
#include "image/ImageData.h"
#include "common/Matrix.h"
#include "common/StringMap.h"
#include "common/int.h"
#include "Texture.h"
#include "OpenGL.h"
@@ -127,6 +128,9 @@ public:
// Whether the main screen should have linear -> sRGB conversions enabled.
static bool screenHasSRGB;
static int switchCount;
static int canvasCount;
static bool getConstant(const char *in, Format &out);
static bool getConstant(Format in, const char *&out);
@@ -136,6 +140,7 @@ private:
static Format getSizedFormat(Format format);
static void convertFormat(Format format, GLenum &internalformat, GLenum &externalformat, GLenum &type);
static size_t getFormatBitsPerPixel(Format format);
GLuint fbo;
GLuint resolve_fbo;
@@ -153,6 +158,8 @@ private:
int msaa_samples;
bool msaa_dirty;
size_t texture_memory;
void setupGrab();
void drawv(const Matrix &t, const Vertex *v);
+17 -2
View File
@@ -37,6 +37,8 @@ namespace graphics
namespace opengl
{
int Font::fontCount = 0;
const int Font::TEXTURE_WIDTHS[] = {128, 256, 256, 512, 512, 1024, 1024};
const int Font::TEXTURE_HEIGHTS[] = {128, 128, 256, 256, 512, 512, 1024};
@@ -48,6 +50,7 @@ Font::Font(love::font::Rasterizer *r, const Texture::Filter &filter)
, mSpacing(1)
, filter(filter)
, useSpacesAsTab(false)
, textureMemorySize(0)
{
this->filter.mipmap = Texture::FILTER_NONE;
@@ -90,12 +93,16 @@ Font::Font(love::font::Rasterizer *r, const Texture::Filter &filter)
}
delete gd;
++fontCount;
}
Font::~Font()
{
delete indexBuffer;
unloadVolatile();
--fontCount;
}
bool Font::initializeTexture(GLenum format)
@@ -173,6 +180,11 @@ void Font::createTexture()
&emptyData[0]);
setFilter(filter);
size_t prevmemsize = textureMemorySize;
textureMemorySize += emptyData.size();
gl.updateTextureMemorySize(prevmemsize, textureMemorySize);
}
Font::Glyph *Font::addGlyph(uint32 glyph)
@@ -414,14 +426,14 @@ void Font::print(const std::string &text, float x, float y, float extra_spacing,
{
// Optimization: setting a base vertex is faster than redoing the
// setVertexAttribArray calls before each draw.
glDrawElementsBaseVertex(GL_TRIANGLES, (it->vertexcount / 4) * 6, elemtype, elemoffset, it->startvertex);
gl.drawElementsBaseVertex(GL_TRIANGLES, (it->vertexcount / 4) * 6, elemtype, elemoffset, it->startvertex);
}
else
{
gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(GlyphVertex), &glyphverts[it->startvertex].x);
gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(GlyphVertex), &glyphverts[it->startvertex].s);
glDrawElements(GL_TRIANGLES, (it->vertexcount / 4) * 6, elemtype, elemoffset);
gl.drawElements(GL_TRIANGLES, (it->vertexcount / 4) * 6, elemtype, elemoffset);
}
}
@@ -598,6 +610,9 @@ void Font::unloadVolatile()
iter++;
}
textures.clear();
gl.updateTextureMemorySize(textureMemorySize, 0);
textureMemorySize = 0;
}
int Font::getAscent() const
@@ -139,6 +139,8 @@ public:
bool hasGlyph(uint32 glyph) const;
bool hasGlyphs(const std::string &text) const;
static int fontCount;
private:
enum FontType
@@ -210,6 +212,8 @@ private:
bool useSpacesAsTab;
size_t textureMemorySize;
static const int NUM_TEXTURE_SIZES = 7;
static const int TEXTURE_WIDTHS[NUM_TEXTURE_SIZES];
static const int TEXTURE_HEIGHTS[NUM_TEXTURE_SIZES];
@@ -442,6 +442,10 @@ void Graphics::present()
// Restore the currently active canvas, if there is one.
setCanvas(canvases);
// Reset the per-frame stat counts.
gl.stats.drawCalls = 0;
Canvas::switchCount = 0;
}
int Graphics::getWidth() const
@@ -1049,7 +1053,7 @@ void Graphics::point(float x, float y)
gl.enableVertexAttribArray(OpenGL::ATTRIB_POS);
gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, coord);
glDrawArrays(GL_POINTS, 0, 1);
gl.drawArrays(GL_POINTS, 0, 1);
gl.disableVertexAttribArray(OpenGL::ATTRIB_POS);
}
@@ -1170,7 +1174,7 @@ void Graphics::arc(DrawMode mode, float x, float y, float radius, float angle1,
gl.enableVertexAttribArray(OpenGL::ATTRIB_POS);
gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, (GLvoid *) coords);
glDrawArrays(GL_TRIANGLE_FAN, 0, points + 2);
gl.drawArrays(GL_TRIANGLE_FAN, 0, points + 2);
gl.disableVertexAttribArray(OpenGL::ATTRIB_POS);
}
@@ -1198,7 +1202,7 @@ void Graphics::polygon(DrawMode mode, const float *coords, size_t count)
gl.enableVertexAttribArray(OpenGL::ATTRIB_POS);
gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, (GLvoid *) coords);
glDrawArrays(GL_TRIANGLE_FAN, 0, count / 2);
gl.drawArrays(GL_TRIANGLE_FAN, 0, count / 2);
gl.disableVertexAttribArray(OpenGL::ATTRIB_POS);
}
@@ -1302,6 +1306,20 @@ Graphics::RendererInfo Graphics::getRendererInfo() const
return info;
}
Graphics::Stats Graphics::getStats() const
{
Stats stats;
stats.drawCalls = gl.stats.drawCalls;
stats.canvasSwitches = Canvas::switchCount;
stats.canvases = Canvas::canvasCount;
stats.images = Image::imageCount;
stats.fonts = Font::fontCount;
stats.textureMemory = gl.stats.textureMemory;
return stats;
}
double Graphics::getSystemLimit(SystemLimit limittype) const
{
double limit = 0.0;
@@ -415,11 +415,16 @@ public:
/**
* Returns system-dependent renderer information.
* Returned string s can vary greatly between systems! Do not rely on it for
* Returned strings can vary greatly between systems! Do not rely on it for
* anything!
**/
RendererInfo getRendererInfo() const;
/**
* Returns performance-related statistics.
**/
Stats getStats() const;
/**
* Gets the system-dependent numeric limit for the specified parameter.
**/
+32 -1
View File
@@ -31,6 +31,8 @@ namespace graphics
namespace opengl
{
int Image::imageCount = 0;
float Image::maxMipmapSharpness = 0.0f;
Texture::FilterMode Image::defaultMipmapFilter = Texture::FILTER_NONE;
@@ -47,10 +49,13 @@ Image::Image(love::image::ImageData *data, Format format)
, compressed(false)
, format(format)
, usingDefaultTexture(false)
, textureMemorySize(0)
{
width = data->getWidth();
height = data->getHeight();
preload();
++imageCount;
}
Image::Image(love::image::CompressedData *cdata, Format format)
@@ -64,15 +69,20 @@ Image::Image(love::image::CompressedData *cdata, Format format)
, compressed(true)
, format(format)
, usingDefaultTexture(false)
, textureMemorySize(0)
{
width = cdata->getWidth(0);
height = cdata->getHeight(0);
preload();
++imageCount;
}
Image::~Image()
{
unload();
--imageCount;
}
love::image::ImageData *Image::getImageData() const
@@ -155,8 +165,11 @@ void Image::uploadCompressedMipmaps()
"compressed image does not have all required levels.");
}
size_t totalsize = cdata->getSize(0);
for (int i = 1; i < count; i++)
{
totalsize += cdata->getSize(i);
glCompressedTexImage2D(GL_TEXTURE_2D,
i,
getCompressedFormat(cdata->getFormat()),
@@ -166,6 +179,10 @@ void Image::uploadCompressedMipmaps()
GLsizei(cdata->getSize(i)),
cdata->getData(i));
}
size_t prevmemsize = textureMemorySize;
textureMemorySize = totalsize;
gl.updateTextureMemorySize(prevmemsize, textureMemorySize);
}
void Image::createMipmaps()
@@ -220,6 +237,10 @@ void Image::createMipmaps()
data->getData());
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
}
size_t prevmemsize = textureMemorySize;
textureMemorySize = paddedWidth * paddedHeight * 4 * 1.3333;
gl.updateTextureMemorySize(prevmemsize, textureMemorySize);
}
void Image::checkMipmapsCreated()
@@ -403,6 +424,13 @@ bool Image::loadVolatile()
if (glerr != GL_NO_ERROR)
throw love::Exception("Cannot create image (error code 0x%x)", glerr);
if (isCompressed())
textureMemorySize = cdata->getSize(0);
else
textureMemorySize = paddedWidth * paddedHeight * 4;
gl.updateTextureMemorySize(0, textureMemorySize);
usingDefaultTexture = false;
mipmapsCreated = false;
checkMipmapsCreated();
@@ -478,6 +506,9 @@ void Image::unloadVolatile()
{
gl.deleteTexture(texture);
texture = 0;
gl.updateTextureMemorySize(textureMemorySize, 0);
textureMemorySize = 0;
}
}
@@ -553,7 +584,7 @@ void Image::drawv(const Matrix &t, const Vertex *v)
gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *)&v[0].x);
gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *)&v[0].s);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
gl.drawArrays(GL_TRIANGLE_FAN, 0, 4);
gl.disableVertexAttribArray(OpenGL::ATTRIB_POS);
gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD);
@@ -147,6 +147,8 @@ public:
static bool getConstant(const char *in, Format &out);
static bool getConstant(Format in, const char *&out);
static int imageCount;
private:
void uploadDefaultTexture();
@@ -183,6 +185,8 @@ private:
// back to a default texture.
bool usingDefaultTexture;
size_t textureMemorySize;
void preload();
void uploadTexturePadded();
@@ -375,7 +375,7 @@ void Mesh::draw(float x, float y, float angle, float sx, float sy, float ox, flo
GLenum type = element_data_type;
const void *indices = ibo->getPointer(min * getGLDataTypeSize(type));
glDrawElements(mode, max - min + 1, type, indices);
gl.drawElements(mode, max - min + 1, type, indices);
}
else
{
@@ -388,7 +388,7 @@ void Mesh::draw(float x, float y, float angle, float sx, float sy, float ox, flo
min = std::min(range_min, max);
// Normal non-indexed drawing (no custom vertex map.)
glDrawArrays(mode, min, max - min + 1);
gl.drawArrays(mode, min, max - min + 1);
}
gl.disableVertexAttribArray(OpenGL::ATTRIB_POS);
+33 -39
View File
@@ -41,7 +41,8 @@ namespace opengl
{
OpenGL::OpenGL()
: contextInitialized(false)
: stats()
, contextInitialized(false)
, maxAnisotropy(1.0f)
, maxTextureSize(0)
, maxRenderTargets(0)
@@ -360,6 +361,24 @@ void OpenGL::prepareDraw()
}
}
void OpenGL::drawArrays(GLenum mode, GLint first, GLsizei count)
{
glDrawArrays(mode, first, count);
++stats.drawCalls;
}
void OpenGL::drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)
{
glDrawElements(mode, count, type, indices);
++stats.drawCalls;
}
void OpenGL::drawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex)
{
glDrawElementsBaseVertex(mode, count, type, indices, basevertex);
++stats.drawCalls;
}
void OpenGL::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
{
Shader *shader = Shader::current;
@@ -384,6 +403,8 @@ void OpenGL::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsize
if (shaderHasID)
state.lastPseudoInstanceID = primcount - 1;
}
++stats.drawCalls;
}
void OpenGL::drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount)
@@ -410,6 +431,8 @@ void OpenGL::drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, cons
if (shaderHasID)
state.lastPseudoInstanceID = primcount - 1;
}
++stats.drawCalls;
}
void OpenGL::setColor(const Color &c)
@@ -648,11 +671,10 @@ void OpenGL::deleteTexture(GLuint texture)
{
// glDeleteTextures binds texture 0 to all texture units the deleted texture
// was bound to before deletion.
std::vector<GLuint>::iterator it;
for (it = state.textureUnits.begin(); it != state.textureUnits.end(); ++it)
for (GLuint &texid : state.textureUnits)
{
if (*it == texture)
*it = 0;
if (texid == texture)
texid = 0;
}
glDeleteTextures(1, &texture);
@@ -789,40 +811,6 @@ void OpenGL::setTextureWrap(const graphics::Texture::Wrap &w)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, gt);
}
Texture::Wrap OpenGL::getTextureWrap()
{
GLint gs, gt;
glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &gs);
glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &gt);
Texture::Wrap w;
switch (gs)
{
case GL_CLAMP_TO_EDGE:
w.s = Texture::WRAP_CLAMP;
break;
case GL_REPEAT:
default:
w.s = Texture::WRAP_REPEAT;
break;
}
switch (gt)
{
case GL_CLAMP_TO_EDGE:
w.t = Texture::WRAP_CLAMP;
break;
case GL_REPEAT:
default:
w.t = Texture::WRAP_REPEAT;
break;
}
return w;
}
int OpenGL::getMaxTextureSize() const
{
return maxTextureSize;
@@ -833,6 +821,12 @@ int OpenGL::getMaxRenderTargets() const
return maxRenderTargets;
}
void OpenGL::updateTextureMemorySize(size_t oldsize, size_t newsize)
{
int64 memsize = (int64) stats.textureMemory + ((int64 )newsize - (int64) oldsize);
stats.textureMemory = (size_t) std::max(memsize, (int64) 0);
}
OpenGL::Vendor OpenGL::getVendor() const
{
return vendor;
+15 -8
View File
@@ -147,6 +147,12 @@ public:
OpenGL &gl;
};
struct Stats
{
size_t textureMemory;
int drawCalls;
} stats;
OpenGL();
virtual ~OpenGL() {}
@@ -174,13 +180,17 @@ public:
void prepareDraw();
/**
* glDrawArraysInstanced with a pseudo-instancing fallback.
* glDraw* functions which increment the draw-call counter by themselves.
**/
void drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
void drawArrays(GLenum mode, GLint first, GLsizei count);
void drawElements(GLenum mode, GLsizei count, GLenum type, const void *indices);
void drawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex);
/**
* glDrawElementsInstanced with a pseudo-instancing fallback.
* glDrawArraysInstanced and glDrawElementsInstanced with pseudo-instancing
* fallbacks. They also increment the draw-call counter (once per call).
**/
void drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
void drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
/**
@@ -318,11 +328,6 @@ public:
**/
void setTextureWrap(const graphics::Texture::Wrap &w);
/**
* Returns the texture wrap mode for the currently bound texture.
**/
graphics::Texture::Wrap getTextureWrap();
/**
* Returns the maximum supported width or height of a texture.
**/
@@ -333,6 +338,8 @@ public:
**/
int getMaxRenderTargets() const;
void updateTextureMemorySize(size_t oldsize, size_t newsize);
/**
* Get the GPU vendor of this OpenGL context.
**/
@@ -890,7 +890,7 @@ void ParticleSystem::draw(float x, float y, float angle, float sx, float sy, flo
{
VertexBuffer::Bind ibo_bind(*ibo->getVertexBuffer());
glDrawElements(GL_TRIANGLES, ibo->getIndexCount(pCount), ibo->getType(), ibo->getPointer(0));
gl.drawElements(GL_TRIANGLES, ibo->getIndexCount(pCount), ibo->getType(), ibo->getPointer(0));
}
gl.disableVertexAttribArray(OpenGL::ATTRIB_POS);
@@ -371,9 +371,9 @@ void Polyline::draw()
gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, vertices);
if (use_quad_indices)
glDrawElements(draw_mode, (vertex_count / 4) * 6, GL_UNSIGNED_SHORT, indices);
gl.drawElements(draw_mode, (vertex_count / 4) * 6, GL_UNSIGNED_SHORT, indices);
else
glDrawArrays(draw_mode, 0, vertex_count);
gl.drawArrays(draw_mode, 0, vertex_count);
if (overdraw)
{
@@ -388,9 +388,9 @@ void Polyline::draw()
gl.setVertexAttribArray(OpenGL::ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, 0, colors);
if (use_quad_indices)
glDrawElements(draw_mode, (overdraw_vertex_count / 4) * 6, GL_UNSIGNED_SHORT, indices);
gl.drawElements(draw_mode, (overdraw_vertex_count / 4) * 6, GL_UNSIGNED_SHORT, indices);
else
glDrawArrays(draw_mode, 0, overdraw_vertex_count);
gl.drawArrays(draw_mode, 0, overdraw_vertex_count);
gl.disableVertexAttribArray(OpenGL::ATTRIB_COLOR);
gl.setColor(c);
@@ -294,7 +294,7 @@ void SpriteBatch::draw(float x, float y, float angle, float sx, float sy, float
gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), array_buf->getPointer(texel_offset));
gl.prepareDraw();
glDrawElements(GL_TRIANGLES, element_buf->getIndexCount(next), element_buf->getType(), element_buf->getPointer(0));
gl.drawElements(GL_TRIANGLES, element_buf->getIndexCount(next), element_buf->getType(), element_buf->getPointer(0));
gl.disableVertexAttribArray(OpenGL::ATTRIB_POS);
gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD);
@@ -1090,6 +1090,41 @@ int w_getRendererInfo(lua_State *L)
return 4;
}
int w_getStats(lua_State *L)
{
Graphics::Stats stats = instance()->getStats();
lua_createtable(L, 0, (int) Graphics::STAT_MAX_ENUM);
const char *sname = nullptr;
Graphics::getConstant(Graphics::STAT_DRAW_CALLS, sname);
lua_pushinteger(L, stats.drawCalls);
lua_setfield(L, -2, sname);
Graphics::getConstant(Graphics::STAT_CANVAS_SWITCHES, sname);
lua_pushinteger(L, stats.canvasSwitches);
lua_setfield(L, -2, sname);
Graphics::getConstant(Graphics::STAT_CANVASES, sname);
lua_pushinteger(L, stats.canvases);
lua_setfield(L, -2, sname);
Graphics::getConstant(Graphics::STAT_IMAGES, sname);
lua_pushinteger(L, stats.images);
lua_setfield(L, -2, sname);
Graphics::getConstant(Graphics::STAT_FONTS, sname);
lua_pushinteger(L, stats.fonts);
lua_setfield(L, -2, sname);
Graphics::getConstant(Graphics::STAT_TEXTURE_MEMORY, sname);
lua_pushnumber(L, (lua_Number) stats.textureMemory);
lua_setfield(L, -2, sname);
return 1;
}
int w_getSystemLimit(lua_State *L)
{
const char *limitstr = luaL_checkstring(L, 1);
@@ -1462,6 +1497,7 @@ static const luaL_Reg functions[] =
{ "getCanvasFormats", w_getCanvasFormats },
{ "getCompressedImageFormats", w_getCompressedImageFormats },
{ "getRendererInfo", w_getRendererInfo },
{ "getStats", w_getStats },
{ "getSystemLimit", w_getSystemLimit },
{ "draw", w_draw },
@@ -98,6 +98,7 @@ int w_isSupported(lua_State *L);
int w_getCanvasFormats(lua_State *L);
int w_getCompressedImageFormats(lua_State *L);
int w_getRendererInfo(lua_State *L);
int w_getStats(lua_State *L);
int w_getSystemLimit(lua_State *L);
int w_draw(lua_State *L);
int w_print(lua_State *L);