818 Commits

Author SHA1 Message Date
Bill Hollings
04865936c9 Reduce memory via just-in-time conversion to Metal viewports and scissors.
Metal viewports and scissors are twice the size of the Vulkan equivalents,
and internal caches are preallocated for 16 of each to avoid dynamic allocations.
Hold the Vulkan viewports and scissors, and convert just before sending them to Metal.
MVKCommandEncoder::clipToRenderArea() use VkRect2D instead of MTLScissorRect.
2020-04-20 22:35:11 -04:00
Bill Hollings
5d9dd08353 Fix issue in setting depth bias introduced during recent MVKCommand redesign. 2020-04-19 16:31:38 -04:00
Bill Hollings
e4be6b836c Simplify MVKCommand and MVKCommandTypePool instantiation.
MVKCommand constructor not longer take MVKCommandTypePool.
Remove MVKCommand::returnToPool().
MVKCommandTypePool no longer track MVKCommandPool.
Remove MVKCommand.mm.
2020-04-18 22:52:40 -04:00
Bill Hollings
33dbc761c7 Remove MVKCommand::_pool iVar.
Pass MVKCommandPool to MVKCommand::returnToPool() function.
Add pure virtual MVKCommand::getTypePool() to reference correct
type pool in MVKCommandPool for a subclass instance.
Add MVKFuncionOverride_getTypePool() macro template to define
MVKCommand::getTypePool() overrides in subclasses.
Rename MVKCommandPool::_cmdPushSetWithTemplatePool to
_cmdPushDescriptorSetWithTemplatePool for consistency
with macro template support.
2020-04-17 22:47:12 -04:00
Bill Hollings
b7c6f73c04 MVKCommand remove functions that access device and command pool.
MVKCommand subclasses access device and command pool through
MVKCommandEncoder and MVKCommandBuffer.
2020-04-17 14:32:25 -04:00
Bill Hollings
4ef21a2589 Remove MVKCommand from MVKConfigurableObject superclass.
MVKCommand subclass setContent() return VkResult
instead of calling setConfigurationResult().
MVKAddCmd() macro tests return error and doesn't add command to MVKCommandBuffer.
Remove MVKCommand::canEncode().
2020-04-16 18:07:42 -04:00
Bill Hollings
99fe5a07f2 Standardize MVKCommand creation and consolidate into vulkan.mm.
Add MVKAddCmd() macro to create MVKCommand subclass
instances and adding to a MVKCommandBuffer.
Remove all mvkCmd...() methods.
2020-04-16 13:50:43 -04:00
Bill Hollings
cfdf9b50da Move calls to MVKCommandBuffer::record...() inside setContent() functions.
Add MVKCmdEndRenderPass::setContent().
2020-04-15 22:09:19 -04:00
Bill Hollings
d3e548f3ee MVKCommand setContent() calls take MVKCommandBuffer parameter.
Remove MVKCommand::added().
2020-04-15 20:48:52 -04:00
Bill Hollings
6059efe0f1 MVKCommand remove reference to MVKCommandBuffer. 2020-04-15 16:46:34 -04:00
Bill Hollings
0074963ff9
Merge pull request #861 from cdavis5e/host-coherent-texel-buffers
MVKBuffer: Support texel buffers in "host-coherent" memory on Mac.
2020-04-15 16:23:27 -04:00
Bill Hollings
e581266cc7 vkQueuePresentKHR() returns VkResult for each swapchain.
Add MVKSwapchain::getSurfaceStatus().
2020-04-15 15:31:29 -04:00
Chip Davis
25a1e056db MVKBuffer: Support texel buffers in "host-coherent" memory on Mac.
According to the Vulkan spec:

> * If `buffer` is a `VkBuffer` not created with the
>   `VK_BUFFER_CREATE_SPARSE_BINDING_BIT` bit set[...] then the
>   `memoryTypeBits` member always contains at least one bit set
>   corresponding to a `VkMemoryType` with a `propertyFlags` that has
>   both the `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` bit and the
>   `VK_MEMORY_PROPERTY_HOST_COHERENT_BIT` bit set. In other words,
>   mappable coherent memory **can** always be attached to these
>   objects.

