On Tue, Nov 6, 2018 at 9:43 PM Roland Scheidegger <srol...@vmware.com> wrote:
> Am 06.11.18 um 22:48 schrieb Jason Ekstrand: > > This came to the top of my list recently due to a difference between > > OpenGL and Vulkan discard operations and D3D's discard operation. The > > OpenGL and Vulkan discard is defined to be control flow and derivatives > > are undefined after discard. With D3D, derivatives are considered > > well-defined after discard. > > > > In order to work around this, DXVK (and I would assume VKD3D though I'm > > not sure), simply sets a global boolean instead of doing the discard and > > then emits `if (do_discard) discard;` at the end of the shader. For > > complex shadaers, this leads to the shader doing way more work than > > needed and poor performance. > Is that really all they do? This will not work in presence of UAVs > (shader images / ssbos), since after a discard writes must have no effect. > I'm not sure off-hand how UAVs are handled in the presence of discards. I would guess something like if (!discard) writeUAV(); > > If, on the other hand, they knew that > > derivative groups are just subgroup quads, they could do something > > better: > > > > bool want_discard; > > > > void d3d_discard() > > { > > want_discard = true; > > if (subgroupClusteredAnd(want_discard, 4)) > > discard; > > } > > > > void main() > > { > > want_discard = false; > > > > // stuff > > > > if (some_condition) > > d3d_discard(); > > > > // Exepensive stuff > Expensive > > > > > if (want_discard) > > discard; > If the expensive stuff includes buffer / image writes, that still > wouldn't work as far as I can tell (although it could be fixed, just > like without the extension, by wrapping the writes with if (!want_discard). > Correct. However, the common case is UBO pulls and textures. --Jason > Roland > > > > } > > --- > > chapters/features.txt | 21 +++++++++++++++++++++ > > chapters/shaders.txt | 12 ++++++++++++ > > chapters/textures.txt | 8 ++++++++ > > include/vulkan/vulkan_core.h | 15 +++++++++++++-- > > xml/vk.xml | 13 ++++++++++--- > > 5 files changed, 64 insertions(+), 5 deletions(-) > > > > diff --git a/chapters/features.txt b/chapters/features.txt > > index 08c8d8420..3d22972ea 100644 > > --- a/chapters/features.txt > > +++ b/chapters/features.txt > > @@ -2969,6 +2969,27 @@ more slink:VkSubgroupFeatureFlagBits. > > > > endif::VK_VERSION_1_1[] > > > > +ifdef::VK_EXT_derivative_group_quad[] > > + > > > +[open,refpage='VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT',desc='Structure > describing the relationship between derivative groups and subgroup quads > for an implementation',type='structs'] > > +-- > > + > > +The sname:VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT structure is > > +defined as: > > + > > > +include::../api/structs/VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT.txt[] > > + > > +The members of the > sname:VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT > > +structure describe the following implementation-dependent limits: > > + > > + * pname:derivativeGroupsAreSubgroupQuads is a boolean that specifies > that > > + derivative groups in fragment shaders correspond to subgroup quads. > > +-- > > + > > > +include::../validity/structs/VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT.txt[] > > + > > +endif::VK_EXT_derivative_group_quad[] > > + > > ifdef::VK_EXT_blend_operation_advanced[] > > > > > [open,refpage='VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT',desc='Structure > describing advanced blending limits that can be supported by an > implementation',type='structs'] > > diff --git a/chapters/shaders.txt b/chapters/shaders.txt > > index 5cb3edb35..11d3ea9db 100644 > > --- a/chapters/shaders.txt > > +++ b/chapters/shaders.txt > > @@ -808,6 +808,11 @@ A _derivative group_ (see the subsection "`Control > Flow`" of section 2 of > > the SPIR-V 1.00 Revision 4 specification) for a fragment shader is the > set > > of invocations generated by a single primitive (point, line, or > triangle), > > including any helper invocations generated by that primitive. > > +ifdef::VK_EXT_derivative_group_quad[] > > +If the fname:derivativeGroupsAreSubgroupQuads field of > > +slink:VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT is > ename:VK_TRUE, a > > +derivative group for a fragment shader is a single subgroup quad. > > +endif::VK_EXT_derivative_group_quad[] > > ifdef::VK_NV_compute_shader_derivatives[] > > A derivative group for a compute shader is a single local workgroup. > > endif::VK_NV_compute_shader_derivatives[] > > @@ -920,6 +925,13 @@ The operations supported are add, mul, min, max, > and, or, xor. > > > > The quad subgroup operations allow clusters of 4 invocations (a quad), > to > > share data efficiently with each other. > > +ifdef::VK_EXT_derivative_group_quad[] > > +For fragment shaders, if the fname:derivativeGroupsAreSubgroupQuads > field of > > +slink:VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT is ename:VK_TRUE, > > +each quad corresponds to one of the groups of four shader > > +invocations used for > > +<<texture-derivatives-compute,derivatives>>. > > +endif::VK_EXT_derivative_group_quad[] > > ifdef::VK_NV_compute_shader_derivatives[] > > For compute shaders using the code:DerivativeGroupQuadsNV or > > code:DerivativeGroupLinearNV execution modes, each quad corresponds to > one > > diff --git a/chapters/textures.txt b/chapters/textures.txt > > index a7bfaedc3..46a292381 100644 > > --- a/chapters/textures.txt > > +++ b/chapters/textures.txt > > @@ -1387,6 +1387,14 @@ Implementations must: make the same choice of > either coarse or fine for both > > code:OpDPdx and code:OpDPdy, and implementations should: make the choice > > that is more efficient to compute. > > > > +ifdef::VK_EXT_derivative_group_quad[] > > +If the fname:derivativeGroupsAreSubgroupQuads field of > > +slink:VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT is ename:VK_TRUE, > > +the 2x2 neighborhood of fragments corresponds exactly to a subgroup quad > > +the invocations in each quad are ordered to have attribute values of > > +P~i0,j0~, P~i1,j0~, P~i0,j1~, and P~i1,j1~, respectively. > > +endif::VK_EXT_derivative_group_quad[] > > + > > ifdef::VK_NV_compute_shader_derivatives[] > > [[texture-derivatives-compute]] > > === Compute Shader Derivatives > > diff --git a/include/vulkan/vulkan_core.h b/include/vulkan/vulkan_core.h > > index 4cd8ed51d..7b304eafe 100644 > > --- a/include/vulkan/vulkan_core.h > > +++ b/include/vulkan/vulkan_core.h > > @@ -451,6 +451,7 @@ typedef enum VkStructureType { > > VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = > 1000205002, > > VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000, > > VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = > 1000206001, > > + > VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DERIVATIVE_GROUP_QUAD_PROPERTIES_EXT = > 1000209000, > > VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR > = 1000211000, > > VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT = > 1000212000, > > VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA = > 1000214000, > > @@ -7791,8 +7792,6 @@ typedef struct > VkPipelineCoverageModulationStateCreateInfoNV { > > > > > > #define VK_EXT_image_drm_format_modifier 1 > > -#define VK_EXT_EXTENSION_159_SPEC_VERSION 0 > > -#define VK_EXT_EXTENSION_159_EXTENSION_NAME "VK_EXT_extension_159" > > #define VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_SPEC_VERSION 1 > > #define VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME > "VK_EXT_image_drm_format_modifier" > > > > @@ -8791,6 +8790,18 @@ VKAPI_ATTR void VKAPI_CALL > vkGetQueueCheckpointDataNV( > > VkCheckpointDataNV* pCheckpointData); > > #endif > > > > +#define VK_EXT_derivative_group_quad 1 > > +#define VK_EXT_DERIVATIVE_GROUP_QUAD_SPEC_VERSION 1 > > +#define VK_EXT_DERIVATIVE_GROUP_QUAD_EXTENSION_NAME > "VK_EXT_derivative_group_quad" > > + > > +typedef struct VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT { > > + VkStructureType sType; > > + const void* pNext; > > + VkBool32 derivativeGroupsAreSubgroupQuads; > > +} VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT; > > + > > + > > + > > #define VK_EXT_pci_bus_info 1 > > #define VK_EXT_PCI_BUS_INFO_SPEC_VERSION 1 > > #define VK_EXT_PCI_BUS_INFO_EXTENSION_NAME "VK_EXT_pci_bus_info" > > diff --git a/xml/vk.xml b/xml/vk.xml > > index 24cc3ce78..93dc66159 100644 > > --- a/xml/vk.xml > > +++ b/xml/vk.xml > > @@ -3590,6 +3590,11 @@ server. > > <member>const <type>void</type>* > <name>pNext</name></member> > > <member><type>VkMemoryOverallocationBehaviorAMD</type> > <name>overallocationBehavior</name></member> > > </type> > > + <type category="struct" > name="VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT" > structextends="VkPhysicalDeviceProperties2"> > > + <member > values="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DERIVATIVE_GROUP_QUAD_PROPERTIES_EXT"><type>VkStructureType</type> > <name>sType</name></member> > > + <member>const <type>void</type>* > <name>pNext</name></member> > > + <member><type>VkBool32</type> > <name>derivativeGroupsAreSubgroupQuads</name></member> > > + </type> > > </types> > > > > <comment>Vulkan enumerant (token) definitions</comment> > > @@ -9893,10 +9898,12 @@ server. > > <enum value=""VK_KHR_extension_209"" > name="VK_KHR_EXTENSION_209_EXTENSION_NAME"/> > > </require> > > </extension> > > - <extension name="VK_INTEL_extension_210" number="210" > type="device" author="INTEL" contact="Jason Ekstrand @jekstrand" > supported="disabled"> > > + <extension name="VK_EXT_derivative_group_quad" number="210" > type="device" requiresCore="1.1" author="EXT" contact="Jason Ekstrand > @jekstrand" supported="vulkan"> > > <require> > > - <enum value="0" > name="VK_KHR_EXTENSION_210_SPEC_VERSION"/> > > - <enum value=""VK_KHR_extension_210"" > name="VK_KHR_EXTENSION_210_EXTENSION_NAME"/> > > + <enum value="1" > name="VK_EXT_DERIVATIVE_GROUP_QUAD_SPEC_VERSION"/> > > + <enum value=""VK_EXT_derivative_group_quad"" > name="VK_EXT_DERIVATIVE_GROUP_QUAD_EXTENSION_NAME"/> > > + <enum offset="0" extends="VkStructureType" > name="VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DERIVATIVE_GROUP_QUAD_PROPERTIES_EXT"/> > > + <type > name="VkPhysicalDeviceDerivativeGroupQuadPropertiesEXT"/> > > </require> > > </extension> > > <extension name="VK_INTEL_extension_211" number="211" > type="device" author="INTEL" contact="Jason Ekstrand @jekstrand" > supported="disabled"> > > > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev