Merge pull request #142 from billhollings/master

Don't use CAMetalLayer displaySyncEnabled property if it is not available.
This commit is contained in:
Bill Hollings 2018-04-22 23:34:04 -04:00 committed by GitHub
commit 77a5571eda
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 17 deletions

View File

@ -48,7 +48,7 @@ extern "C" {
*/ */
#define MVK_VERSION_MAJOR 1 #define MVK_VERSION_MAJOR 1
#define MVK_VERSION_MINOR 0 #define MVK_VERSION_MINOR 0
#define MVK_VERSION_PATCH 3 #define MVK_VERSION_PATCH 4
#define MVK_MAKE_VERSION(major, minor, patch) (((major) * 10000) + ((minor) * 100) + (patch)) #define MVK_MAKE_VERSION(major, minor, patch) (((major) * 10000) + ((minor) * 100) + (patch))
#define MVK_VERSION MVK_MAKE_VERSION(MVK_VERSION_MAJOR, MVK_VERSION_MINOR, MVK_VERSION_PATCH) #define MVK_VERSION MVK_MAKE_VERSION(MVK_VERSION_MAJOR, MVK_VERSION_MINOR, MVK_VERSION_PATCH)
@ -78,6 +78,7 @@ typedef struct {
VkBool32 ioSurfaces; /**< If true, VkImages can be underlaid by IOSurfaces via the vkUseIOSurfaceMVK() function, to support inter-process image transfers. */ VkBool32 ioSurfaces; /**< If true, VkImages can be underlaid by IOSurfaces via the vkUseIOSurfaceMVK() function, to support inter-process image transfers. */
VkBool32 texelBuffers; /**< If true, texel buffers are supported, allowing the contents of a buffer to be interpreted as an image via a VkBufferView. */ VkBool32 texelBuffers; /**< If true, texel buffers are supported, allowing the contents of a buffer to be interpreted as an image via a VkBufferView. */
VkBool32 depthClipMode; /**< If true, the device supports both depth clipping and depth clamping per the depthClampEnable flag of VkPipelineRasterizationStateCreateInfo in VkGraphicsPipelineCreateInfo. */ VkBool32 depthClipMode; /**< If true, the device supports both depth clipping and depth clamping per the depthClampEnable flag of VkPipelineRasterizationStateCreateInfo in VkGraphicsPipelineCreateInfo. */
VkBool32 presentModeImmediate; /**< If true, the device supports immediate surface present mode (VK_PRESENT_MODE_IMMEDIATE_KHR), allowing a swapchain image to be presented immediately, without waiting for the vertical sync period of the display. */
uint32_t maxPerStageBufferCount; /**< The total number of per-stage Metal buffers available for shader uniform content and attributes. */ uint32_t maxPerStageBufferCount; /**< The total number of per-stage Metal buffers available for shader uniform content and attributes. */
uint32_t maxPerStageTextureCount; /**< The total number of per-stage Metal textures available for shader uniform content. */ uint32_t maxPerStageTextureCount; /**< The total number of per-stage Metal textures available for shader uniform content. */
uint32_t maxPerStageSamplerCount; /**< The total number of per-stage Metal samplers available for shader uniform content. */ uint32_t maxPerStageSamplerCount; /**< The total number of per-stage Metal samplers available for shader uniform content. */

View File

@ -232,11 +232,9 @@ VkResult MVKPhysicalDevice::getSurfacePresentModes(MVKSurface* surface,
vector<VkPresentModeKHR> presentModes; vector<VkPresentModeKHR> presentModes;
presentModes.push_back(VK_PRESENT_MODE_FIFO_KHR); presentModes.push_back(VK_PRESENT_MODE_FIFO_KHR);
#if MVK_MACOS if (_metalFeatures.presentModeImmediate) {
if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_macOS_GPUFamily1_v3] ) {
presentModes.push_back(VK_PRESENT_MODE_IMMEDIATE_KHR); presentModes.push_back(VK_PRESENT_MODE_IMMEDIATE_KHR);
} }
#endif
uint32_t presentModesCnt = uint32_t(presentModes.size()); uint32_t presentModesCnt = uint32_t(presentModes.size());
@ -356,6 +354,7 @@ void MVKPhysicalDevice::initMetalFeatures() {
if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_macOS_GPUFamily1_v3] ) { if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_macOS_GPUFamily1_v3] ) {
_metalFeatures.mslVersion = SPIRVToMSLConverterOptions::makeMSLVersion(2); _metalFeatures.mslVersion = SPIRVToMSLConverterOptions::makeMSLVersion(2);
_metalFeatures.texelBuffers = true; _metalFeatures.texelBuffers = true;
_metalFeatures.presentModeImmediate = true;
} }
#endif #endif