There is no exception for texel buffers. Even though desktop Metal
disallows textures in shared memory, even linear textures created from a
buffer, we have to advertise host-coherent memory for texel buffers.
Some applications actually depend on this behavior, so it's not just a
theoretical concern.

To support host-coherent texel buffers, we implicitly create a managed
buffer and copy data between the device memory and the managed buffer,
just like for a linear image.

Signed-off-by: Chip Davis <cdavis@codeweavers.com>
2020-04-15 14:31:14 -05:00
Chip Davis
adf63bbdc7 MVKPipeline: Disable fragment shader outputs for unused attachments.
Naturally, Metal complains when a fragment shader write to a
`[[depth]]` output, but there be no depth attachment. I imagine that it
will also complain if the shader write to ``[[stencil]]`` with no
stencil attachment, or it write to a ``[[color(n)]]`` output with no
corresponding attachment.
2020-04-14 14:32:00 -05:00
Bill Hollings
b582b9284b Set format capabilities for subpass input attachments to kMVKMTLFmtCapsRead. 2020-04-11 21:58:52 -04:00
Bill Hollings
7d779a1636 Reduce thread locking on performance statistics collection. 2020-04-10 12:18:25 -04:00
Bill Hollings
0904c49014 Alphabetize file sorting in Xcode Project Navigator. 2020-04-09 14:19:46 -04:00
Bill Hollings
dc7eab64ae Consolidate frame and non-frame performance reporting.
Added MVKQueuePerformance::frameInterval performance tracker.
Added MVKPerformanceTracker::latestDuration to track duration of most recent activity.
Swapchain performance can be retrieved with other activity performance through
vkGetPerformanceStatisticsMVK().
Performance logging of all activities can be performed periodically
on a frame-count basis, or inline as the activity occurs.
Add MVK_CONFIG_PERFORMANCE_LOGGING_INLINE env var to enable/disable
logging of performance of each activity when it happens.
Removed vkGetSwapchainPerformanceMVK() and MVKSwapchainPerformance from API.
Updated VK_MVK_MOLTENVK_SPEC_VERSION to 25.
Updated MoltenVK version to 1.0.42.
2020-04-09 14:02:08 -04:00
Bill Hollings
70bf788f9f Fix issue of reseting CAMetalDrawable and MTLTexture of peer swapchain images.
Add MVKPresentableSwapchainImage and MVKPeerSwapchainImage subclasses to
MVKSwapchainImage, with MVKPresentableSwapchainImage instances created inside
swapchain, and MVKPeerSwapchainImage instances created using vkCreateImage().
MVKPeerSwapchainImage retrieve and share CAMetalDrawable from corresponding
MVKPresentableSwapchainImage.
2020-04-05 15:15:24 -04:00
Bill Hollings
aa27fd6588 MVKSwapchainImage always retrieve MTLTexture directly from CAMetalDrawable. 2020-04-04 20:25:23 -04:00
Bill Hollings
c6b642db19 Fix acquisition ordering of swapchain images.
Remove obsolete MVKSwapchainImageAvailability::waitCount member that was initializing
randomly and corrupting swapchain image acquisition ordering evaluations.
Rename several member functions to clarify purpose.
2020-04-04 16:25:13 -04:00
Bill Hollings
d46b2f3036 Disable use of MTLHeap by default.
Add MVK_CONFIG_USE_MTLHEAP environment variable to enable use of MTLHeap if needed.
Minor fixes to consistent use of MVK_SET_FROM_ENV_OR_BUILD_BOOL().
2020-04-03 16:55:10 -04:00
Bill Hollings
d57c3c845e vkCreateInstance() return error on incompatible Vulkan version only if 1.0. 2020-04-02 19:40:44 -04:00
Bill Hollings
2037b6c007 Defer resetting MTLTexture in MVKSwapchainImage until request to acquire.
Move call to MVKSwapchainImage::resetMetalDrawable() from immediately after
presentation until request to acquire, to preserve image content for copying
after presentation in cases such as an app screen capture operation.

