Avoid fragment shader tracking interacting with vertex attributes.

Restrict allowed linear tiling features for pixel formats.
Fix bad logic when testing allowed linear tiling usage.
Update MoltenVK to 1.0.11.
This commit is contained in:
Bill Hollings 2018-06-06 21:14:09 -04:00
parent 67f659c064
commit 96d680a4e0
3 changed files with 31 additions and 25 deletions

View File

@ -512,7 +512,7 @@ bool MVKImage::validateLinear(const VkImageCreateInfo* pCreateInfo) {
return false;
}
if (mvkAreOnlyAnyFlagsEnabled(_usage, (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT))) {
if ( !mvkAreOnlyAnyFlagsEnabled(_usage, (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)) ) {
setConfigurationResult(mvkNotifyErrorWithText(VK_ERROR_FEATURE_NOT_PRESENT, "vkCreateImage() : If tiling is VK_IMAGE_TILING_LINEAR, usage must only include VK_IMAGE_USAGE_TRANSFER_SRC_BIT and/or VK_IMAGE_USAGE_TRANSFER_DST_BIT."));
return false;
}

View File

@ -34,8 +34,8 @@ using namespace std;
#define MVK_FMT_IMAGE_FEATS (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT \
| VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT \
| VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT \
| VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR \
| VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR)
| VK_FORMAT_FEATURE_TRANSFER_SRC_BIT \
| VK_FORMAT_FEATURE_TRANSFER_DST_BIT)
#define MVK_FMT_COLOR_INTEGER_FEATS (MVK_FMT_IMAGE_FEATS \
| VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT \
@ -43,37 +43,39 @@ using namespace std;
| VK_FORMAT_FEATURE_BLIT_SRC_BIT \
| VK_FORMAT_FEATURE_BLIT_DST_BIT)
#define MVK_FMT_COLOR_FEATS (MVK_FMT_COLOR_INTEGER_FEATS \
| VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)
#define MVK_FMT_COLOR_FEATS (MVK_FMT_COLOR_INTEGER_FEATS | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)
#if MVK_IOS
// iOS does not support filtering of float32 values.
#define MVK_FMT_COLOR_FLOAT32_FEATS MVK_FMT_COLOR_INTEGER_FEATS
# define MVK_FMT_COLOR_FLOAT32_FEATS MVK_FMT_COLOR_INTEGER_FEATS
#else
#define MVK_FMT_COLOR_FLOAT32_FEATS MVK_FMT_COLOR_FEATS
# define MVK_FMT_COLOR_FLOAT32_FEATS MVK_FMT_COLOR_FEATS
#endif
#define MVK_FMT_STENCIL_FEATS (MVK_FMT_IMAGE_FEATS \
| VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
#define MVK_FMT_STENCIL_FEATS (MVK_FMT_IMAGE_FEATS | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)
#if MVK_IOS
// iOS does not support filtering of depth values.
#define MVK_FMT_DEPTH_FEATS MVK_FMT_STENCIL_FEATS
# define MVK_FMT_DEPTH_FEATS MVK_FMT_STENCIL_FEATS
#else
#define MVK_FMT_DEPTH_FEATS (MVK_FMT_STENCIL_FEATS \
| VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)
# define MVK_FMT_DEPTH_FEATS (MVK_FMT_STENCIL_FEATS | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)
#endif
#define MVK_FMT_LINEAR_TILING_FEATS (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT \
| VK_FORMAT_FEATURE_TRANSFER_DST_BIT \
| VK_FORMAT_FEATURE_BLIT_SRC_BIT \
| VK_FORMAT_FEATURE_BLIT_DST_BIT)
#define MVK_FMT_BUFFER_FEATS (VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT \
| VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT \
| VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)
#define MVK_FMT_BUFFER_VTX_FEATS (MVK_FMT_BUFFER_FEATS \
| VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)
#define MVK_FMT_BUFFER_VTX_FEATS (MVK_FMT_BUFFER_FEATS | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT)
#define MVK_FMT_NO_FEATS 0
#define MVK_MAKE_FMT_STRUCT(VK_FMT, MTL_FMT, MTL_FMT_ALT, IOS_SINCE, MACOS_SINCE, BLK_W, BLK_H, BLK_BYTE_CNT, MTL_VTX_FMT, CLR_TYPE, PIXEL_FEATS, BUFFER_FEATS) { VK_FMT, MTL_FMT, MTL_FMT_ALT, IOS_SINCE, MACOS_SINCE, { BLK_W, BLK_H }, BLK_BYTE_CNT, MTL_VTX_FMT, CLR_TYPE, {PIXEL_FEATS, PIXEL_FEATS, BUFFER_FEATS}, #VK_FMT, #MTL_FMT }
#define MVK_MAKE_FMT_STRUCT(VK_FMT, MTL_FMT, MTL_FMT_ALT, IOS_SINCE, MACOS_SINCE, BLK_W, BLK_H, BLK_BYTE_CNT, MTL_VTX_FMT, CLR_TYPE, PIXEL_FEATS, BUFFER_FEATS) \
{ VK_FMT, MTL_FMT, MTL_FMT_ALT, IOS_SINCE, MACOS_SINCE, { BLK_W, BLK_H }, BLK_BYTE_CNT, MTL_VTX_FMT, CLR_TYPE, { (PIXEL_FEATS & MVK_FMT_LINEAR_TILING_FEATS), PIXEL_FEATS, BUFFER_FEATS }, #VK_FMT, #MTL_FMT }
#pragma mark Texture formats

View File

@ -86,26 +86,30 @@ MVK_PUBLIC_SYMBOL bool SPIRVToMSLConverterContext::matches(const SPIRVToMSLConve
if ( !options.matches(other.options) ) { return false; }
for (const auto& va : vertexAttributes) {
if (va.isUsedByShader && !contains(other.vertexAttributes, va)) { return false; }
}
if (options.entryPointStage == spv::ExecutionModelVertex) {
for (const auto& va : vertexAttributes) {
if (va.isUsedByShader && !contains(other.vertexAttributes, va)) { return false; }
}
}
for (const auto& rb : resourceBindings) {
if (rb.isUsedByShader && !contains(other.resourceBindings, rb)) { return false; }
}
return true;
}
// Aligns the usage of the destination context to that of the source context.
MVK_PUBLIC_SYMBOL void SPIRVToMSLConverterContext::alignUsageWith(const SPIRVToMSLConverterContext& srcContext) {
for (auto& va : vertexAttributes) {
va.isUsedByShader = false;
for (auto& srcVA : srcContext.vertexAttributes) {
if (va.matches(srcVA)) { va.isUsedByShader = srcVA.isUsedByShader; }
}
}
if (options.entryPointStage == spv::ExecutionModelVertex) {
for (auto& va : vertexAttributes) {
va.isUsedByShader = false;
for (auto& srcVA : srcContext.vertexAttributes) {
if (va.matches(srcVA)) { va.isUsedByShader = srcVA.isUsedByShader; }
}
}
}
for (auto& rb : resourceBindings) {
rb.isUsedByShader = false;