View File

@ -189,11 +189,10 @@ MVKSwapchain::MVKSwapchain(MVKDevice* device,
VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_SAMPLED_BIT |
VK_IMAGE_USAGE_STORAGE_BIT)); VK_IMAGE_USAGE_STORAGE_BIT));
#if MVK_MACOS
if ( pCreateInfo->presentMode == VK_PRESENT_MODE_IMMEDIATE_KHR) { if (pCreateInfo->presentMode == VK_PRESENT_MODE_IMMEDIATE_KHR) {
_mtlLayer.displaySyncEnabled = NO; _mtlLayer.displaySyncEnabledMVK = NO;
} }
#endif
// TODO: set additional CAMetalLayer properties before extracting drawables: // TODO: set additional CAMetalLayer properties before extracting drawables:
// - presentsWithTransaction // - presentsWithTransaction

View File

@ -72,18 +72,17 @@ double mvkGetElapsedMilliseconds(uint64_t startTimestamp = 0, uint64_t endTimest
/** /**
* Replacement for the usage property. * Replacement for the usage property.
* *
* This property allows support under iOS 8. Delegates to the usage property * This property allows support under all OS versions. Delegates to the usage property if it
* if it is available. otherwise, returns MTLTextureUsageUnknown when read * is available. otherwise, returns MTLTextureUsageUnknown when read and does nothing when set.
* and does nothing when set.
*/ */
@property(nonatomic, readwrite) MTLTextureUsage usageMVK; @property(nonatomic, readwrite) MTLTextureUsage usageMVK;
/** /**
* Replacement for the storageMode property. * Replacement for the storageMode property.
* *
* This property allows support under iOS 8. Delegates to the storageMode property * This property allows support under all OS versions. Delegates to the storageMode
* if it is available. otherwise, returns MTLStorageModeShared when read and does * property if it is available. otherwise, returns MTLStorageModeShared when read
* nothing when set. * and does nothing when set.
*/ */
@property(nonatomic, readwrite) MTLStorageMode storageModeMVK; @property(nonatomic, readwrite) MTLStorageMode storageModeMVK;
@ -99,9 +98,9 @@ double mvkGetElapsedMilliseconds(uint64_t startTimestamp = 0, uint64_t endTimest
/** /**
* Replacement for the compareFunction property. * Replacement for the compareFunction property.
* *
* This property allows support under iOS 8. Delegates to the compareFunction property * This property allows support under all OS versions. Delegates to the compareFunction
* if it is available. otherwise, returns MTLTextureUsageUnknown when read and does * property if it is available. otherwise, returns MTLTextureUsageUnknown when read and
* nothing when set. * does nothing when set.
*/ */
@property(nonatomic, readwrite) MTLCompareFunction compareFunctionMVK; @property(nonatomic, readwrite) MTLCompareFunction compareFunctionMVK;
@ -120,6 +119,14 @@ double mvkGetElapsedMilliseconds(uint64_t startTimestamp = 0, uint64_t endTimest
*/ */
-(CGSize) updatedDrawableSizeMVK; -(CGSize) updatedDrawableSizeMVK;
/**
* Replacement for the displaySyncEnabled property.
*
* This property allows support under all OS versions. Delegates to the displaySyncEnabled
* property if it is available. otherwise, returns YES when read and does nothing when set.
*/
@property(nonatomic, readwrite) BOOL displaySyncEnabledMVK;
@end @end

View File

@ -145,6 +145,19 @@ __attribute__((constructor)) static void MVKInitTimestamps() {
return drawSize; return drawSize;
} }
-(BOOL) displaySyncEnabledMVK {
#if MVK_MACOS
if ( [self respondsToSelector: @selector(displaySyncEnabled)]) { return self.displaySyncEnabled; }
#endif
return YES;
}
-(void) setDisplaySyncEnabledMVK: (BOOL) enabled {
#if MVK_MACOS
if ( [self respondsToSelector: @selector(setDisplaySyncEnabled:)]) { self.displaySyncEnabled = enabled; }
#endif
}
@end @end