Testing indicates this deferral has little or no adverse effect on the performance
of retrieving the drawable when next needed.
2020-04-02 12:54:57 -04:00
Bill Hollings
fde9d515ca Remove secondary MVKSwapchainImage constructor. 2020-04-02 11:35:26 -04:00
Bill Hollings
6229582887 Move tracking of swapchain image availability from MVKSwapchain to MVKSwapchainImage. 2020-04-02 10:57:06 -04:00
Bill Hollings
68b5f72d86 Move tracking of CAMetalDrawable from MVKSwapchain to MVKSwapchainImage. 2020-04-01 21:33:29 -04:00
Bill Hollings
327418a6b6 Broaden conditions for host read sync for image memory barriers on macOS.
Ignore pipeline dstStageMask and accept VK_ACCESS_MEMORY_READ_BIT in dstAccessMask.
2020-04-01 16:22:30 -04:00
Bill Hollings
453fbb4045 MVKImage fixes for texture view creation.
Fix potential deadlock when getMTLTexture(MTLPixelFormat) calls getMTLTexture().
Clear texture views when base texture is removed.
2020-03-31 13:25:20 -04:00
Bill Hollings
d5c62cc55a Reorganize code in MVKImage.h/mm to move MVKSwapchainImage closer to MVKImage. 2020-03-30 19:35:01 -04:00
Bill Hollings
b882161519 Do not create depth/stencil MTLTextures from MTLHeap.
See GitHub issues 792 & 832. Depth/stencil textures issued from MTLHeap can be flaky in
some situations, including depth-only rendering on Intel GPUs, and corruption when DS
texture with sampling usage is combined with non-DS texture on a single placement heap.
2020-03-30 15:39:34 -04:00
Bill Hollings
a0e3ab59f4 MVKPhysicalDevice add macros to simplify testing MTLFeatureSet and MTLGPUFamily.
Remove MVKPhysicalDevice::getSupportsGPUFamily();
2020-03-30 14:17:49 -04:00
Bill Hollings
8ec5f93802 MVKInstance instantiate MVKPhysicalDevices in-place instead of using new. 2020-03-30 13:13:54 -04:00
Bill Hollings
fee050372b Move derivation of MTLTextureUsage to MVKPixelFormats.
Add MVKPixelFormats::getMTLTextureUsageFromVkImageUsageFlags(), which takes
into account limitations of pixel formats.
MVKImage remove getMTLTextureUsage(), getSupportsAnyFormatFeature()
and getSupportsAllFormatFeatures().
MVKPixelFormats tracks MVKPhysicalDevice, not just MVKVulkanAPIObject.
MVKPixelFormats refactor constructors and internal retrieval of MTLDevice.
Add MTLPixelFormat to mvkMTLTextureUsageFromVkImageUsageFlags() params for compatibility.
Remove optionality of hasResolveAttachment param in
mvkMTLStoreActionFromVkAttachmentStoreOp() to support C calling.
2020-03-30 12:45:18 -04:00
Bill Hollings
5728f50f0f Add mvkOSVersionIsAtLeast() to simplify and standardizing testing OS version. 2020-03-28 20:11:21 -04:00
Bill Hollings
bd4e78d5a4 Update to latest SPIRV-Cross and Vulkan-Headers and fixes to pipeline cache loading.
Update Cereal archive structs to match latest MoltenVK and SPIRV-Cross structs.
Fix recent error that caused pipeline cache data to be ignored during loading.
Update to Vulkan-Headers version 1.2.135.
Update to latest SPIRV-Cross version.
Update Whats_New.md document.
2020-03-26 18:57:46 -04:00
Bill Hollings
3fa95d4c06 Refactor MVKImageView use without MVKDevice for testing formats.
Replace MVKImageView::getSwizzledMTLPixelFormat() with static validateSwizzledMTLPixelFormat()
to support querying format support without having to create fake MVKImageView instance from
MVKPhysicalDevice::getImageViewIsSupported().
Remove ability for MVKDeviceTrackingMixin and subclasses to work without a MVKDevice.
Remove mvkPlatformPixelFormats().
2020-03-26 14:40:08 -04:00
Bill Hollings
04ae0a61e0 Replace use of memcmp() with mvkAreEqual(). 2020-03-26 11:14:03 -04:00
Bill Hollings
4f1cdef6af Validate format capabilities for MSAA, renderpass attachments, and vkCmdResolveImage().
vkGetPhysicalDeviceImageFormatProperties() tests whether format supports MSAA.
vkCreateRenderPass() validate each attachment supports format capabilities required
by each subpass that uses it.
vkCmdResolveImage() validate that destination attachment supports being resolved to.
MVKPixelFormats add getVkFormatCapabilities(), getMTLPixelFormatCapabilities(),
and vkFormatIsSupportedOrSubstitutable().
Rework type handling in flag functions in MVKFoundation.h.
2020-03-26 00:05:01 -04:00
Bill Hollings
50eba6fee1 Support Xcode 11.4. 2020-03-25 20:24:07 -04:00
Bill Hollings
b09bb763bc Consolidate further static format functions into MVKPixelFormats. 2020-03-25 17:32:29 -04:00
Bill Hollings
622d75f0d2 Rename mvkEnableFlag() to mvkEnableFlags(). 2020-03-25 16:48:53 -04:00
Bill Hollings
b7c742af15 MVKPixelFormats unit tests only run on system default MTLDevice and only run once. 2020-03-23 23:09:34 -04:00
Bill Hollings
a93f2d2f67 Static format functions in mvk_datatypes.mm delegate to MTLPixelFormats.
MVKPixelFormats default constructor use default MTLDevice to initialize.
2020-03-23 22:36:20 -04:00
Bill Hollings
0c03f09df3 Accurately populate Vulkan VkFormatProperties from MTLPixelFormat capabilities,
taking into consideration variations across MTLDevice Features Sets.

