2 * Copyright (c) 2019 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali/internal/system/common/environment-options.h>
23 #include <dali/integration-api/render-controller.h>
24 #include <dali/public-api/math/math-utils.h>
27 #include <dali/internal/trace/common/trace-factory.h>
28 #include <dali/internal/system/common/environment-variables.h>
41 const unsigned int DEFAULT_STATISTICS_LOG_FREQUENCY = 2;
42 const int DEFAULT_MULTI_SAMPLING_LEVEL = -1;
43 const bool DEFAULT_DEPTH_BUFFER_REQUIRED_SETTING = true;
44 const bool DEFAULT_STENCIL_BUFFER_REQUIRED_SETTING = true;
46 unsigned int GetIntegerEnvironmentVariable( const char* variable, unsigned int defaultValue )
48 const char* variableParameter = std::getenv(variable);
50 // if the parameter exists convert it to an integer, else return the default value
51 unsigned int intValue = variableParameter ? std::atoi(variableParameter) : defaultValue;
55 bool GetIntegerEnvironmentVariable( const char* variable, int& intValue )
57 const char* variableParameter = std::getenv(variable);
59 if( !variableParameter )
63 // if the parameter exists convert it to an integer, else return the default value
64 intValue = std::atoi(variableParameter);
68 bool GetFloatEnvironmentVariable( const char* variable, float& floatValue )
70 const char* variableParameter = std::getenv(variable);
72 if( !variableParameter )
76 // if the parameter exists convert it to an integer, else return the default value
77 floatValue = std::atof(variableParameter);
81 const char * GetCharEnvironmentVariable( const char * variable )
83 return std::getenv( variable );
86 } // unnamed namespace
88 EnvironmentOptions::EnvironmentOptions()
89 : mLogFunction( NULL ),
94 mUpdateStatusFrequency( 0 ),
95 mObjectProfilerInterval( 0 ),
96 mPerformanceStatsLevel( 0 ),
97 mPerformanceStatsFrequency( DEFAULT_STATISTICS_LOG_FREQUENCY ),
98 mPerformanceTimeStampOutput( 0 ),
99 mPanGestureLoggingLevel( 0 ),
102 mRenderRefreshRate( 1u ),
103 mMaxTextureSize( 0 ),
104 mRenderToFboInterval( 0u ),
105 mPanGesturePredictionMode( -1 ),
106 mPanGesturePredictionAmount( -1 ), ///< only sets value in pan gesture if greater than 0
107 mPanGestureMaxPredictionAmount( -1 ),
108 mPanGestureMinPredictionAmount( -1 ),
109 mPanGesturePredictionAmountAdjustment( -1 ),
110 mPanGestureSmoothingMode( -1 ),
111 mPanGestureSmoothingAmount( -1.0f ),
112 mPanGestureUseActualTimes( -1 ),
113 mPanGestureInterpolationTimeRange( -1 ),
114 mPanGestureScalarOnlyPredictionEnabled( -1 ),
115 mPanGestureTwoPointPredictionEnabled( -1 ),
116 mPanGestureTwoPointInterpolatePastTime( -1 ),
117 mPanGestureTwoPointVelocityBias( -1.0f ),
118 mPanGestureTwoPointAccelerationBias( -1.0f ),
119 mPanGestureMultitapSmoothingRange( -1 ),
120 mPanMinimumDistance( -1 ),
121 mPanMinimumEvents( -1 ),
122 mPinchMinimumDistance( -1.0f ),
123 mPinchMinimumTouchEvents( -1 ),
124 mPinchMinimumTouchEventsAfterStart( -1 ),
125 mRotationMinimumTouchEvents( -1 ),
126 mRotationMinimumTouchEventsAfterStart( -1 ),
127 mLongPressMinimumHoldingTime( -1 ),
129 mMultiSamplingLevel( DEFAULT_MULTI_SAMPLING_LEVEL ),
130 mThreadingMode( ThreadingMode::COMBINED_UPDATE_RENDER ),
131 mGlesCallAccumulate( false ),
132 mDepthBufferRequired( DEFAULT_DEPTH_BUFFER_REQUIRED_SETTING ),
133 mStencilBufferRequired( DEFAULT_STENCIL_BUFFER_REQUIRED_SETTING ),
134 mPartialUpdateAvailable( false )
136 ParseEnvironmentOptions();
139 EnvironmentOptions::~EnvironmentOptions()
143 void EnvironmentOptions::CreateTraceManager( PerformanceInterface* performanceInterface )
145 mTraceManager = TraceManagerFactory::CreateTraceFactory( performanceInterface );
148 void EnvironmentOptions::InstallTraceFunction() const
152 mTraceManager->Initialise();
156 void EnvironmentOptions::SetLogFunction( const Dali::Integration::Log::LogFunction& logFunction )
158 mLogFunction = logFunction;
161 void EnvironmentOptions::InstallLogFunction() const
163 Dali::Integration::Log::InstallLogFunction( mLogFunction );
166 void EnvironmentOptions::UnInstallLogFunction() const
168 Dali::Integration::Log::UninstallLogFunction();
171 unsigned int EnvironmentOptions::GetNetworkControlMode() const
173 return mNetworkControl;
175 unsigned int EnvironmentOptions::GetFrameRateLoggingFrequency() const
177 return mFpsFrequency;
180 unsigned int EnvironmentOptions::GetUpdateStatusLoggingFrequency() const
182 return mUpdateStatusFrequency;
185 unsigned int EnvironmentOptions::GetObjectProfilerInterval() const
187 return mObjectProfilerInterval;
190 unsigned int EnvironmentOptions::GetPerformanceStatsLoggingOptions() const
192 return mPerformanceStatsLevel;
194 unsigned int EnvironmentOptions::GetPerformanceStatsLoggingFrequency() const
196 return mPerformanceStatsFrequency;
198 unsigned int EnvironmentOptions::GetPerformanceTimeStampOutput() const
200 return mPerformanceTimeStampOutput;
203 unsigned int EnvironmentOptions::GetPanGestureLoggingLevel() const
205 return mPanGestureLoggingLevel;
208 int EnvironmentOptions::GetPanGesturePredictionMode() const
210 return mPanGesturePredictionMode;
213 int EnvironmentOptions::GetPanGesturePredictionAmount() const
215 return mPanGesturePredictionAmount;
218 int EnvironmentOptions::GetPanGestureMaximumPredictionAmount() const
220 return mPanGestureMaxPredictionAmount;
223 int EnvironmentOptions::GetPanGestureMinimumPredictionAmount() const
225 return mPanGestureMinPredictionAmount;
228 int EnvironmentOptions::GetPanGesturePredictionAmountAdjustment() const
230 return mPanGesturePredictionAmountAdjustment;
233 int EnvironmentOptions::GetPanGestureSmoothingMode() const
235 return mPanGestureSmoothingMode;
238 float EnvironmentOptions::GetPanGestureSmoothingAmount() const
240 return mPanGestureSmoothingAmount;
243 int EnvironmentOptions::GetPanGestureUseActualTimes() const
245 return mPanGestureUseActualTimes;
248 int EnvironmentOptions::GetPanGestureInterpolationTimeRange() const
250 return mPanGestureInterpolationTimeRange;
253 int EnvironmentOptions::GetPanGestureScalarOnlyPredictionEnabled() const
255 return mPanGestureScalarOnlyPredictionEnabled;
258 int EnvironmentOptions::GetPanGestureTwoPointPredictionEnabled() const
260 return mPanGestureTwoPointPredictionEnabled;
263 int EnvironmentOptions::GetPanGestureTwoPointInterpolatePastTime() const
265 return mPanGestureTwoPointInterpolatePastTime;
268 float EnvironmentOptions::GetPanGestureTwoPointVelocityBias() const
270 return mPanGestureTwoPointVelocityBias;
273 float EnvironmentOptions::GetPanGestureTwoPointAccelerationBias() const
275 return mPanGestureTwoPointAccelerationBias;
278 int EnvironmentOptions::GetPanGestureMultitapSmoothingRange() const
280 return mPanGestureMultitapSmoothingRange;
283 int EnvironmentOptions::GetMinimumPanDistance() const
285 return mPanMinimumDistance;
288 int EnvironmentOptions::GetMinimumPanEvents() const
290 return mPanMinimumEvents;
293 float EnvironmentOptions::GetMinimumPinchDistance() const
295 return mPinchMinimumDistance;
298 int EnvironmentOptions::GetMinimumPinchTouchEvents() const
300 return mPinchMinimumTouchEvents;
303 int EnvironmentOptions::GetMinimumPinchTouchEventsAfterStart() const
305 return mPinchMinimumTouchEventsAfterStart;
308 int EnvironmentOptions::GetMinimumRotationTouchEvents() const
310 return mRotationMinimumTouchEvents;
313 int EnvironmentOptions::GetMinimumRotationTouchEventsAfterStart() const
315 return mRotationMinimumTouchEventsAfterStart;
318 int EnvironmentOptions::GetLongPressMinimumHoldingTime() const
320 return mLongPressMinimumHoldingTime;
323 unsigned int EnvironmentOptions::GetWindowWidth() const
328 unsigned int EnvironmentOptions::GetWindowHeight() const
330 return mWindowHeight;
333 int EnvironmentOptions::GetGlesCallTime() const
335 return mGlesCallTime;
338 bool EnvironmentOptions::GetGlesCallAccumulate() const
340 return mGlesCallAccumulate;
343 const std::string& EnvironmentOptions::GetWindowName() const
348 const std::string& EnvironmentOptions::GetWindowClassName() const
350 return mWindowClassName;
353 ThreadingMode::Type EnvironmentOptions::GetThreadingMode() const
355 return mThreadingMode;
358 unsigned int EnvironmentOptions::GetRenderRefreshRate() const
360 return mRenderRefreshRate;
363 int EnvironmentOptions::GetMultiSamplingLevel() const
365 return mMultiSamplingLevel;
368 unsigned int EnvironmentOptions::GetMaxTextureSize() const
370 return mMaxTextureSize;
373 unsigned int EnvironmentOptions::GetRenderToFboInterval() const
375 return mRenderToFboInterval;
378 bool EnvironmentOptions::PerformanceServerRequired() const
380 return ( ( GetPerformanceStatsLoggingOptions() > 0) ||
381 ( GetPerformanceTimeStampOutput() > 0 ) ||
382 ( GetNetworkControlMode() > 0) );
385 bool EnvironmentOptions::DepthBufferRequired() const
387 return mDepthBufferRequired;
390 bool EnvironmentOptions::StencilBufferRequired() const
392 return mStencilBufferRequired;
395 bool EnvironmentOptions::PartialUpdateAvailable() const
397 return mPartialUpdateAvailable;
400 void EnvironmentOptions::ParseEnvironmentOptions()
402 // get logging options
403 mFpsFrequency = GetIntegerEnvironmentVariable( DALI_ENV_FPS_TRACKING, 0 );
404 mUpdateStatusFrequency = GetIntegerEnvironmentVariable( DALI_ENV_UPDATE_STATUS_INTERVAL, 0 );
405 mObjectProfilerInterval = GetIntegerEnvironmentVariable( DALI_ENV_OBJECT_PROFILER_INTERVAL, 0 );
406 mPerformanceStatsLevel = GetIntegerEnvironmentVariable( DALI_ENV_LOG_PERFORMANCE_STATS, 0 );
407 mPerformanceStatsFrequency = GetIntegerEnvironmentVariable( DALI_ENV_LOG_PERFORMANCE_STATS_FREQUENCY, 0 );
408 mPerformanceTimeStampOutput = GetIntegerEnvironmentVariable( DALI_ENV_PERFORMANCE_TIMESTAMP_OUTPUT, 0 );
409 mNetworkControl = GetIntegerEnvironmentVariable( DALI_ENV_NETWORK_CONTROL, 0 );
410 mPanGestureLoggingLevel = GetIntegerEnvironmentVariable( DALI_ENV_LOG_PAN_GESTURE, 0 );
413 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_PREDICTION_MODE, predictionMode) )
415 mPanGesturePredictionMode = predictionMode;
417 int predictionAmount(-1);
418 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_PREDICTION_AMOUNT, predictionAmount) )
420 if( predictionAmount < 0 )
422 // do not support times in the past
423 predictionAmount = 0;
425 mPanGesturePredictionAmount = predictionAmount;
427 int minPredictionAmount(-1);
428 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_MIN_PREDICTION_AMOUNT, minPredictionAmount) )
430 if( minPredictionAmount < 0 )
432 // do not support times in the past
433 minPredictionAmount = 0;
435 mPanGestureMinPredictionAmount = minPredictionAmount;
437 int maxPredictionAmount(-1);
438 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_MAX_PREDICTION_AMOUNT, maxPredictionAmount) )
440 if( minPredictionAmount > -1 && maxPredictionAmount < minPredictionAmount )
442 // maximum amount should not be smaller than minimum amount
443 maxPredictionAmount = minPredictionAmount;
445 mPanGestureMaxPredictionAmount = maxPredictionAmount;
447 int predictionAmountAdjustment(-1);
448 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_PREDICTION_AMOUNT_ADJUSTMENT, predictionAmountAdjustment) )
450 if( predictionAmountAdjustment < 0 )
452 // negative amount doesn't make sense
453 predictionAmountAdjustment = 0;
455 mPanGesturePredictionAmountAdjustment = predictionAmountAdjustment;
458 if( GetIntegerEnvironmentVariable(DALI_ENV_PAN_SMOOTHING_MODE, smoothingMode) )
460 mPanGestureSmoothingMode = smoothingMode;
462 float smoothingAmount = 1.0f;
463 if( GetFloatEnvironmentVariable(DALI_ENV_PAN_SMOOTHING_AMOUNT, smoothingAmount) )
465 smoothingAmount = Clamp(smoothingAmount, 0.0f, 1.0f);
466 mPanGestureSmoothingAmount = smoothingAmount;
469 int useActualTimes( -1 );
470 if( GetIntegerEnvironmentVariable( DALI_ENV_PAN_USE_ACTUAL_TIMES, useActualTimes ) )
472 mPanGestureUseActualTimes = useActualTimes == 0 ? 0 : 1;
475 int interpolationTimeRange( -1 );
476 if( GetIntegerEnvironmentVariable( DALI_ENV_PAN_INTERPOLATION_TIME_RANGE, interpolationTimeRange ) )
478 if( interpolationTimeRange < 0 )
480 interpolationTimeRange = 0;
482 mPanGestureInterpolationTimeRange = interpolationTimeRange;
485 int scalarOnlyPredictionEnabled( -1 );
486 if( GetIntegerEnvironmentVariable( DALI_ENV_PAN_SCALAR_ONLY_PREDICTION_ENABLED, scalarOnlyPredictionEnabled ) )
488 mPanGestureScalarOnlyPredictionEnabled = scalarOnlyPredictionEnabled == 0 ? 0 : 1;
491 int twoPointPredictionEnabled( -1 );
492 if( GetIntegerEnvironmentVariable( DALI_ENV_PAN_TWO_POINT_PREDICTION_ENABLED, twoPointPredictionEnabled ) )
494 mPanGestureTwoPointPredictionEnabled = twoPointPredictionEnabled == 0 ? 0 : 1;
497 int twoPointPastInterpolateTime( -1 );
498 if( GetIntegerEnvironmentVariable( DALI_ENV_PAN_TWO_POINT_PAST_INTERPOLATE_TIME, twoPointPastInterpolateTime ) )
500 if( twoPointPastInterpolateTime < 0 )
502 twoPointPastInterpolateTime = 0;
504 mPanGestureTwoPointInterpolatePastTime = twoPointPastInterpolateTime;
507 float twoPointVelocityBias = -1.0f;
508 if( GetFloatEnvironmentVariable( DALI_ENV_PAN_TWO_POINT_VELOCITY_BIAS, twoPointVelocityBias ) )
510 twoPointVelocityBias = Clamp( twoPointVelocityBias, 0.0f, 1.0f );
511 mPanGestureTwoPointVelocityBias = twoPointVelocityBias;
514 float twoPointAccelerationBias = -1.0f;
515 if( GetFloatEnvironmentVariable( DALI_ENV_PAN_TWO_POINT_ACCELERATION_BIAS, twoPointAccelerationBias ) )
517 twoPointAccelerationBias = Clamp( twoPointAccelerationBias, 0.0f, 1.0f );
518 mPanGestureTwoPointAccelerationBias = twoPointAccelerationBias;
521 int multitapSmoothingRange( -1 );
522 if( GetIntegerEnvironmentVariable( DALI_ENV_PAN_MULTITAP_SMOOTHING_RANGE, multitapSmoothingRange ) )
524 if( multitapSmoothingRange < 0 )
526 multitapSmoothingRange = 0;
528 mPanGestureMultitapSmoothingRange = multitapSmoothingRange;
531 int minimumDistance(-1);
532 if ( GetIntegerEnvironmentVariable(DALI_ENV_PAN_MINIMUM_DISTANCE, minimumDistance ))
534 mPanMinimumDistance = minimumDistance;
537 int minimumEvents(-1);
538 if ( GetIntegerEnvironmentVariable(DALI_ENV_PAN_MINIMUM_EVENTS, minimumEvents ))
540 mPanMinimumEvents = minimumEvents;
543 float pinchMinimumDistance = -1.0f;
544 if( GetFloatEnvironmentVariable( DALI_ENV_PINCH_MINIMUM_DISTANCE, pinchMinimumDistance ) )
546 mPinchMinimumDistance = pinchMinimumDistance;
549 int pinchMinimumTouchEvents = -1;
550 if( GetIntegerEnvironmentVariable( DALI_ENV_PINCH_MINIMUM_TOUCH_EVENTS, pinchMinimumTouchEvents ) )
552 mPinchMinimumTouchEvents = pinchMinimumTouchEvents;
555 int pinchMinimumTouchEventsAfterStart = -1;
556 if( GetIntegerEnvironmentVariable( DALI_ENV_PINCH_MINIMUM_TOUCH_EVENTS_AFTER_START, pinchMinimumTouchEventsAfterStart ) )
558 mPinchMinimumTouchEventsAfterStart = pinchMinimumTouchEventsAfterStart;
561 int rotationMinimumTouchEvents = -1;
562 if( GetIntegerEnvironmentVariable( DALI_ENV_ROTATION_MINIMUM_TOUCH_EVENTS, rotationMinimumTouchEvents ) )
564 mRotationMinimumTouchEvents = rotationMinimumTouchEvents;
567 int rotationMinimumTouchEventsAfterStart = -1;
568 if( GetIntegerEnvironmentVariable( DALI_ENV_ROTATION_MINIMUM_TOUCH_EVENTS_AFTER_START, rotationMinimumTouchEventsAfterStart ) )
570 mRotationMinimumTouchEventsAfterStart = rotationMinimumTouchEventsAfterStart;
573 int longPressMinimumHoldingTime = -1;
574 if( GetIntegerEnvironmentVariable( DALI_ENV_LONG_PRESS_MINIMUM_HOLDING_TIME, longPressMinimumHoldingTime ) )
576 mLongPressMinimumHoldingTime = longPressMinimumHoldingTime;
580 if ( GetIntegerEnvironmentVariable(DALI_GLES_CALL_TIME, glesCallTime ))
582 mGlesCallTime = glesCallTime;
585 int glesCallAccumulate( 0 );
586 if ( GetIntegerEnvironmentVariable( DALI_GLES_CALL_ACCUMULATE, glesCallAccumulate ) )
588 mGlesCallAccumulate = glesCallAccumulate != 0;
591 int windowWidth(0), windowHeight(0);
592 if ( GetIntegerEnvironmentVariable( DALI_WINDOW_WIDTH, windowWidth ) && GetIntegerEnvironmentVariable( DALI_WINDOW_HEIGHT, windowHeight ) )
594 mWindowWidth = windowWidth;
595 mWindowHeight = windowHeight;
598 const char * windowName = GetCharEnvironmentVariable( DALI_WINDOW_NAME );
601 mWindowName = windowName;
604 const char * windowClassName = GetCharEnvironmentVariable( DALI_WINDOW_CLASS_NAME );
605 if ( windowClassName )
607 mWindowClassName = windowClassName;
610 int threadingMode(0);
611 if ( GetIntegerEnvironmentVariable( DALI_THREADING_MODE, threadingMode ) )
613 switch( threadingMode )
615 case ThreadingMode::COMBINED_UPDATE_RENDER:
617 mThreadingMode = static_cast< ThreadingMode::Type >( threadingMode );
623 int renderRefreshRate(0);
624 if ( GetIntegerEnvironmentVariable( DALI_REFRESH_RATE, renderRefreshRate ) )
626 // Only change it if it's valid
627 if( renderRefreshRate > 1 )
629 mRenderRefreshRate = renderRefreshRate;
633 int multiSamplingLevel( 0 );
634 if( GetIntegerEnvironmentVariable( DALI_ENV_MULTI_SAMPLING_LEVEL, multiSamplingLevel ) )
636 mMultiSamplingLevel = multiSamplingLevel;
639 int maxTextureSize( 0 );
640 if( GetIntegerEnvironmentVariable( DALI_ENV_MAX_TEXTURE_SIZE, maxTextureSize ) )
642 if( maxTextureSize > 0 )
644 mMaxTextureSize = maxTextureSize;
648 mRenderToFboInterval = GetIntegerEnvironmentVariable( DALI_RENDER_TO_FBO, 0u );
651 int depthBufferRequired( -1 );
652 if( GetIntegerEnvironmentVariable( DALI_ENV_DISABLE_DEPTH_BUFFER, depthBufferRequired ) )
654 if( depthBufferRequired > 0 )
656 mDepthBufferRequired = false;
657 mStencilBufferRequired = false; // Disable stencil buffer as well
661 int stencilBufferRequired( -1 );
662 if( GetIntegerEnvironmentVariable( DALI_ENV_DISABLE_STENCIL_BUFFER, stencilBufferRequired ) )
664 if( stencilBufferRequired > 0 )
666 mStencilBufferRequired = false;
670 int partialUpdateRequired( -1 );
671 if( GetIntegerEnvironmentVariable( DALI_ENV_PARTIAL_UPDATE_AVAILABLE, partialUpdateRequired ) )
673 if( partialUpdateRequired > 0 )
675 mPartialUpdateAvailable = true;