diff --git a/src/libANGLE/renderer/vulkan/RendererVk.cpp b/src/libANGLE/renderer/vulkan/RendererVk.cpp index 1b1d0090a..a46443640 100644 --- a/src/libANGLE/renderer/vulkan/RendererVk.cpp +++ b/src/libANGLE/renderer/vulkan/RendererVk.cpp @@ -122,6 +122,22 @@ bool IsQualcommOpenSource(uint32_t vendorId, uint32_t driverId, const char *devi return strstr(deviceName, "Venus") != nullptr || strstr(deviceName, "Turnip") != nullptr; } +bool IsPixel() +{ + if (!IsAndroid()) + { + return false; + } + + angle::SystemInfo info; + if (!angle::GetSystemInfo(&info)) + { + return false; + } + + return strstr(info.machineModelName.c_str(), "Pixel") != nullptr; +} + angle::vk::ICD ChooseICDFromAttribs(const egl::AttributeMap &attribs) { #if !defined(ANGLE_PLATFORM_ANDROID) @@ -3905,6 +3921,9 @@ void RendererVk::initFeatures(DisplayVk *displayVk, const ARMDriverVersion armDriverVersion = ParseARMDriverVersion(mPhysicalDeviceProperties.driverVersion); + // Identify Google Pixel brand Android devices + const bool isPixel = IsPixel(); + angle::VersionInfo nvidiaVersion; if (isNvidia) { @@ -4510,27 +4529,42 @@ void RendererVk::initFeatures(DisplayVk *displayVk, &mFeatures, preferDeviceLocalMemoryHostVisible, canPreferDeviceLocalMemoryHostVisible(mPhysicalDeviceProperties.deviceType)); - // http://issuetracker.google.com/287318431 - // There are multiple issues with dynamic states, disabling on ARM driver temporarily + bool dynamicStateWorks = true; + if (isARM) + { + // Multiple dynamic state issues on ARM have been fixed. + // http://issuetracker.google.com/285124778 + // http://issuetracker.google.com/285196249 + // http://issuetracker.google.com/286224923 + // http://issuetracker.google.com/287318431 + + // Use it on drivers/devices known to work. + if (isPixel) + { + // Pixel devices are working after r44 + dynamicStateWorks = armDriverVersion >= ARMDriverVersion(44, 0, 0); + } + else + { + // Others should work after r44p1 + dynamicStateWorks = armDriverVersion >= ARMDriverVersion(44, 1, 0); + } + } + ANGLE_FEATURE_CONDITION( &mFeatures, supportsExtendedDynamicState, - mExtendedDynamicStateFeatures.extendedDynamicState == VK_TRUE && !isARM); + mExtendedDynamicStateFeatures.extendedDynamicState == VK_TRUE && dynamicStateWorks); - // By default, use all state from VK_EXT_extended_dynamic_state, unless they hit driver bugs. ANGLE_FEATURE_CONDITION(&mFeatures, useVertexInputBindingStrideDynamicState, - mFeatures.supportsExtendedDynamicState.enabled && !isARM); - // http://issuetracker.google.com/285196249 - // Dynamic cull mode not working on some ARM drivers + mFeatures.supportsExtendedDynamicState.enabled && dynamicStateWorks); ANGLE_FEATURE_CONDITION(&mFeatures, useCullModeDynamicState, - mFeatures.supportsExtendedDynamicState.enabled && !isARM); + mFeatures.supportsExtendedDynamicState.enabled && dynamicStateWorks); ANGLE_FEATURE_CONDITION(&mFeatures, useDepthCompareOpDynamicState, mFeatures.supportsExtendedDynamicState.enabled); ANGLE_FEATURE_CONDITION(&mFeatures, useDepthTestEnableDynamicState, mFeatures.supportsExtendedDynamicState.enabled); - // http://issuetracker.google.com/286224923 - // Dynamic depth write not working on some ARM drivers ANGLE_FEATURE_CONDITION(&mFeatures, useDepthWriteEnableDynamicState, - mFeatures.supportsExtendedDynamicState.enabled && !isARM); + mFeatures.supportsExtendedDynamicState.enabled && dynamicStateWorks); ANGLE_FEATURE_CONDITION(&mFeatures, useFrontFaceDynamicState, mFeatures.supportsExtendedDynamicState.enabled); ANGLE_FEATURE_CONDITION(&mFeatures, useStencilOpDynamicState, @@ -4538,15 +4572,12 @@ void RendererVk::initFeatures(DisplayVk *displayVk, ANGLE_FEATURE_CONDITION(&mFeatures, useStencilTestEnableDynamicState, mFeatures.supportsExtendedDynamicState.enabled); - // http://issuetracker.google.com/287318431 - // There are multiple issues with dynamic states, disabling on ARM driver temporarily ANGLE_FEATURE_CONDITION( &mFeatures, supportsExtendedDynamicState2, - mExtendedDynamicState2Features.extendedDynamicState2 == VK_TRUE && !isARM); + mExtendedDynamicState2Features.extendedDynamicState2 == VK_TRUE && dynamicStateWorks); - // By default, use all state from VK_EXT_extended_dynamic_state, unless they hit driver bugs. ANGLE_FEATURE_CONDITION(&mFeatures, usePrimitiveRestartEnableDynamicState, - mFeatures.supportsExtendedDynamicState2.enabled && !isARM); + mFeatures.supportsExtendedDynamicState2.enabled && dynamicStateWorks); ANGLE_FEATURE_CONDITION(&mFeatures, useRasterizerDiscardEnableDynamicState, mFeatures.supportsExtendedDynamicState2.enabled); ANGLE_FEATURE_CONDITION(&mFeatures, useDepthBiasEnableDynamicState,