summaryrefslogtreecommitdiffstats
path: root/gfx/angle/checkout/include/platform/FeaturesVk.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/checkout/include/platform/FeaturesVk.h')
-rw-r--r--gfx/angle/checkout/include/platform/FeaturesVk.h194
1 files changed, 194 insertions, 0 deletions
diff --git a/gfx/angle/checkout/include/platform/FeaturesVk.h b/gfx/angle/checkout/include/platform/FeaturesVk.h
new file mode 100644
index 0000000000..a8df06e3e3
--- /dev/null
+++ b/gfx/angle/checkout/include/platform/FeaturesVk.h
@@ -0,0 +1,194 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// FeaturesVk.h: Optional features for the Vulkan renderer.
+//
+
+#ifndef ANGLE_PLATFORM_FEATURESVK_H_
+#define ANGLE_PLATFORM_FEATURESVK_H_
+
+#include "platform/Feature.h"
+
+namespace angle
+{
+
+struct FeaturesVk : FeatureSetBase
+{
+ FeaturesVk();
+ ~FeaturesVk();
+
+ // Line segment rasterization must follow OpenGL rules. This means using an algorithm similar
+ // to Bresenham's. Vulkan uses a different algorithm. This feature enables the use of pixel
+ // shader patching to implement OpenGL basic line rasterization rules. This feature will
+ // normally always be enabled. Exposing it as an option enables performance testing.
+ Feature basicGLLineRasterization = {
+ "basic_gl_line_rasterization", FeatureCategory::VulkanFeatures,
+ "Enable the use of pixel shader patching to implement OpenGL basic line "
+ "rasterization rules",
+ &members};
+
+ // Flips the viewport to render upside-down. This has the effect to render the same way as
+ // OpenGL. If this feature gets enabled, we enable the KHR_MAINTENANCE_1 extension to allow
+ // negative viewports. We inverse rendering to the backbuffer by reversing the height of the
+ // viewport and increasing Y by the height. So if the viewport was (0,0,width,height), it
+ // becomes (0, height, width, -height). Unfortunately, when we start doing this, we also need
+ // to adjust a lot of places since the rendering now happens upside-down. Affected places so
+ // far:
+ // -readPixels
+ // -copyTexImage
+ // -framebuffer blit
+ // -generating mipmaps
+ // -Point sprites tests
+ // -texStorage
+ Feature flipViewportY = {"flip_viewport_y", FeatureCategory::VulkanFeatures,
+ "Flips the viewport to render upside-down", &members};
+
+ // Add an extra copy region when using vkCmdCopyBuffer as the Windows Intel driver seems
+ // to have a bug where the last region is ignored.
+ Feature extraCopyBufferRegion = {
+ "extra_copy_buffer_region", FeatureCategory::VulkanWorkarounds,
+ "Windows Intel driver seems to have a bug where the last copy region in "
+ "vkCmdCopyBuffer is ignored",
+ &members};
+
+ // This flag is added for the sole purpose of end2end tests, to test the correctness
+ // of various algorithms when a fallback format is used, such as using a packed format to
+ // emulate a depth- or stencil-only format.
+ Feature forceFallbackFormat = {"force_fallback_format", FeatureCategory::VulkanWorkarounds,
+ "Force a fallback format for angle_end2end_tests", &members};
+
+ // On some NVIDIA drivers the point size range reported from the API is inconsistent with the
+ // actual behavior. Clamp the point size to the value from the API to fix this.
+ // Tracked in http://anglebug.com/2970.
+ Feature clampPointSize = {
+ "clamp_point_size", FeatureCategory::VulkanWorkarounds,
+ "On some NVIDIA drivers, the point size range reported from the API is "
+ "inconsistent with the actual behavior",
+ &members, "http://anglebug.com/2970"};
+
+ // On some android devices, the memory barrier between the compute shader that converts vertex
+ // attributes and the vertex shader that reads from it is ineffective. Only known workaround is
+ // to perform a flush after the conversion. http://anglebug.com/3016
+ Feature flushAfterVertexConversion = {
+ "flush_after_vertex_conversion", FeatureCategory::VulkanWorkarounds,
+ "On some android devices, the memory barrier between the compute shader that converts "
+ "vertex attributes and the vertex shader that reads from it is ineffective",
+ &members, "http://anglebug.com/3016"};
+
+ // Whether the VkDevice supports the VK_KHR_incremental_present extension, on which the
+ // EGL_KHR_swap_buffers_with_damage extension can be layered.
+ Feature supportsIncrementalPresent = {
+ "supports_incremental_present", FeatureCategory::VulkanFeatures,
+ "VkDevice supports the VK_KHR_incremental_present extension", &members};
+
+ // Whether texture copies on cube map targets should be done on GPU. This is a workaround for
+ // Intel drivers on windows that have an issue with creating single-layer views on cube map
+ // textures.
+ Feature forceCpuPathForCubeMapCopy = {
+ "force_cpu_path_for_cube_map_copy", FeatureCategory::VulkanWorkarounds,
+ "Some Intel Windows drivers have an issue with creating single-layer "
+ "views on cube map textures",
+ &members};
+
+ // Whether the VkDevice supports the VK_ANDROID_external_memory_android_hardware_buffer
+ // extension, on which the EGL_ANDROID_image_native_buffer extension can be layered.
+ Feature supportsAndroidHardwareBuffer = {
+ "supports_android_hardware_buffer", FeatureCategory::VulkanFeatures,
+ "VkDevice supports the VK_ANDROID_external_memory_android_hardware_buffer extension",
+ &members};
+
+ // Whether the VkDevice supports the VK_KHR_external_memory_fd extension, on which the
+ // GL_EXT_memory_object_fd extension can be layered.
+ Feature supportsExternalMemoryFd = {
+ "supports_external_memory_fd", FeatureCategory::VulkanFeatures,
+ "VkDevice supports the VK_KHR_external_memory_fd extension", &members};
+
+ // Whether the VkDevice supports the VK_KHR_external_semaphore_fd extension, on which the
+ // GL_EXT_semaphore_fd extension can be layered.
+ Feature supportsExternalSemaphoreFd = {
+ "supports_external_semaphore_fd", FeatureCategory::VulkanFeatures,
+ "VkDevice supports the VK_KHR_external_semaphore_fd extension", &members};
+
+ // Whether the VkDevice supports the VK_EXT_shader_stencil_export extension, which is used to
+ // perform multisampled resolve of stencil buffer. A multi-step workaround is used instead if
+ // this extension is not available.
+ Feature supportsShaderStencilExport = {
+ "supports_shader_stencil_export", FeatureCategory::VulkanFeatures,
+ "VkDevice supports the VK_EXT_shader_stencil_export extension", &members};
+
+ // Where VK_EXT_transform_feedback is not support, an emulation path is used.
+ // http://anglebug.com/3205
+ Feature emulateTransformFeedback = {
+ "emulate_transform_feedback", FeatureCategory::VulkanFeatures,
+ "Emulate transform feedback as the VK_EXT_transform_feedback is not present.", &members,
+ "http://anglebug.com/3205"};
+
+ // VK_PRESENT_MODE_FIFO_KHR causes random timeouts on Linux Intel. http://anglebug.com/3153
+ Feature disableFifoPresentMode = {
+ "disable_fifo_present_mode", FeatureCategory::VulkanWorkarounds,
+ "On Linux Intel, VK_PRESENT_MODE_FIFO_KHR causes random timeouts", &members,
+ "http://anglebug.com/3153"};
+
+ // On Qualcomm, a bug is preventing us from using loadOp=Clear with inline commands in the
+ // render pass. http://anglebug.com/2361
+ Feature restartRenderPassAfterLoadOpClear = {
+ "restart_render_pass_after_load_op_clear", FeatureCategory::VulkanWorkarounds,
+ "On Qualcomm, a bug is preventing us from using loadOp=Clear with inline "
+ "commands in the render pass",
+ &members, "http://anglebug.com/2361"};
+
+ // On Qualcomm, gaps in bound descriptor set indices causes the post-gap sets to misbehave.
+ // For example, binding only descriptor set 3 results in zero being read from a uniform buffer
+ // object within that set. This flag results in empty descriptor sets being bound for any
+ // unused descriptor set to work around this issue. http://anglebug.com/2727
+ Feature bindEmptyForUnusedDescriptorSets = {
+ "bind_empty_for_unused_descriptor_sets", FeatureCategory::VulkanWorkarounds,
+ "On Qualcomm, gaps in bound descriptor set indices causes the post-gap sets to misbehave",
+ &members, "http://anglebug.com/2727"};
+
+ // When the scissor is (0,0,0,0) on Windows Intel, the driver acts as if the scissor was
+ // disabled. Work-around this by setting the scissor to just outside of the render area
+ // (e.g. (renderArea.x, renderArea.y, 1, 1)). http://anglebug.com/3407
+ Feature forceNonZeroScissor = {
+ "force_non_zero_scissor", FeatureCategory::VulkanWorkarounds,
+ "On Windows Intel, when the scissor is (0,0,0,0), the driver acts as if the "
+ "scissor was disabled",
+ &members, "http://anglebug.com/3407"};
+
+ // OES_depth_texture is a commonly expected feature on Android. However it
+ // requires that D16_UNORM support texture filtering
+ // (e.g. VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) and some devices
+ // do not. Work-around this by setting saying D16_UNORM supports filtering
+ // anyway.
+ Feature forceD16TexFilter = {"force_D16_texture_filter", FeatureCategory::VulkanWorkarounds,
+ "On some Android devices, VK_FORMAT_D16_UNORM does not support "
+ "VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT, "
+ "which prevents OES_depth_texture from being supported.",
+ &members, "http://anglebug.com/3452"};
+
+ // On some android devices, vkCmdBlitImage with flipped coordinates blits incorrectly. This
+ // workaround makes sure this path is avoided. http://anglebug.com/3498
+ Feature disableFlippingBlitWithCommand = {
+ "disable_flipping_blit_with_command", FeatureCategory::VulkanWorkarounds,
+ "On some android devices, vkCmdBlitImage with flipped coordinates blits incorrectly.",
+ &members, "http://anglebug.com/3498"};
+
+ // On platform with Intel or AMD GPU, a window resizing would not trigger the vulkan driver to
+ // return VK_ERROR_OUT_OF_DATE on swapchain present. Work-around by query current window extent
+ // every frame to detect a window resizing.
+ // http://anglebug.com/3623, http://anglebug.com/3624, http://anglebug.com/3625
+ Feature perFrameWindowSizeQuery = {
+ "per_frame_window_size_query", FeatureCategory::VulkanWorkarounds,
+ "On platform with Intel or AMD gpu, vulkan swapchain is not returning VK_ERROR_OUT_OF_DATE"
+ "when window resizing",
+ &members, "http://anglebug.com/3623, http://anglebug.com/3624, http://anglebug.com/3625"};
+};
+
+inline FeaturesVk::FeaturesVk() = default;
+inline FeaturesVk::~FeaturesVk() = default;
+
+} // namespace angle
+
+#endif // ANGLE_PLATFORM_FEATURESVK_H_