зеркало из https://github.com/AvaloniaUI/angle.git
Vulkan: Use VK_EXT_primitive_topology_list_restart
From ANGLE's point of view, there is nothing to do with this extension other than enable a feature that silences a validation error. Bug: angleproject:3832 Change-Id: I094343d09c322e2848a65a5bc775d0f21388fb46 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3562380 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: mohan maiya <m.maiya@samsung.com>
This commit is contained in:
Родитель
428b6788d7
Коммит
e79c9cd630
|
@ -349,6 +349,11 @@ struct FeaturesVk : FeatureSetBase
|
|||
"VkDevice supports VK_EXT_depth_clip_control extension.", &members,
|
||||
"http://anglebug.com/5421"};
|
||||
|
||||
FeatureInfo supportsPrimitiveTopologyListRestart = {
|
||||
"supportsPrimitiveTopologyListRestart", FeatureCategory::VulkanFeatures,
|
||||
"VkDevice supports VK_EXT_primitive_topology_list_restart extension.", &members,
|
||||
"http://anglebug.com/3832"};
|
||||
|
||||
FeatureInfo supportsBlendOperationAdvanced = {
|
||||
"supportsBlendOperationAdvanced", FeatureCategory::VulkanFeatures,
|
||||
"VkDevice supports VK_EXT_blend_operation_advanced extension.", &members,
|
||||
|
|
|
@ -457,6 +457,14 @@
|
|||
],
|
||||
"issue": "http://anglebug.com/5421"
|
||||
},
|
||||
{
|
||||
"name": "supports_primitive_topology_list_restart",
|
||||
"category": "Features",
|
||||
"description": [
|
||||
"VkDevice supports VK_EXT_primitive_topology_list_restart extension."
|
||||
],
|
||||
"issue": "http://anglebug.com/3832"
|
||||
},
|
||||
{
|
||||
"name": "supports_blend_operation_advanced",
|
||||
"category": "Features",
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
"include/platform/FeaturesMtl_autogen.h":
|
||||
"6b6d49c35bc9246361f8dac0a5445a02",
|
||||
"include/platform/FeaturesVk_autogen.h":
|
||||
"8f357d2192e39f4f73404bdd630cf5c8",
|
||||
"395e398a10970b6ed0dfb717df59914c",
|
||||
"include/platform/FrontendFeatures_autogen.h":
|
||||
"1781e4fa6efb552bca2ce5a5164eb374",
|
||||
"include/platform/d3d_features.json":
|
||||
|
@ -20,9 +20,9 @@
|
|||
"include/platform/mtl_features.json":
|
||||
"1fabfe4d5c2eb3683a5b567ab60ad83c",
|
||||
"include/platform/vk_features.json":
|
||||
"3c25030e881f17d694dbb6d090d3b1f7",
|
||||
"1192cc1026df4af07479928dd7b21099",
|
||||
"util/angle_features_autogen.cpp":
|
||||
"f741428c05af3e3f8e7510a27c86a16e",
|
||||
"d8473c28c13c88200df622a237ad770c",
|
||||
"util/angle_features_autogen.h":
|
||||
"4bd7dcfa8430f8ceb4b731adc5ec7ca7"
|
||||
"2967001238a409ab2049170b98332787"
|
||||
}
|
|
@ -155,8 +155,6 @@ constexpr const char *kSkippedMessages[] = {
|
|||
"UNASSIGNED-CoreValidation-Shader-InputNotProduced",
|
||||
// http://anglebug.com/2796
|
||||
"UNASSIGNED-CoreValidation-Shader-PointSizeMissing",
|
||||
// http://anglebug.com/3832
|
||||
"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428",
|
||||
// Best Practices Skips https://issuetracker.google.com/issues/166641492
|
||||
// https://issuetracker.google.com/issues/166793850
|
||||
"UNASSIGNED-BestPractices-vkCreateCommandPool-command-buffer-reset",
|
||||
|
@ -221,6 +219,13 @@ constexpr const char *kSkippedMessages[] = {
|
|||
"VUID-VkGraphicsPipelineCreateInfo-pStages-06896",
|
||||
};
|
||||
|
||||
// Validation messages that should be ignored only when VK_EXT_primitive_topology_list_restart is
|
||||
// not present.
|
||||
constexpr const char *kNoListRestartSkippedMessages[] = {
|
||||
// http://anglebug.com/3832
|
||||
"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428",
|
||||
};
|
||||
|
||||
// Some syncval errors are resolved in the presence of the NONE load or store render pass ops. For
|
||||
// those, ANGLE makes no further attempt to resolve them and expects vendor support for the
|
||||
// extensions instead. The list of skipped messages is split based on this support.
|
||||
|
@ -635,6 +640,21 @@ enum class DebugMessageReport
|
|||
Print,
|
||||
};
|
||||
|
||||
bool IsMessageInSkipList(const char *message,
|
||||
const char *const skippedList[],
|
||||
size_t skippedListSize)
|
||||
{
|
||||
for (size_t index = 0; index < skippedListSize; ++index)
|
||||
{
|
||||
if (strstr(message, skippedList[index]) != nullptr)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Suppress validation errors that are known. Returns DebugMessageReport::Ignore in that case.
|
||||
DebugMessageReport ShouldReportDebugMessage(RendererVk *renderer,
|
||||
const char *messageId,
|
||||
|
@ -646,13 +666,11 @@ DebugMessageReport ShouldReportDebugMessage(RendererVk *renderer,
|
|||
}
|
||||
|
||||
// Check with non-syncval messages:
|
||||
for (const char *msg : kSkippedMessages)
|
||||
{
|
||||
if (strstr(message, msg) != nullptr)
|
||||
const std::vector<const char *> skippedMessages = renderer->getSkippedValidationMessages();
|
||||
if (IsMessageInSkipList(message, skippedMessages.data(), skippedMessages.size()))
|
||||
{
|
||||
return DebugMessageReport::Ignore;
|
||||
}
|
||||
}
|
||||
|
||||
// Then check with syncval messages:
|
||||
const bool isFramebufferFetchUsed = renderer->isFramebufferFetchUsed();
|
||||
|
@ -1955,6 +1973,10 @@ void RendererVk::queryDeviceExtensionFeatures(const vk::ExtensionNameList &devic
|
|||
mPrimitivesGeneratedQueryFeatures.sType =
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT;
|
||||
|
||||
mPrimitiveTopologyListRestartFeatures = {};
|
||||
mPrimitiveTopologyListRestartFeatures.sType =
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT;
|
||||
|
||||
mBlendOperationAdvancedFeatures = {};
|
||||
mBlendOperationAdvancedFeatures.sType =
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT;
|
||||
|
@ -2120,6 +2142,11 @@ void RendererVk::queryDeviceExtensionFeatures(const vk::ExtensionNameList &devic
|
|||
vk::AddToPNextChain(&deviceFeatures, &mPrimitivesGeneratedQueryFeatures);
|
||||
}
|
||||
|
||||
if (ExtensionFound(VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME, deviceExtensionNames))
|
||||
{
|
||||
vk::AddToPNextChain(&deviceFeatures, &mPrimitiveTopologyListRestartFeatures);
|
||||
}
|
||||
|
||||
if (ExtensionFound(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, deviceExtensionNames))
|
||||
{
|
||||
vk::AddToPNextChain(&deviceFeatures, &mBlendOperationAdvancedFeatures);
|
||||
|
@ -2183,6 +2210,7 @@ void RendererVk::queryDeviceExtensionFeatures(const vk::ExtensionNameList &devic
|
|||
mHostQueryResetFeatures.pNext = nullptr;
|
||||
mDepthClipControlFeatures.pNext = nullptr;
|
||||
mPrimitivesGeneratedQueryFeatures.pNext = nullptr;
|
||||
mPrimitiveTopologyListRestartFeatures.pNext = nullptr;
|
||||
mBlendOperationAdvancedFeatures.pNext = nullptr;
|
||||
mPipelineCreationCacheControlFeatures.pNext = nullptr;
|
||||
mExtendedDynamicStateFeatures.pNext = nullptr;
|
||||
|
@ -2653,6 +2681,12 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
|
|||
vk::AddToPNextChain(&mEnabledFeatures, &mPrimitivesGeneratedQueryFeatures);
|
||||
}
|
||||
|
||||
if (getFeatures().supportsPrimitiveTopologyListRestart.enabled)
|
||||
{
|
||||
mEnabledDeviceExtensions.push_back(VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME);
|
||||
vk::AddToPNextChain(&mEnabledFeatures, &mPrimitiveTopologyListRestartFeatures);
|
||||
}
|
||||
|
||||
if (getFeatures().supportsBlendOperationAdvanced.enabled)
|
||||
{
|
||||
mEnabledDeviceExtensions.push_back(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME);
|
||||
|
@ -2834,6 +2868,23 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
|
|||
}
|
||||
mSupportedVulkanPipelineStageMask = ~unsupportedStages;
|
||||
|
||||
initializeValidationMessageSuppressions();
|
||||
|
||||
return angle::Result::Continue;
|
||||
}
|
||||
|
||||
void RendererVk::initializeValidationMessageSuppressions()
|
||||
{
|
||||
// Build the list of validation errors that are currently expected and should be skipped.
|
||||
mSkippedValidationMessages.insert(mSkippedValidationMessages.end(), kSkippedMessages,
|
||||
kSkippedMessages + ArraySize(kSkippedMessages));
|
||||
if (!getFeatures().supportsPrimitiveTopologyListRestart.enabled)
|
||||
{
|
||||
mSkippedValidationMessages.insert(
|
||||
mSkippedValidationMessages.end(), kNoListRestartSkippedMessages,
|
||||
kNoListRestartSkippedMessages + ArraySize(kNoListRestartSkippedMessages));
|
||||
}
|
||||
|
||||
// Build the list of syncval errors that are currently expected and should be skipped.
|
||||
mSkippedSyncvalMessages.insert(mSkippedSyncvalMessages.end(), kSkippedSyncvalMessages,
|
||||
kSkippedSyncvalMessages + ArraySize(kSkippedSyncvalMessages));
|
||||
|
@ -2852,8 +2903,6 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
|
|||
kSkippedSyncvalMessagesWithoutLoadStoreOpNone +
|
||||
ArraySize(kSkippedSyncvalMessagesWithoutLoadStoreOpNone));
|
||||
}
|
||||
|
||||
return angle::Result::Continue;
|
||||
}
|
||||
|
||||
angle::Result RendererVk::selectPresentQueueForSurface(DisplayVk *displayVk,
|
||||
|
@ -3395,6 +3444,10 @@ void RendererVk::initFeatures(DisplayVk *displayVk,
|
|||
// VK_TRUE);
|
||||
ANGLE_FEATURE_CONDITION(&mFeatures, supportsPrimitivesGeneratedQuery, false);
|
||||
|
||||
ANGLE_FEATURE_CONDITION(
|
||||
&mFeatures, supportsPrimitiveTopologyListRestart,
|
||||
mPrimitiveTopologyListRestartFeatures.primitiveTopologyListRestart == VK_TRUE);
|
||||
|
||||
ANGLE_FEATURE_CONDITION(
|
||||
&mFeatures, supportsBlendOperationAdvanced,
|
||||
ExtensionFound(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, deviceExtensionNames));
|
||||
|
|
|
@ -371,6 +371,10 @@ class RendererVk : angle::NonCopyable
|
|||
void onNewValidationMessage(const std::string &message);
|
||||
std::string getAndClearLastValidationMessage(uint32_t *countSinceLastClear);
|
||||
|
||||
const std::vector<const char *> &getSkippedValidationMessages() const
|
||||
{
|
||||
return mSkippedValidationMessages;
|
||||
}
|
||||
const std::vector<vk::SkippedSyncvalMessage> &getSkippedSyncvalMessages() const
|
||||
{
|
||||
return mSkippedSyncvalMessages;
|
||||
|
@ -620,6 +624,7 @@ class RendererVk : angle::NonCopyable
|
|||
private:
|
||||
angle::Result initializeDevice(DisplayVk *displayVk, uint32_t queueFamilyIndex);
|
||||
void ensureCapsInitialized() const;
|
||||
void initializeValidationMessageSuppressions();
|
||||
|
||||
void queryDeviceExtensionFeatures(const vk::ExtensionNameList &deviceExtensionNames);
|
||||
|
||||
|
@ -702,6 +707,7 @@ class RendererVk : angle::NonCopyable
|
|||
VkPhysicalDeviceHostQueryResetFeaturesEXT mHostQueryResetFeatures;
|
||||
VkPhysicalDeviceDepthClipControlFeaturesEXT mDepthClipControlFeatures;
|
||||
VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT mPrimitivesGeneratedQueryFeatures;
|
||||
VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT mPrimitiveTopologyListRestartFeatures;
|
||||
VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT mBlendOperationAdvancedFeatures;
|
||||
VkPhysicalDeviceSamplerYcbcrConversionFeatures mSamplerYcbcrConversionFeatures;
|
||||
VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT mPipelineCreationCacheControlFeatures;
|
||||
|
@ -778,6 +784,9 @@ class RendererVk : angle::NonCopyable
|
|||
std::string mLastValidationMessage;
|
||||
uint32_t mValidationMessageCount;
|
||||
|
||||
// Skipped validation messages. The exact contents of the list depends on the availability of
|
||||
// certain extensions.
|
||||
std::vector<const char *> mSkippedValidationMessages;
|
||||
// Syncval skipped messages. The exact contents of the list depends on the availability of
|
||||
// certain extensions.
|
||||
std::vector<vk::SkippedSyncvalMessage> mSkippedSyncvalMessages;
|
||||
|
|
|
@ -2913,15 +2913,6 @@ angle::Result GraphicsPipelineDesc::initializePipeline(
|
|||
inputAssemblyState.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
||||
inputAssemblyState.flags = 0;
|
||||
inputAssemblyState.topology = static_cast<VkPrimitiveTopology>(inputAndRaster.misc.topology);
|
||||
// http://anglebug.com/3832
|
||||
// We currently hit a VK Validation here where VUID
|
||||
// VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428 is flagged because we allow
|
||||
// primitiveRestartEnable to be true for topologies VK_PRIMITIVE_TOPOLOGY_POINT_LIST,
|
||||
// VK_PRIMITIVE_TOPOLOGY_LINE_LIST, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST
|
||||
// VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,
|
||||
// VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY and VK_PRIMITIVE_TOPOLOGY_PATCH_LIST
|
||||
// However if we force primiteRestartEnable to FALSE we fail tests.
|
||||
// Need to identify alternate fix.
|
||||
inputAssemblyState.primitiveRestartEnable =
|
||||
static_cast<VkBool32>(mDynamicState.ds1And2.primitiveRestartEnable);
|
||||
|
||||
|
|
|
@ -258,6 +258,7 @@ constexpr PackedEnumMap<Feature, const char *> kFeatureNames = {{
|
|||
{Feature::SupportsPipelineCreationFeedback, "supportsPipelineCreationFeedback"},
|
||||
{Feature::SupportsPipelineStatisticsQuery, "supportsPipelineStatisticsQuery"},
|
||||
{Feature::SupportsPrimitivesGeneratedQuery, "supportsPrimitivesGeneratedQuery"},
|
||||
{Feature::SupportsPrimitiveTopologyListRestart, "supportsPrimitiveTopologyListRestart"},
|
||||
{Feature::SupportsProtectedMemory, "supportsProtectedMemory"},
|
||||
{Feature::SupportsRenderpass2, "supportsRenderpass2"},
|
||||
{Feature::SupportsRenderPassLoadStoreOpNone, "supportsRenderPassLoadStoreOpNone"},
|
||||
|
|
|
@ -244,6 +244,7 @@ enum class Feature
|
|||
SupportsPipelineCreationFeedback,
|
||||
SupportsPipelineStatisticsQuery,
|
||||
SupportsPrimitivesGeneratedQuery,
|
||||
SupportsPrimitiveTopologyListRestart,
|
||||
SupportsProtectedMemory,
|
||||
SupportsRenderpass2,
|
||||
SupportsRenderPassLoadStoreOpNone,
|
||||
|
|
Загрузка…
Ссылка в новой задаче