diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md index 47fdd4c0..9afd2df7 100644 --- a/Docs/Whats_New.md +++ b/Docs/Whats_New.md @@ -17,14 +17,14 @@ For best results, use a Markdown reader.* MoltenVK 1.0.42 --------------- -Released TBD +Released 2020/06/01 - Add support for extensions: - `VK_KHR_external_memory` (non-functional groundwork for future Metal-resource Vulkan extension). - `VK_KHR_external_memory_capabilities` (non-functional groundwork for future Metal-resource Vulkan extension). -- Memory consumption improvements when handling Vulkan commands. +- Memory consumption improvements. - Reinstate `VulkanSamples API-Samples` demo apps and add `input_attachment` and `push_descriptors` demos. - `vkQueuePresentKHR()` returns a `VkResult` for each swapchain. @@ -34,6 +34,7 @@ Released TBD through `vkGetPerformanceStatisticsMVK()`. - Add `MVK_CONFIG_PERFORMANCE_LOGGING_INLINE` env var to enable/disable logging of performance of each activity when it happens. +- Fix crash when more than two GPUs. - Support Xcode 11.5. diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index a3679882..aa165432 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -1457,6 +1457,7 @@ void MVKPhysicalDevice::initProperties() { _properties.limits.maxComputeSharedMemorySize = (32 * KIBI); #endif } + _properties.limits.maxSamplerLodBias = 0; // Bias not supported in API, but can be applied in shader directly. _properties.limits.minTexelOffset = -8; _properties.limits.maxTexelOffset = 7; @@ -1489,8 +1490,6 @@ void MVKPhysicalDevice::initProperties() { _properties.limits.mipmapPrecisionBits = 4; _properties.limits.viewportSubPixelBits = 0; - _properties.limits.maxSamplerLodBias = 2; - _properties.limits.discreteQueuePriorities = 2; _properties.limits.minInterpolationOffset = -0.5; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h index d05604e2..61956917 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.h @@ -19,7 +19,6 @@ #pragma once #include "MVKEnvironment.h" -#include "MVKDevice.h" #include "MVKLayers.h" #include "MVKVulkanAPIObject.h" #include "MVKSmallVector.h" @@ -28,6 +27,8 @@ #include #include +class MVKPhysicalDevice; +class MVKDevice; class MVKSurface; class MVKDebugReportCallback; class MVKDebugUtilsMessenger; @@ -189,7 +190,7 @@ protected: MVKConfiguration _mvkConfig; VkApplicationInfo _appInfo; - MVKSmallVector _physicalDevices; + MVKSmallVector _physicalDevices; MVKSmallVector _debugReportCallbacks; MVKSmallVector _debugUtilMessengers; std::unordered_map _entryPoints; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm index 728a12b8..4e618f4a 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm @@ -18,6 +18,7 @@ #include "MVKInstance.h" +#include "MVKDevice.h" #include "MVKFoundation.h" #include "MVKSurface.h" #include "MVKOSExtensions.h" @@ -62,7 +63,7 @@ VkResult MVKInstance::getPhysicalDevices(uint32_t* pCount, VkPhysicalDevice* pPh // Now populate the devices for (uint32_t pdIdx = 0; pdIdx < *pCount; pdIdx++) { - pPhysicalDevices[pdIdx] = _physicalDevices[pdIdx].getVkPhysicalDevice(); + pPhysicalDevices[pdIdx] = _physicalDevices[pdIdx]->getVkPhysicalDevice(); } return result; @@ -89,7 +90,7 @@ VkResult MVKInstance::getPhysicalDeviceGroups(uint32_t* pCount, VkPhysicalDevice // Now populate the device groups for (uint32_t pdIdx = 0; pdIdx < *pCount; pdIdx++) { pPhysicalDeviceGroupProps[pdIdx].physicalDeviceCount = 1; - pPhysicalDeviceGroupProps[pdIdx].physicalDevices[0] = _physicalDevices[pdIdx].getVkPhysicalDevice(); + pPhysicalDeviceGroupProps[pdIdx].physicalDevices[0] = _physicalDevices[pdIdx]->getVkPhysicalDevice(); pPhysicalDeviceGroupProps[pdIdx].subsetAllocation = VK_FALSE; } @@ -365,8 +366,9 @@ MVKInstance::MVKInstance(const VkInstanceCreateInfo* pCreateInfo) : _enabledExte // and other Obj-C classes, so wrap it all in an autorelease pool. @autoreleasepool { NSArray>* mtlDevices = availableMTLDevicesArray(); + _physicalDevices.reserve(mtlDevices.count); for (id mtlDev in mtlDevices) { - _physicalDevices.emplace_back(this, mtlDev); + _physicalDevices.push_back(new MVKPhysicalDevice(this, mtlDev)); } } @@ -683,8 +685,10 @@ VkResult MVKInstance::verifyLayers(uint32_t count, const char* const* names) { } MVKInstance::~MVKInstance() { - lock_guard lock(_dcbLock); _useCreationCallbacks = true; + mvkDestroyContainerContents(_physicalDevices); + + lock_guard lock(_dcbLock); mvkDestroyContainerContents(_debugReportCallbacks); } diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.h b/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.h index 34024fa2..83abbbbe 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.h @@ -173,8 +173,8 @@ protected: void propagateDebugName() override {} - MVKSmallVector _attachments; - MVKSmallVector _subpasses; + MVKSmallVector _attachments; + MVKSmallVector _subpasses; MVKSmallVector _subpassDependencies; }; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h index 57023946..3af05fc2 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h @@ -151,7 +151,7 @@ protected: void merge(MVKShaderLibraryCache* other); MVKVulkanAPIDeviceObject* _owner; - MVKSmallVector, 1> _shaderLibraries; + MVKSmallVector> _shaderLibraries; }; diff --git a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm index e3407ece..8acd4ae0 100644 --- a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm +++ b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm @@ -452,9 +452,10 @@ MVK_PUBLIC_SYMBOL MTLTriangleFillMode mvkMTLTriangleFillModeFromVkPolygonMode(Vk MTLTriangleFillMode mvkMTLTriangleFillModeFromVkPolygonModeInObj(VkPolygonMode vkFillMode, MVKBaseObject* mvkObj) { switch (vkFillMode) { case VK_POLYGON_MODE_FILL: - case VK_POLYGON_MODE_POINT: return MTLTriangleFillModeFill; + case VK_POLYGON_MODE_POINT: + MVKBaseObject::reportError(mvkObj, VK_ERROR_FORMAT_NOT_SUPPORTED, "VkPolygonMode value VK_POLYGON_MODE_POINT is not supported for render pipelines."); case VK_POLYGON_MODE_LINE: return MTLTriangleFillModeLines;