2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://floralicense.org/license/
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 #include "gl-proxy-implementation.h"
24 #include <base/environment-options.h>
25 #include <dali/integration-api/debug.h>
29 const int NUM_FRAMES_PER_SECOND(60);
40 Sampler::Sampler( const char* description )
41 : mDescription( description ),
43 mAccumulatedSquare(0.0f),
51 void Sampler::Increment()
59 mAccumulatedSquare= 0.0f;
63 mCurrentFrameCount = 0;
66 void Sampler::Accumulate()
68 if( mNumSamples == 0 )
70 mMin = mCurrentFrameCount;
71 mMax = mCurrentFrameCount;
75 if(mCurrentFrameCount < mMin)
77 mMin = mCurrentFrameCount;
79 if(mCurrentFrameCount > mMax)
81 mMax = mCurrentFrameCount;
87 mAccumulated += mCurrentFrameCount;
88 mAccumulatedSquare += (mCurrentFrameCount * mCurrentFrameCount);
89 mCurrentFrameCount = 0;
91 const char* Sampler::GetDescription() const
96 float Sampler::GetMeanValue() const
101 meanValue = mAccumulated / (float)mNumSamples;
106 float Sampler::GetStandardDeviation() const
108 float standardDeviation=0.0f;
109 if( mNumSamples > 0 )
111 standardDeviation = sqrtf( mNumSamples * mAccumulatedSquare - (mAccumulated*mAccumulated)) / mNumSamples;
113 return standardDeviation;
116 float Sampler::GetMin() const
121 float Sampler::GetMax() const
126 GlProxyImplementation::GlProxyImplementation(EnvironmentOptions& environmentOptions)
127 : mEnvironmentOptions(environmentOptions),
128 mClearSampler("Clear calls"),
129 mBindBufferSampler( "Bind buffers"),
130 mBindTextureSampler( "Bind textures"),
131 mDrawSampler("Draw calls"),
132 mUniformSampler("Uniform sets"),
133 mUseProgramSampler("Used programs"),
140 GlProxyImplementation::~GlProxyImplementation()
144 void GlProxyImplementation::PreRender()
148 void GlProxyImplementation::PostRender( unsigned int timeDelta )
150 // Accumulate counts in each sampler
153 // When we reach the desired frame count, output the averages from the samples
155 if( mFrameCount >= mEnvironmentOptions.GetGlesCallTime() * NUM_FRAMES_PER_SECOND )
162 void GlProxyImplementation::Clear( GLbitfield mask )
164 mClearSampler.Increment();
165 GlImplementation::Clear(mask);
168 void GlProxyImplementation::BindBuffer( GLenum target, GLuint buffer )
170 mBindBufferSampler.Increment();
171 GlImplementation::BindBuffer(target,buffer);
174 void GlProxyImplementation::BindTexture( GLenum target, GLuint texture )
176 mBindTextureSampler.Increment();
177 GlImplementation::BindTexture(target,texture);
180 void GlProxyImplementation::DrawArrays( GLenum mode, GLint first, GLsizei count )
182 mDrawSampler.Increment();
183 GlImplementation::DrawArrays(mode,first,count);
186 void GlProxyImplementation::DrawElements( GLenum mode, GLsizei count, GLenum type, const void* indices )
188 mDrawSampler.Increment();
189 GlImplementation::DrawElements(mode,count,type,indices);
192 void GlProxyImplementation::Uniform1f( GLint location, GLfloat x )
194 mUniformSampler.Increment();
195 GlImplementation::Uniform1f(location,x);
198 void GlProxyImplementation::Uniform1fv( GLint location, GLsizei count, const GLfloat* v )
200 mUniformSampler.Increment();
201 GlImplementation::Uniform1fv(location,count,v);
204 void GlProxyImplementation::Uniform1i( GLint location, GLint x )
206 mUniformSampler.Increment();
207 GlImplementation::Uniform1i(location,x);
210 void GlProxyImplementation::Uniform1iv( GLint location, GLsizei count, const GLint* v )
212 mUniformSampler.Increment();
213 GlImplementation::Uniform1iv(location,count,v);
216 void GlProxyImplementation::Uniform2f( GLint location, GLfloat x, GLfloat y)
218 mUniformSampler.Increment();
219 GlImplementation::Uniform2f(location,x,y);
222 void GlProxyImplementation::Uniform2fv( GLint location, GLsizei count, const GLfloat* v )
224 mUniformSampler.Increment();
225 GlImplementation::Uniform2fv(location,count,v);
228 void GlProxyImplementation::Uniform2i( GLint location, GLint x, GLint y )
230 mUniformSampler.Increment();
231 GlImplementation::Uniform2i(location,x,y);
234 void GlProxyImplementation::Uniform2iv( GLint location, GLsizei count, const GLint* v )
236 mUniformSampler.Increment();
237 GlImplementation::Uniform2iv(location,count,v);
240 void GlProxyImplementation::Uniform3f( GLint location, GLfloat x, GLfloat y, GLfloat z)
242 mUniformSampler.Increment();
243 GlImplementation::Uniform3f(location,x,y,z);
246 void GlProxyImplementation::Uniform3fv( GLint location, GLsizei count, const GLfloat* v )
248 mUniformSampler.Increment();
249 GlImplementation::Uniform3fv(location,count,v);
252 void GlProxyImplementation::Uniform3i( GLint location, GLint x, GLint y, GLint z )
254 mUniformSampler.Increment();
255 GlImplementation::Uniform3i(location,x,y,z);
258 void GlProxyImplementation::Uniform3iv( GLint location, GLsizei count, const GLint* v )
260 mUniformSampler.Increment();
261 GlImplementation::Uniform3iv(location,count,v);
264 void GlProxyImplementation::Uniform4f( GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w )
266 mUniformSampler.Increment();
267 GlImplementation::Uniform4f(location,x,y,z,w);
270 void GlProxyImplementation::Uniform4fv( GLint location, GLsizei count, const GLfloat* v )
272 mUniformSampler.Increment();
273 GlImplementation::Uniform4fv(location,count,v);
276 void GlProxyImplementation::Uniform4i( GLint location, GLint x, GLint y, GLint z, GLint w )
278 mUniformSampler.Increment();
279 GlImplementation::Uniform4i(location,x,y,z,w);
282 void GlProxyImplementation::Uniform4iv( GLint location, GLsizei count, const GLint* v )
284 mUniformSampler.Increment();
285 GlImplementation::Uniform4iv(location,count,v);
288 void GlProxyImplementation::UniformMatrix2fv( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value )
290 mUniformSampler.Increment();
291 GlImplementation::UniformMatrix2fv(location,count,transpose,value);
294 void GlProxyImplementation::UniformMatrix3fv( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value )
296 mUniformSampler.Increment();
297 GlImplementation::UniformMatrix3fv(location,count,transpose,value);
300 void GlProxyImplementation::UniformMatrix4fv( GLint location, GLsizei count, GLboolean transpose, const GLfloat* value )
302 mUniformSampler.Increment();
303 GlImplementation::UniformMatrix4fv(location,count,transpose,value);
306 void GlProxyImplementation::UseProgram( GLuint program )
308 mUseProgramSampler.Increment();
309 GlImplementation::UseProgram(program);
312 void GlProxyImplementation::AccumulateSamples()
314 // Accumulate counts in each sampler
315 mClearSampler.Accumulate();
316 mBindBufferSampler.Accumulate();
317 mBindTextureSampler.Accumulate();
318 mDrawSampler.Accumulate();
319 mUniformSampler.Accumulate();
320 mUseProgramSampler.Accumulate();
323 void GlProxyImplementation::LogResults()
325 Debug::LogMessage( Debug::DebugInfo, "OpenGL ES statistics sampled over %d frames) operations per frame:\n", mFrameCount );
326 LogCalls( mClearSampler );
327 LogCalls( mBindBufferSampler );
328 LogCalls( mBindTextureSampler );
329 LogCalls( mDrawSampler );
330 LogCalls( mUniformSampler );
331 LogCalls( mUseProgramSampler );
334 void GlProxyImplementation::LogCalls( const Sampler& sampler )
336 Debug::LogMessage( Debug::DebugInfo, " %s : Mean %5.2f (Min:%5.2f, Max:%5.2f, StdDev:%5.2f)\n",
337 sampler.GetDescription(),
338 sampler.GetMeanValue(), sampler.GetMin(), sampler.GetMax(),
339 sampler.GetStandardDeviation() );
342 void GlProxyImplementation::ResetSamplers()
344 mClearSampler.Reset();
345 mBindBufferSampler.Reset();
346 mBindTextureSampler.Reset();
347 mDrawSampler.Reset();
348 mUniformSampler.Reset();
349 mUseProgramSampler.Reset();
353 } // namespace Adaptor
355 } // namespace Internal