/* * MVKOSExtensions.h * * Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include typedef float MVKOSVersion; /** * Returns the operating system version as an MVKOSVersion, which is a float in which the * whole number portion indicates the major version, and the fractional portion indicates * the minor and patch versions, associating 2 decimal places to each. * - (10.12.3) => 10.1203 * - (8.0.2) => 8.0002 */ MVKOSVersion mvkOSVersion(void); /** * Returns a monotonic timestamp value for use in Vulkan and performance timestamping. * * The returned value corresponds to the number of CPU "ticks" since the app was initialized. * * Calling this value twice, subtracting the first value from the second, and then multiplying * the result by the value returned by mvkGetTimestampPeriod() will provide an indication of the * number of nanoseconds between the two calls. The convenience function mvkGetElapsedMilliseconds() * can be used to perform this calculation. */ uint64_t mvkGetTimestamp(); /** Returns the number of nanoseconds between each increment of the value returned by mvkGetTimestamp(). */ double mvkGetTimestampPeriod(); /** * Returns the number of milliseconds elapsed between startTimestamp and endTimestamp, * each of which should be a value returned by mvkGetTimestamp(). * If endTimestamp is zero or not supplied, it is taken to be the current time. * If startTimestamp is zero or not supplied, it is taken to be the time the app was initialized. */ double mvkGetElapsedMilliseconds(uint64_t startTimestamp = 0, uint64_t endTimestamp = 0); /** Ensures the block is executed on the main thread. */ void mvkDispatchToMainAndWait(dispatch_block_t block); #pragma mark - #pragma mark Process environment /** * Returns the value of the environment variable at the given name, * or an empty string if no environment variable with that name exists. * * If pWasFound is not null, it's value is set to true if the environment * variable exists, or false if not. */ std::string mvkGetEnvVar(std::string varName, bool* pWasFound = nullptr); /** * Returns the value of the environment variable at the given name, * or zero if no environment variable with that name exists. * * If pWasFound is not null, it's value is set to true if the environment * variable exists, or false if not. */ int64_t mvkGetEnvVarInt64(std::string varName, bool* pWasFound = nullptr); /** * Returns the value of the environment variable at the given name, * or false if no environment variable with that name exists. * * If pWasFound is not null, it's value is set to true if the environment * variable exists, or false if not. */ bool mvkGetEnvVarBool(std::string varName, bool* pWasFound = nullptr); #define MVK_SET_FROM_ENV_OR_BUILD_BOOL(cfgVal, EV) \ do { \ bool wasFound = false; \ bool ev = mvkGetEnvVarBool(#EV, &wasFound); \ cfgVal = wasFound ? ev : EV; \ } while(false) #define MVK_SET_FROM_ENV_OR_BUILD_INT64(cfgVal, EV) \ do { \ bool wasFound = false; \ int64_t ev = mvkGetEnvVarInt64(#EV, &wasFound); \ cfgVal = wasFound ? ev : EV; \ } while(false) #define MVK_SET_FROM_ENV_OR_BUILD_INT32(cfgVal, EV) \ do { \ bool wasFound = false; \ int64_t ev = mvkGetEnvVarInt64(#EV, &wasFound); \ int64_t val = wasFound ? ev : EV; \ cfgVal = (int32_t)std::min(std::max(val, (int64_t)INT32_MIN), (int64_t)INT32_MAX); \ } while(false)