diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libjin-lua/modules/graphics/je_lua_graphics.cpp | 17 | ||||
-rw-r--r-- | src/libjin/game/je_application.cpp | 2 | ||||
-rw-r--r-- | src/libjin/graphics/fonts/je_font.h | 6 | ||||
-rw-r--r-- | src/libjin/graphics/je_canvas.cpp | 4 | ||||
-rw-r--r-- | src/libjin/graphics/je_gl.cpp | 29 | ||||
-rw-r--r-- | src/libjin/graphics/je_gl.h | 28 | ||||
-rw-r--r-- | src/libjin/graphics/je_image.cpp | 2 | ||||
-rw-r--r-- | src/libjin/graphics/je_shapes.cpp | 10 | ||||
-rw-r--r-- | src/libjin/graphics/je_texture.cpp | 3 | ||||
-rw-r--r-- | src/libjin/graphics/je_window.cpp | 3 | ||||
-rw-r--r-- | src/libjin/graphics/je_window.h | 2 |
11 files changed, 93 insertions, 13 deletions
diff --git a/src/libjin-lua/modules/graphics/je_lua_graphics.cpp b/src/libjin-lua/modules/graphics/je_lua_graphics.cpp index aeb1921..fe3b3d8 100644 --- a/src/libjin-lua/modules/graphics/je_lua_graphics.cpp +++ b/src/libjin-lua/modules/graphics/je_lua_graphics.cpp @@ -306,7 +306,7 @@ namespace JinEngine LUA_IMPLEMENT int l_present(lua_State* L) { - Window::get()->swapBuffers(); + Window::get()->present(); return 0; } @@ -992,6 +992,20 @@ namespace JinEngine return 0; } + LUA_IMPLEMENT int l_getStats(lua_State* L) + { + OpenGL::Stats stats = gl.getStats(); + luax_newtable(L); + luax_setfieldinteger(L, "drawCalls", stats.drawCalls); + luax_setfieldinteger(L, "canvasSwitches", stats.canvasSwitches); + luax_setfieldinteger(L, "shaderSwitches", stats.shaderSwitches); + luax_setfieldinteger(L, "fontSwitches", stats.fontSwitches); + luax_setfieldinteger(L, "textures", stats.textures); + luax_setfieldinteger(L, "canvases", stats.canvases); + luax_setfieldinteger(L, "fonts", stats.fonts); + return 1; + } + LUA_EXPORT int luaopen_graphics(lua_State* L) { luaopen_Bitmap(L); @@ -1011,6 +1025,7 @@ namespace JinEngine luaopen_Mesh(L); luaL_Reg methods[] = { + { "getStats", l_getStats }, /* window */ { "init", l_init }, { "setTitle", l_setTitle }, diff --git a/src/libjin/game/je_application.cpp b/src/libjin/game/je_application.cpp index faf9d1f..24629d4 100644 --- a/src/libjin/game/je_application.cpp +++ b/src/libjin/game/je_application.cpp @@ -53,7 +53,7 @@ namespace JinEngine glClear(GL_COLOR_BUFFER_BIT); if (_onDraw != nullptr) _onDraw(); - wnd->swapBuffers(); + wnd->present(); sleep(16); } quitloop:; diff --git a/src/libjin/graphics/fonts/je_font.h b/src/libjin/graphics/fonts/je_font.h index 3af0b11..9c231de 100644 --- a/src/libjin/graphics/fonts/je_font.h +++ b/src/libjin/graphics/fonts/je_font.h @@ -34,12 +34,16 @@ namespace JinEngine Font(unsigned fontsize) : mFontSize(fontsize) { + ++gl.getStats().fonts; } /// /// Font destructor. /// - virtual ~Font() {}; + virtual ~Font() + { + --gl.getStats().fonts; + }; /// /// Create page with given text. diff --git a/src/libjin/graphics/je_canvas.cpp b/src/libjin/graphics/je_canvas.cpp index 0a3f6f4..ba7919e 100644 --- a/src/libjin/graphics/je_canvas.cpp +++ b/src/libjin/graphics/je_canvas.cpp @@ -13,6 +13,7 @@ namespace JinEngine Canvas::Canvas(GLuint n) : fbo(n) { + ++gl.getStats().canvases; } Canvas::Canvas(int w, int h) @@ -37,10 +38,13 @@ namespace JinEngine // Unbind framebuffer gl.bindFrameBuffer(current_fbo); + + ++gl.getStats().canvases; } Canvas::~Canvas() { + --gl.getStats().canvases; } bool Canvas::isBinded(const Canvas* cvs) diff --git a/src/libjin/graphics/je_gl.cpp b/src/libjin/graphics/je_gl.cpp index 7ef4ee0..24b0a48 100644 --- a/src/libjin/graphics/je_gl.cpp +++ b/src/libjin/graphics/je_gl.cpp @@ -23,6 +23,7 @@ namespace JinEngine OpenGL::OpenGL() : mBlendMode(BlendMode::NONE) { + memset(&mStats, 0, sizeof(mStats)); memset(&mColor, 0xff, sizeof(mColor)); // Set default modelview matrix. mModelViewMatrices.push_back(Matrix()); @@ -102,6 +103,7 @@ namespace JinEngine void OpenGL::drawArrays(GLenum mode, GLint first, GLsizei count) { glDrawArrays(mode, first, count); + ++mStats.drawCalls; } void OpenGL::drawBuffer(GLenum mode) @@ -278,10 +280,12 @@ namespace JinEngine void OpenGL::useShader(Shaders::Shader* shader) { - if (shader) + if (mShader != shader && shader) { glUseProgram(shader->getGLProgramID()); mShader = shader; + + ++mStats.shaderSwitches; } } @@ -301,7 +305,7 @@ namespace JinEngine void OpenGL::bindCanvas(Canvas* canvas) { - if (canvas) + if (mCanvas != canvas && canvas) { GLuint fbo = canvas->getGLFrameBuffer(); gl.bindFrameBuffer(fbo); @@ -311,6 +315,8 @@ namespace JinEngine gl.setProjectionMatrix(0, w, 0, h, -1, 1); mCanvas = canvas; + + ++mStats.canvasSwitches; } } @@ -344,8 +350,12 @@ namespace JinEngine void OpenGL::setFont(Fonts::Font* font) { - if (font) + if (mFont != font && font) + { mFont = font; + + ++mStats.fontSwitches; + } } void OpenGL::unsetFont() @@ -358,5 +368,18 @@ namespace JinEngine return mFont; } + void OpenGL::resetStats() + { + mStats.drawCalls = 0; + mStats.canvasSwitches = 0; + mStats.shaderSwitches = 0; + mStats.fontSwitches = 0; + } + + OpenGL::Stats& OpenGL::getStats() + { + return mStats; + } + } // namespace Graphics } // namespace JinEngine
\ No newline at end of file diff --git a/src/libjin/graphics/je_gl.h b/src/libjin/graphics/je_gl.h index 37dc890..21aa900 100644 --- a/src/libjin/graphics/je_gl.h +++ b/src/libjin/graphics/je_gl.h @@ -38,6 +38,19 @@ namespace JinEngine PREMULTIPLIEDALPHA, }; + struct Stats + { + int drawCalls; + //int drawCallsBatched; + int canvasSwitches; + int shaderSwitches; + int fontSwitches; + int textures; + int canvases; + int fonts; + //int64 textureMemory; + }; + OpenGL(); ~OpenGL(); @@ -185,6 +198,16 @@ namespace JinEngine /// BlendMode getBlendMode(); + /// + /// + /// + void resetStats(); + + /// + /// + /// + Stats& getStats(); + private: static const Canvas* const DEFAULT_CANVAS; @@ -229,6 +252,11 @@ namespace JinEngine /// Fonts::Font* mFont; + /// + /// + /// + Stats mStats; + }; // Singleton. diff --git a/src/libjin/graphics/je_image.cpp b/src/libjin/graphics/je_image.cpp index 46ae34f..98f6fcf 100644 --- a/src/libjin/graphics/je_image.cpp +++ b/src/libjin/graphics/je_image.cpp @@ -12,6 +12,7 @@ namespace JinEngine using namespace Filesystem; Image::Image(const char* path) + : Bitmap() { AssetDatabase* fs = AssetDatabase::get(); Buffer buffer; @@ -20,6 +21,7 @@ namespace JinEngine } Image::Image(const void* imgData, size_t size) + : Bitmap() { if (imgData == nullptr) return; diff --git a/src/libjin/graphics/je_shapes.cpp b/src/libjin/graphics/je_shapes.cpp index 7781b3f..8bfb1ef 100644 --- a/src/libjin/graphics/je_shapes.cpp +++ b/src/libjin/graphics/je_shapes.cpp @@ -30,7 +30,7 @@ namespace JinEngine .sendMatrix4(SHADER_MODELVIEW_MATRIX, &modelMatrix) .sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.getProjectionMatrix()); - glDrawArrays(GL_POINTS, 0, 1); + gl.drawArrays(GL_POINTS, 0, 1); } void points(int n, GLshort* p) @@ -43,7 +43,7 @@ namespace JinEngine .sendMatrix4(SHADER_MODELVIEW_MATRIX, &modelMatrix) .sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.getProjectionMatrix()); - glDrawArrays(GL_POINTS, 0, n); + gl.drawArrays(GL_POINTS, 0, n); } void line(int x1, int y1, int x2, int y2) @@ -61,7 +61,7 @@ namespace JinEngine .sendMatrix4(SHADER_MODELVIEW_MATRIX, &modelMatrix) .sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.getProjectionMatrix()); - glDrawArrays(GL_LINES, 0, 2); + gl.drawArrays(GL_LINES, 0, 2); } void circle(RenderMode mode, int x, int y, int r) @@ -110,7 +110,7 @@ namespace JinEngine .sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.getProjectionMatrix()) .uploadVertices(2, GL_FLOAT, 0, p); - glDrawArrays(GL_LINE_LOOP, 0, count); + gl.drawArrays(GL_LINE_LOOP, 0, count); } void polygon(RenderMode mode, float* p, int count) @@ -128,7 +128,7 @@ namespace JinEngine .sendMatrix4(SHADER_PROJECTION_MATRIX, &gl.getProjectionMatrix()) .uploadVertices(2, GL_FLOAT, 0, p); - glDrawArrays(GL_POLYGON, 0, count); + gl.drawArrays(GL_POLYGON, 0, count); } } diff --git a/src/libjin/graphics/je_texture.cpp b/src/libjin/graphics/je_texture.cpp index 152e5d0..53d9bd3 100644 --- a/src/libjin/graphics/je_texture.cpp +++ b/src/libjin/graphics/je_texture.cpp @@ -32,6 +32,7 @@ namespace JinEngine Texture::Texture() : Graphic() { + ++gl.getStats().textures; } Texture::Texture(const char* path) @@ -44,10 +45,12 @@ namespace JinEngine Texture::Texture(const Bitmap* bitmap) : Graphic(bitmap) { + ++gl.getStats().textures; } Texture::~Texture() { + --gl.getStats().textures; } } // namespace Graphics diff --git a/src/libjin/graphics/je_window.cpp b/src/libjin/graphics/je_window.cpp index 4e5ecb1..1ce3901 100644 --- a/src/libjin/graphics/je_window.cpp +++ b/src/libjin/graphics/je_window.cpp @@ -112,10 +112,11 @@ namespace JinEngine SDL_DestroyWindow(mWnd); } - void Window::swapBuffers() + void Window::present() { if (mWnd) SDL_GL_SwapWindow(mWnd); + gl.resetStats(); } void Window::setTitle(const char* title) diff --git a/src/libjin/graphics/je_window.h b/src/libjin/graphics/je_window.h index 387395e..f9fe5df 100644 --- a/src/libjin/graphics/je_window.h +++ b/src/libjin/graphics/je_window.h @@ -68,7 +68,7 @@ namespace JinEngine /// /// /// - void swapBuffers(); + void present(); /// /// |