diff options
author | weigao <weigao@multicorewareinc.com> | 2014-08-09 13:08:16 +0800 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@collabora.co.uk> | 2014-08-13 06:21:33 +0200 |
commit | 212dfdbb92344cac86f8a511697b148ddd00678d (patch) | |
tree | ecf98e0fec0fb13a48391faf10c320264fc892c5 /chart2 | |
parent | 05ecb52d2bc95dcaceb47df8f09b5bfbe924f9b7 (diff) |
add render fps rendering
Change-Id: Ic0c8c9a05079a4d4b715f90eccffb7c4ae8260c9
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/source/view/charttypes/GL3DBarChart.cxx | 115 | ||||
-rw-r--r-- | chart2/source/view/inc/GL3DBarChart.hxx | 13 | ||||
-rw-r--r-- | chart2/source/view/inc/GL3DRenderer.hxx | 2 | ||||
-rw-r--r-- | chart2/source/view/main/GL3DRenderer.cxx | 14 |
4 files changed, 92 insertions, 52 deletions
diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index b325ac86bfe1..532868386d04 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -27,6 +27,7 @@ #define BENCH_MARK_MODE false #define CLICK_EVENT_ID 1 #define SHAPE_START_ID 10 +#define DATA_UPDATE_TIME 15 using namespace com::sun::star; @@ -185,12 +186,7 @@ public: , mbNeedFlyBack(false) , mnStep(0) , mnStepsTotal(0) - , miFrameCount(0) { - osl_getSystemTime(&mafpsRenderStartTime); - osl_getSystemTime(&mafpsRenderEndTime); - osl_getSystemTime(&maScreenTextUpdateStartTime); - osl_getSystemTime(&maScreenTextUpdateEndTime); osl_getSystemTime(&maClickFlyBackStartTime); osl_getSystemTime(&maClickFlyBackEndTime); } @@ -204,8 +200,6 @@ private: void MoveToCorner(); void ProcessScroll(); void UpdateScreenText(); - void UpdateFPS(); - int CalcTimeInterval(TimeValue &startTime, TimeValue &endTime); void ProcessClickFlyBack(); private: glm::vec3 maStartPos; @@ -216,13 +210,8 @@ private: glm::vec3 maStepDirection; size_t mnStep; size_t mnStepsTotal; - TimeValue mafpsRenderStartTime; - TimeValue mafpsRenderEndTime; - TimeValue maScreenTextUpdateStartTime; - TimeValue maScreenTextUpdateEndTime; TimeValue maClickFlyBackStartTime; TimeValue maClickFlyBackEndTime; - int miFrameCount; OUString maFPS; }; @@ -329,7 +318,7 @@ void RenderBenchMarkThread::ProcessClickFlyBack() if (!mbNeedFlyBack) return; osl_getSystemTime(&maClickFlyBackEndTime); - int aDeltaMs = CalcTimeInterval(maClickFlyBackStartTime, maClickFlyBackEndTime); + int aDeltaMs = mpChart->calcTimeInterval(maClickFlyBackStartTime, maClickFlyBackEndTime); if(aDeltaMs >= 10000) { mpChart->maRenderEvent = EVENT_MOVE_TO_DEFAULT; @@ -357,42 +346,18 @@ void RenderBenchMarkThread::ProcessMouseEvent() } } -int RenderBenchMarkThread::CalcTimeInterval(TimeValue &startTime, TimeValue &endTime) -{ - TimeValue aTime; - aTime.Seconds = endTime.Seconds - startTime.Seconds - 1; - aTime.Nanosec = 1000000000 + endTime.Nanosec - startTime.Nanosec; - aTime.Seconds += aTime.Nanosec / 1000000000; - aTime.Nanosec %= 1000000000; - return aTime.Seconds * 1000+aTime.Nanosec / 1000000; -} - -void RenderBenchMarkThread::UpdateFPS() -{ - int aDeltaMs = CalcTimeInterval(mafpsRenderStartTime, mafpsRenderEndTime); - if(aDeltaMs >= 500) - { - osl_getSystemTime(&mafpsRenderEndTime); - aDeltaMs = CalcTimeInterval(mafpsRenderStartTime, mafpsRenderEndTime); - int iFPS = miFrameCount * 1000 / aDeltaMs; - maFPS = OUString("Render FPS: ") + OUString::number(iFPS); - miFrameCount = 0; - osl_getSystemTime(&mafpsRenderStartTime); - } - osl_getSystemTime(&mafpsRenderEndTime); - //will add the fps render code here later -} - void RenderBenchMarkThread::UpdateScreenText() { - int aDeltaMs = CalcTimeInterval(maScreenTextUpdateStartTime, maScreenTextUpdateEndTime); - if (aDeltaMs >= 20) + if (mpChart->mbScreenTextNewRender) { - mpChart->mpRenderer->ReleaseScreenTextShapes(); - UpdateFPS(); - osl_getSystemTime(&maScreenTextUpdateStartTime); + mpChart->mpRenderer->ReleaseScreenTextTexture(); + for(boost::ptr_vector<opengl3D::Renderable3DObject>::iterator itr = mpChart->maScreenTextShapes.begin(), + itrEnd = mpChart->maScreenTextShapes.end(); itr != itrEnd; ++itr) + { + itr->render(); + } + mpChart->mbScreenTextNewRender = false; } - osl_getSystemTime(&maScreenTextUpdateEndTime); } void RenderBenchMarkThread::execute() @@ -406,6 +371,7 @@ void RenderBenchMarkThread::execute() UpdateScreenText(); ProcessMouseEvent(); renderFrame(); + mpChart->miFrameCount++; } #ifdef WNT Sleep(1); @@ -415,7 +381,6 @@ void RenderBenchMarkThread::execute() nTV.Nanosec = 1000000; osl_waitThread(&nTV); #endif - miFrameCount++; } } @@ -438,7 +403,10 @@ GL3DBarChart::GL3DBarChart( maRenderEvent(EVENT_NONE), mSelectBarId(0), miScrollRate(0), - mbScrollFlg(false) + miFrameCount(0), + mbScrollFlg(false), + mbScreenTextNewRender(false), + maFPS(OUString("Render FPS: 0")) { if (BENCH_MARK_MODE) { @@ -452,6 +420,11 @@ GL3DBarChart::GL3DBarChart( mpRenderer->SetScroll(); } } + maTimer.SetTimeout(DATA_UPDATE_TIME); + maTimer.SetTimeoutHdl(LINK(this, GL3DBarChart, updateTimer)); + maTimer.Start(); + osl_getSystemTime(&mafpsRenderStartTime); + osl_getSystemTime(&mafpsRenderEndTime); } Size aSize = mrWindow.GetSizePixel(); mpRenderer->SetSize(aSize); @@ -939,6 +912,54 @@ void GL3DBarChart::contextDestroyed() mbValidContext = false; } +void GL3DBarChart::updateRenderFPS() +{ + int aDeltaMs = calcTimeInterval(mafpsRenderStartTime, mafpsRenderEndTime); + if(aDeltaMs >= 500) + { + osl_getSystemTime(&mafpsRenderEndTime); + aDeltaMs = calcTimeInterval(mafpsRenderStartTime, mafpsRenderEndTime); + int iFPS = miFrameCount * 1000 / aDeltaMs; + maFPS = OUString("Render FPS: ") + OUString::number(iFPS); + miFrameCount = 0; + osl_getSystemTime(&mafpsRenderStartTime); + } + osl_getSystemTime(&mafpsRenderEndTime); + maScreenTextShapes.push_back(new opengl3D::ScreenText(mpRenderer.get(), *mpTextCache, maFPS, 0)); + opengl3D::TextCacheItem tmpTextCache = mpTextCache->getText(maFPS); + float rectWidth = (float)tmpTextCache.maSize.Width() / (float)tmpTextCache.maSize.Height() * 0.05; + opengl3D::ScreenText* pScreenText = static_cast<opengl3D::ScreenText*>(&maScreenTextShapes.back()); + pScreenText->setPosition(glm::vec2(-0.99f, 0.99f), glm::vec2(-0.99f + rectWidth, 0.89f)); +} + +int GL3DBarChart::calcTimeInterval(TimeValue &startTime, TimeValue &endTime) +{ + TimeValue aTime; + aTime.Seconds = endTime.Seconds - startTime.Seconds - 1; + aTime.Nanosec = 1000000000 + endTime.Nanosec - startTime.Nanosec; + aTime.Seconds += aTime.Nanosec / 1000000000; + aTime.Nanosec %= 1000000000; + return aTime.Seconds * 1000+aTime.Nanosec / 1000000; +} + +void GL3DBarChart::updateScreenText() +{ + osl::MutexGuard aGuard(maMutex); + maScreenTextShapes.clear(); + mpRenderer->ReleaseScreenTextShapes(); + updateRenderFPS(); + mbScreenTextNewRender = true; +} + +IMPL_LINK_NOARG(GL3DBarChart, updateTimer) +{ + maTimer.Stop(); + updateScreenText(); + maTimer.SetTimeout(DATA_UPDATE_TIME); + maTimer.Start(); + return 0; +} + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx index 7b1e7b6d6c8c..27712609877d 100644 --- a/chart2/source/view/inc/GL3DBarChart.hxx +++ b/chart2/source/view/inc/GL3DBarChart.hxx @@ -85,7 +85,11 @@ private: void moveToCorner(); void moveToDefault(); glm::vec3 getCornerPosition(sal_Int8 nCornerId); - + void updateTimer(); + void updateScreenText(); + void updateRenderFPS(); + DECL_LINK(updateTimer, void*); + int calcTimeInterval(TimeValue &startTime, TimeValue &endTime); css::uno::Reference<css::chart2::XChartType> mxChartType; boost::ptr_vector<opengl3D::Renderable3DObject> maShapes; @@ -139,6 +143,13 @@ private: Point maClickPos; sal_uInt32 miScrollRate; bool mbScrollFlg; + Timer maTimer; + bool mbScreenTextNewRender; + boost::ptr_vector<opengl3D::Renderable3DObject> maScreenTextShapes; + OUString maFPS; + sal_uInt32 miFrameCount; + TimeValue mafpsRenderStartTime; + TimeValue mafpsRenderEndTime; }; } diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index 94a5f88ca4ee..7c1c989fc3d3 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -209,6 +209,7 @@ public: void ReleaseShapes(); void ReleaseScreenTextShapes(); void ReleaseTextTexture(); + void ReleaseScreenTextTexture(); void StartClick(sal_uInt32 &selectID); void EndClick(); void SetScroll(); @@ -462,6 +463,7 @@ private: float m_fLightPower[MAX_LIGHT_NUM]; //for 3.0 end std::vector<GLuint> m_Texturelist; + std::vector<GLuint> m_ScreenTexturelist; bool m_bHighLighting; sal_uInt32 m_uiSelectID; float m_fScrollSpeed; diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 295a8a70bdb5..866a5cf9ee4c 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -1709,6 +1709,7 @@ void OpenGL3DRenderer::CreateScreenTextTexture( glBindTexture(GL_TEXTURE_2D, 0); CHECK_GL_ERROR(); m_ScreenTextInfoList.push_back(aTextInfo); + m_ScreenTexturelist.push_back(aTextInfo.texture); } void OpenGL3DRenderer::CreateTextTextureSingle(const boost::shared_array<sal_uInt8> &bitmapBuf, @@ -1860,14 +1861,19 @@ void OpenGL3DRenderer::ReleaseTextTexture() void OpenGL3DRenderer::ReleaseScreenTextShapes() { - for (size_t i = 0; i < m_ScreenTextInfoList.size(); i++) + m_ScreenTextInfoList.clear(); +} + +void OpenGL3DRenderer::ReleaseScreenTextTexture() +{ + for (size_t i = 0; i < m_ScreenTexturelist.size(); i++) { - TextInfo &textInfo = m_ScreenTextInfoList[i]; - glDeleteTextures(1, &textInfo.texture); + glDeleteTextures(1, &m_ScreenTexturelist[i]); } - m_ScreenTextInfoList.clear(); + m_ScreenTexturelist.clear(); } + void OpenGL3DRenderer::RenderScreenTextShape() { glUseProgram(maResources.m_ScreenTextProID); |