Simplify contents and names in MVKMTLFmtCaps enum.
Add MVKVkFormatFeatureFlags enum to map capabilities from MVKMTLFmtCaps to VkFormat.
Derive three VkFormatFeatureFlags in VkFormatProperties from documented
MTLPixelFormat capabilities, customizing based on MTLDevice feature sets.
Include VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT and
VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT in writable features.
MVKPixelFormats modify VkFormatProperties unit test to log differences.
2020-03-23 21:28:36 -04:00
Bill Hollings
06dcf8dc70 Rename mvkDisableFlag() to mvkDisableFlags(). 2020-03-23 16:58:07 -04:00
Bill Hollings
5a5978f021 MVKPixelFormats determine Metal format support from format caps instead of OS version.
MVKPixelFormats build and modify Metal format maps before building Vulkan format maps.
MVKMTLFormatDesc remove sinceOSVersion and isSupported() checks format caps instead.
Remove datafilling of OS versions in MVKMTLFormatDesc.
2020-03-22 21:10:25 -04:00
Bill Hollings
329c1187d5 MVKPixelFormats add MTLVertexFormat capabilities based on MTLDevice feature set. 2020-03-22 18:29:34 -04:00
Bill Hollings
1b09f4a6b1 MVKPixelFormats add MTLPixelFormat capabilities based on MTLDevice feature set. 2020-03-21 21:46:45 -04:00
Bill Hollings
cdbf70d58b Define and populate default MTLPixelFormat capabilities.
MVKPixelFormats improve readability of datafilling of VkFormat, MTLPixelFormat,
and MTLVertexFormat capabilities using dynamic symbol macros to allow abbreviations.
Add MVKMTLFmtCaps enum to track MTLPixelFormat capabilities, and populate table of
default MTLPixelFormat and MTLVertexFormat capabilities.
Add mvkSelectPlatformValue() template function to support
selecting values based on the OS platform.
2020-03-20 20:56:24 -04:00