moltenvk/Common/MVKOSExtensions.mm

94 lines
2.9 KiB
Plaintext
Raw Normal View History

/*
* MVKOSExtensions.mm
*
* 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.
*/
#include "MVKOSExtensions.h"
#include <mach/mach_time.h>
#import <Foundation/Foundation.h>
using namespace std;
static const MVKOSVersion kMVKOSVersionUnknown = 0.0f;
static MVKOSVersion _mvkOSVersion = kMVKOSVersionUnknown;
MVKOSVersion mvkOSVersion() {
if (_mvkOSVersion == kMVKOSVersionUnknown) {
NSOperatingSystemVersion osVer = [[NSProcessInfo processInfo] operatingSystemVersion];
float maj = osVer.majorVersion;
float min = osVer.minorVersion;
float pat = osVer.patchVersion;
_mvkOSVersion = maj + (min / 100.0f) + + (pat / 10000.0f);
}
return _mvkOSVersion;
}
static uint64_t _mvkTimestampBase;
static double _mvkTimestampPeriod;
uint64_t mvkGetTimestamp() { return mach_absolute_time() - _mvkTimestampBase; }
double mvkGetTimestampPeriod() { return _mvkTimestampPeriod; }
double mvkGetElapsedMilliseconds(uint64_t startTimestamp, uint64_t endTimestamp) {
if (endTimestamp == 0) { endTimestamp = mvkGetTimestamp(); }
return (double)(endTimestamp - startTimestamp) * _mvkTimestampPeriod / 1e6;
}
Add support for the VK_EXT_debug_report extension. Add MVKDebugReportCallback class. Add MVKVulkanAPIObject class as base class of classes exposed in Vulkan API. Remove MVKRefCountedDeviceObject class and move ref-counting to MVKVulkanAPIObject. Rename MVKDispatchableObject class to MVKDispatchableVulkanAPIObject. Introduce multiple inheritance mixin classes into class hierarchy. Add MVKBaseObject::getVulkanAPIObject() function to find Vulkan API object controlling any subobject that needs to report something. MVKCommandResourceFactory functions pass in calling object for reporting. Add MVKBaseObject::reportMessage() & reportError() functions. Replace mvkNotifyErrorWithText() static function with reportError() instance function to allow access to debug reporting. Redefine MVKLog*() functions to call reportError() instance method. Delete MVKLogging.cpp. Remove MVKLogging.h from MoltenVKShaderConverter project. Add mvk_datatypes.hpp to redirect errors in mvk_datatypes.h functions to debug reporting. Use mvk_datatypes.hpp internally for all references to these functions. Convert several static methods to instance methods. Refactor platform defines in MVKSurface.h. Explicitly count MVKExtensionList extension count to avoid relying on struct size. Remove MVKCommandBuffer::recordResult() and use setConfigurationResult(). Change log indication of error in logs from [***MoltenVK ERROR***] to [mvk-error], for consistency with other log level indications. Update MoltenVK version to 1.0.35.
2019-05-01 22:27:03 -04:00
// Initialize timestamping capabilities on app startup.
//Called automatically when the framework is loaded and initialized.
static bool _mvkTimestampsInitialized = false;
__attribute__((constructor)) static void MVKInitTimestamps() {
if (_mvkTimestampsInitialized ) { return; }
_mvkTimestampsInitialized = true;
_mvkTimestampBase = mach_absolute_time();
mach_timebase_info_data_t timebase;
mach_timebase_info(&timebase);
_mvkTimestampPeriod = (double)timebase.numer / (double)timebase.denom;
}
void mvkDispatchToMainAndWait(dispatch_block_t block) {
if (NSThread.isMainThread) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
}
#pragma mark -
#pragma mark Process environment
string mvkGetEnvVar(string varName, bool* pWasFound) {
@autoreleasepool {
NSDictionary*nsEnv = [[NSProcessInfo processInfo] environment];
NSString* envStr = nsEnv[@(varName.c_str())];
if (pWasFound) { *pWasFound = envStr != nil; }
return envStr ? envStr.UTF8String : "";
}
}
int64_t mvkGetEnvVarInt64(string varName, bool* pWasFound) {
return strtoll(mvkGetEnvVar(varName, pWasFound).c_str(), NULL, 0);
}
bool mvkGetEnvVarBool(std::string varName, bool* pWasFound) {
return mvkGetEnvVarInt64(varName, pWasFound) != 0;
}