Set Metal texture usage to allow texture copy via view.

MVKCmdCopyImage uses texture view if formats different. Enable
MTLTextureUsagePixelFormatView for VK_IMAGE_USAGE_TRANSFER_SRC_BIT.
Refactor mvkMTLTextureUsageFromVkImageUsageFlags() to clarify Metal usages
and enable views on depth-stencil attachments by default.
This commit is contained in:
Bill Hollings 2019-07-04 15:50:12 -04:00
parent 46bea62230
commit 74e38659aa
3 changed files with 37 additions and 35 deletions

View File

@ -30,6 +30,7 @@ Released TBD
- Separate `SPIRVToMSLConverterContext` into input config and output results.
- Fix pipeline cache lookups.
- Fix race condition between swapchain image destruction and presentation completion callback.
- Set Metal texture usage to allow texture copy via view.
- Document that the functions in `vk_mvk_moltenvk.h` cannot be used with objects
retrieved through the *Vulkan SDK Loader and Layers* framework.
- Update `VK_MVK_MOLTENVK_SPEC_VERSION` to 21.

View File

@ -373,16 +373,15 @@ VkResult MVKImage::useIOSurface(IOSurfaceRef ioSurface) {
}
MTLTextureUsage MVKImage::getMTLTextureUsage() {
MTLTextureUsage usage = mvkMTLTextureUsageFromVkImageUsageFlags(_usage);
// If this is a depth/stencil texture, and the device supports it, tell
// Metal we may create texture views of this, too.
if ((_mtlPixelFormat == MTLPixelFormatDepth32Float_Stencil8
#if MVK_MACOS
|| _mtlPixelFormat == MTLPixelFormatDepth24Unorm_Stencil8
#endif
) && _device->_pMetalFeatures->stencilViews) {
mvkEnableFlag(usage, MTLTextureUsagePixelFormatView);
// Remove view usage from D/S if Metal doesn't support it
if ( !_device->_pMetalFeatures->stencilViews &&
mvkMTLPixelFormatIsDepthFormat(_mtlPixelFormat) &&
mvkMTLPixelFormatIsStencilFormat(_mtlPixelFormat)) {
mvkDisableFlag(usage, MTLTextureUsagePixelFormatView);
}
// If this format doesn't support being blitted to, and the usage

View File

@ -840,33 +840,35 @@ MVK_PUBLIC_SYMBOL MTLTextureType mvkMTLTextureTypeFromVkImageViewType(VkImageVie
MVK_PUBLIC_SYMBOL MTLTextureUsage mvkMTLTextureUsageFromVkImageUsageFlags(VkImageUsageFlags vkImageUsageFlags) {
MTLTextureUsage mtlUsage = MTLTextureUsageUnknown;
if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_TRANSFER_SRC_BIT) ) {
mvkEnableFlag(mtlUsage, MTLTextureUsageShaderRead);
}
if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_TRANSFER_DST_BIT) ) {
mvkEnableFlag(mtlUsage, MTLTextureUsageRenderTarget);
}
if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_SAMPLED_BIT) ) {
mvkEnableFlag(mtlUsage, MTLTextureUsageShaderRead);
mvkEnableFlag(mtlUsage, MTLTextureUsagePixelFormatView);
}
if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_STORAGE_BIT) ) {
mvkEnableFlag(mtlUsage, MTLTextureUsageShaderRead);
mvkEnableFlag(mtlUsage, MTLTextureUsageShaderWrite);
mvkEnableFlag(mtlUsage, MTLTextureUsagePixelFormatView);
}
if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) ) {
mvkEnableFlag(mtlUsage, MTLTextureUsageShaderRead);
mvkEnableFlag(mtlUsage, MTLTextureUsagePixelFormatView);
}
if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) ) {
mvkEnableFlag(mtlUsage, MTLTextureUsageRenderTarget);
mvkEnableFlag(mtlUsage, MTLTextureUsagePixelFormatView);
}
if ( mvkAreFlagsEnabled(vkImageUsageFlags, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ) {
mvkEnableFlag(mtlUsage, MTLTextureUsageRenderTarget);
mvkDisableFlag(mtlUsage, MTLTextureUsagePixelFormatView); // Clears bit. Do this last.
}
// Read from...
if (mvkIsAnyFlagEnabled(vkImageUsageFlags, (VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
VK_IMAGE_USAGE_SAMPLED_BIT |
VK_IMAGE_USAGE_STORAGE_BIT |
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT))) {
mvkEnableFlag(mtlUsage, MTLTextureUsageShaderRead);
}
// Write to...
if (mvkIsAnyFlagEnabled(vkImageUsageFlags, (VK_IMAGE_USAGE_STORAGE_BIT))) {
mvkEnableFlag(mtlUsage, MTLTextureUsageShaderWrite);
}
// Render to...
if (mvkIsAnyFlagEnabled(vkImageUsageFlags, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
VK_IMAGE_USAGE_TRANSFER_DST_BIT))) { // Scaling a BLIT may use rendering.
mvkEnableFlag(mtlUsage, MTLTextureUsageRenderTarget);
}
// Create view on...
if (mvkIsAnyFlagEnabled(vkImageUsageFlags, (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | // May use temp view if transfer involves format change
VK_IMAGE_USAGE_SAMPLED_BIT |
VK_IMAGE_USAGE_STORAGE_BIT |
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT))) { // D/S may be filtered out after device check
mvkEnableFlag(mtlUsage, MTLTextureUsagePixelFormatView);
}
return mtlUsage;
}