{"id":6547,"date":"2022-07-14T12:29:45","date_gmt":"2022-07-14T19:29:45","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/directx\/?p=6547"},"modified":"2022-08-05T17:06:36","modified_gmt":"2022-08-06T00:06:36","slug":"shader-model-6-7","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/directx\/shader-model-6-7\/","title":{"rendered":"Agility SDK 1.606.3: Shader Model 6.7 is now publicly available!"},"content":{"rendered":"<p>The DirectX Compiler Team and our partners are pleased to announce the release of Shader Model 6.7!<\/p>\n<p>Shader Model 6.7 expands texture fetching, quad querying, and wave capabilities to enable ever more complex (and compatible) new shader-driven features!<\/p>\n<h2 id=\"advanced-texture-operations\">Advanced Texture Operations<i class=\"fabric-icon fabric-icon--Link\" aria-hidden=\"true\"><\/i><\/h2>\n<p class=\"\">SM 6.7 adds a collection of useful texture capabilities that fill in gaps the capabilities of existing texture operations as well as adding versatile new ones collectively referred to as Advanced Texture Operations. This will be an optional feature.<\/p>\n<h3>Integer Sampling<\/h3>\n<p>Textures with integer components can now be sampled. To enable this, we&#8217;ve created a new way to describe samplers with integer type border colors.<\/p>\n<pre class=\"prettyprint\">typedef struct D3D12_SAMPLER_DESC2 {\r\n  D3D12_FILTER Filter; \/\/ Most of this is the same as D3D12_SAMPLER_DESC\r\n  D3D12_TEXTURE_ADDRESS_MODE AddressU;\r\n  D3D12_TEXTURE_ADDRESS_MODE AddressV;\r\n  D3D12_TEXTURE_ADDRESS_MODE AddressW;\r\n  FLOAT MipLODBias;\r\n  UINT MaxAnisotropy;\r\n  D3D12_COMPARISON_FUNC ComparisonFunc;\r\n  union {\r\n    FLOAT FloatBorderColor[4];\r\n    UINT UintBorderColor[4]; \/\/ &lt;--- This is new!\r\n  }\r\n  FLOAT MinLOD;\r\n  FLOAT MaxLOD;\r\n  D3D12_SAMPLER_FLAGS Flags; \/\/ &lt;-- This indicates you are using the new thing!\r\n} D3D12_SAMPLER_DESC2;<\/pre>\n<p>Where <em>Flags<\/em> is the enum:<\/p>\n<pre class=\"prettyprint\">enum D3D12_SAMPLER_FLAGS {\r\n  D3D12_SAMPLER_FLAG_NONE = 0\r\n  D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR = 0x1\r\n}<\/pre>\n<p>For static samplers, you can now specify new enum values to\u00a0<em>D3D12_STATIC_BORDER_COLOR<\/em> field in\u00a0<em>D3D12_STATIC_SAMPLER_DESC<\/em>:<\/p>\n<pre class=\"prettyprint\">  D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK_UINT,\r\n  D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE_UINT\r\n<\/pre>\n<h3 id=\"raw-gather\">Raw Gather<\/h3>\n<p>Previous gather operations grant the ability to retrieve a single channel of the sampled elements. Because the operations were limited to a single channel, retrieving all the channels of an element would require multiple gathers. Additionally, implicit conversions and other processing is done on these elements that the programmer has no control over.<\/p>\n<p>Raw gathers give the control to the author by retrieving the raw element data including all channels without any conversion. Like other gathers, they draw from the elements that have been sampled with bilinear filtering using <em>Sample.\u00a0<\/em>The elements are retrieved in the form of unsigned integers of sizes matching the size of the full elements with channels packed in as specified for the underlying format.<\/p>\n<p>Raw gather grants the author full access to the contents of the texture and full control on how to process it.<\/p>\n<h4>Casting Resources to Unsigned Integer Views<\/h4>\n<p>To glean the full benefit of raw gathers, you&#8217;ll need the relaxed format casting D3D12 feature to create unsigned integer views for the underlying formats resources. Its availability is indicated by the presence of <em>D3D12_FEATURE_DATA_D3D12_OPTIONS12::EnhancedBarriersSupported<\/em> and <em>D3D12_FEATURE_DATA_D3D12_OPTIONS12::RelaxedFormatCastingSupported.<\/em> To create the resource to cast to unsigned integer, use the new <em>ID3D12Device10::reateCommittedResource3<\/em> method (or similar <em>CreatePlacedResource2<\/em>\u00a0and <em>CreateReservedResource2<\/em>\u00a0methods) and provide a list of resource view formats it may be cast to using the\u00a0<em>NumCastableFormats<\/em> and\u00a0<em>pCastableFormats <\/em>parameters. The unsigned integer cast target must be of the same size as the full element of the resource created.<\/p>\n<pre class=\"prettyprint\">    HRESULT CreateCommittedResource3(\r\n        const D3D12_HEAP_PROPERTIES* pHeapProperties,\r\n        D3D12_HEAP_FLAGS HeapFlags,\r\n        const D3D12_RESOURCE_DESC1* pDesc,\r\n        D3D12_BARRIER_LAYOUT InitialLayout,\r\n        const D3D12_CLEAR_VALUE* pOptimizedClearValue,\r\n        ID3D12ProtectedResourceSession* pProtectedSession,\r\n        UINT32 NumCastableFormats,\r\n        DXGI_FORMAT *pCastableFormats,\r\n        REFIID riidResource,\r\n        void** ppvResource);\r\n<\/pre>\n<p>These resource views are then used in the shader to retrieve the raw texture data.<\/p>\n<h4>Raw Gather Built-in Shader Function<\/h4>\n<p>For example, a R32_UINT format resource view could be created for a R8G8B8A8 texture and then within the shader the R32_UINT resource view could then be raw gathered into four 32-bit unsigned integers that represent the raw representation of the R8G8B8A8 data. The author is then able to use that data however they wish.<\/p>\n<p>The simplest raw gather overload is:<\/p>\n<pre class=\"prettyprint\">uint32_t4 TexObj2D.GatherRaw(SamplerState S, float2 location);<\/pre>\n<p>Where the return type could be a 16, 32, or 64-bit integer and <i>location<\/i>\u2019s type depends on the texture object type<\/p>\n<p>An example of using it to gather 4 32-bit values for a R8G8B8A8 texture:<\/p>\n<pre class=\"prettyprint\">Texture2D&lt;uint32_t&gt; R8G8B8A8Tex : register(t0);\r\n\/\/ R32_UINT SRV aliased to a R8G8B8A8 resource\r\n\r\nSamplerState samp : register(s0);\r\n\r\n...\r\n\r\nuint32_t4 elements = R8G8B8A8Tex.GatherRaw(samp, uv);\r\n\r\n<\/pre>\n<p>The\u00a0<em>elements<\/em> variable will then contain the four elements sample as determined by the sampler state and\u00a0<em>uv<\/em> location packed into the 32 bit integers as four 8-bit values representing the RGBA channels.\u00a02D texture arrays can also be used. Where 16-bit and 64-bit integers are supported, formats of those sizes can be cast to the corresponding integer views and raw gathered as well using similar shader code. The number of channels and their layout depends on the underlying resource format.<\/p>\n<h4 aria-level=\"3\"><a id=\"raw-gather-limitations\"><\/a>Raw Gather Limitations<\/h4>\n<p><span data-contrast=\"auto\">Raw Gathers require Enhanced Barriers for the full set of formats the feature has been designed to support; see our <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Direct3D.D3D12\/1.706.3-preview\">preview Agility SDK<\/a><\/span><span data-contrast=\"auto\"> to also get access to Enhanced Barriers. Without Enhanced Barriers and Relaxed Format Casting support, only the following formats that could previously be cast to uint views will be castable:<\/span><\/p>\n<table data-tablestyle=\"MsoTableGrid\" data-tablelook=\"1184\" aria-rowcount=\"9\">\n<tbody>\n<tr aria-rowindex=\"1\">\n<td data-celllook=\"0\"><span data-contrast=\"auto\">Format<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td data-celllook=\"0\"><span data-contrast=\"auto\">Castable to View Format<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<\/tr>\n<tr aria-rowindex=\"2\">\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R32_TYPELESS<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R32_UINT<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<\/tr>\n<tr aria-rowindex=\"3\">\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R32_SINT<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R32_UINT<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<\/tr>\n<tr aria-rowindex=\"4\">\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R16_TYPELESS<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R16_UINT<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<\/tr>\n<tr aria-rowindex=\"5\">\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R16_SINT<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R16_UINT<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<\/tr>\n<tr aria-rowindex=\"6\">\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R16_UNORM<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R16_UINT<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<\/tr>\n<tr aria-rowindex=\"7\">\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R16_SNORM<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R16_UINT<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<\/tr>\n<tr aria-rowindex=\"8\">\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R32G32_TYPELESS<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R32G32_UINT (Serves as 64-bit uint)<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<\/tr>\n<tr aria-rowindex=\"9\">\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R32G32_SINT<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<td data-celllook=\"0\"><span data-contrast=\"auto\">R32G32_UINT<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><\/h3>\n<h3 id=\"programmable-offsets\">Programmable Offsets<i class=\"fabric-icon fabric-icon--Link\" aria-hidden=\"true\"><\/i><\/h3>\n<p>Existing sample and load operations require their offsets to be immediate integers. Programmers had to decide on the offset values they wanted prior even to shader compile time. To say the least, this made them of limited use.<\/p>\n<p>Shader Model 6.7 frees offset arguments to the full suite of sample and load operations to be variable values just as they can be in gather operations. The effective range remains [-8,7], by respecting only the 4 least significant bits of the provided offset values. The full list of affected resource methods:<\/p>\n<pre class=\"prettyprint\">Load( int2 Location, int2 Offset, [out uint Status] );\r\nSample( SamplerState S, float2 Location, int2 Offset,\r\n        [float Clamp], [out uint Status] );\r\nSampleBias( SamplerState S, float2 Location, float Bias,\r\n            int2 Offset, [float Clamp], [out uint Status] );\r\nSampleCmp( SamplerComparisonState S, float2 Location,\r\n           float CompareValue, int2 Offset, [float Clamp], [out uint Status] );\r\nSampleCmpLevelZero( SamplerComparisonState S, float2 Location,\r\n                    float CompareValue, int2 Offset, [out uint Status] );\r\nSampleGrad( SamplerState S, float2 Location, float DDX, float DDY,\r\n            int2 Offset, [float Clamp], [out uint&lt;N&gt; Status]);\r\nSampleLevel( SamplerState S, float2 Location, float LOD, int2 Offset,\r\n             [out uint Status]);\r\n<\/pre>\n<p>Note that the above list assumes a Texture2D resource. For other resources, the <em>int2<\/em> and <em>float2<\/em> types for <em>offset<\/em> and <em>location<\/em> might be different sized vectors depending on the method&#8217;s object.<\/p>\n<h3 id=\"samplecmplevel\">Explicit Sample Compare Level<i class=\"fabric-icon fabric-icon--Link\" aria-hidden=\"true\"><\/i><\/h3>\n<p>Previously, to perform same and compare operation, you could either use the default <em>SampleCmp<\/em>, which used a MIP level determined by the location gradients or access the zero level using <em>SampleCmpLevelZero<\/em>. This left an obvious gap in functionality where using smaller MIP levels explicitly indexed would be useful. Shader Model 6.7 adds <em>SampleCmpLevel<\/em> which simply allows you to specify the level you want to sample and compare to:<\/p>\n<pre class=\"prettyprint\">SampleCmpLevel( SamplerComparisonState S, float2 Location,\r\n                float CompareValue, float LOD, [int2 Offset], [out uint Status]);\r\n<\/pre>\n<p>As before, this is the Texture2D method and the vector sizes of <em>Location<\/em> and <em>Offset<\/em> will vary for other resource methods. Along with the pre-existing sample operations, <em>SampleCmpLevel<\/em> includes the programmable offsets feature of 6.7 allowing its offset parameter to be variable as well.<\/p>\n<p>Cube map variants are also included which take a slightly different method signature:<\/p>\n<pre class=\"prettyprint\">Format TextureCube::SampleCmpLevel( SamplerComparisonState S, float3 Location,\r\n                                   float CompareValue, float LOD, [out uint Status]);\r\nFormat TextureCubeArray::SampleCmpLevel( SamplerComparisonState S, float4 Location,\r\n                                        float CompareValue, float LOD, [out uint Status]);<\/pre>\n<h3 id=\"writable-msaa-textures\">Writable Multisampled Textures<i class=\"fabric-icon fabric-icon--Link\" aria-hidden=\"true\"><\/i><\/h3>\n<p>We&#8217;ve introduced writable multisampled texture types to permit specific multisampled texture alterations beyond use of them as render targets.\u00a0 Previously, multisampled textures could only be bound as render targets or read-only inputs. Expanded multisampled texture writability will allow shader authors to alter sampled texture contents more specifically, perhaps focusing on key areas while leaving areas of less interest to the default behavior.<\/p>\n<p>The following resource types with corresponding methods can be used to bind and write to multisampled texture information:<\/p>\n<pre class=\"prettyprint\">RWTexture2DMS&lt;Type, Samples&gt;\r\nRWTexture2DMSArray&lt;Type, Samples&gt;\r\n<\/pre>\n<p>The <em>Type<\/em> and <em>Samples<\/em> template variables represent the HLSL type of the resource and the number of samples. Unlike read-only multisampled texture resource types, they are required.<\/p>\n<p>These new types can be accessed much like their read-only counterparts using a single index operator <em>[loc] <\/em>which references sample index 0 at location\u00a0<em>loc<\/em> or the <em>.sample[samp][loc] <\/em>operator which accesses sample index\u00a0<em>samp<\/em> at location\u00a0<em>loc<\/em>. The difference is that, in addition to being readable as before, they can be assignment targets:<\/p>\n<pre class=\"prettyprint\">RWTexture2DMS&lt;float4, 4&gt; g_ms;\r\nfloat4 main(float2 loc : TEXCOORD0) : SV_Target {\r\n  g_ms[loc] = GetZeroSamp(loc);\r\n  g_ms.sample[1][loc] = GetOneSamp(loc);\r\n...<\/pre>\n<h2 id=\"quadany-quadall\">QuadAny\/QuadAll<i class=\"fabric-icon fabric-icon--Link\" aria-hidden=\"true\"><\/i><\/h2>\n<p>We&#8217;ve added two new quad ops to HLSL that allow any and all operations on lanes within a quad. As with all quad operations, this is best illustrated with cats in boxes:<\/p>\n<table class=\" aligncenter\" style=\"height: 479px; width: 32.2498%; border-collapse: collapse;\">\n<tbody>\n<tr style=\"height: 132px;\">\n<td style=\"width: 50%; height: 132px;\"><a href=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat1-1.png\"><img decoding=\"async\" class=\"wp-image-6639 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat1-1.png\" alt=\"Image qcat1\" width=\"197\" height=\"168\" \/><\/a><\/td>\n<td style=\"width: 50%; height: 132px;\"><a href=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat1b.png\"><img decoding=\"async\" class=\"wp-image-6640 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat1b.png\" alt=\"Image qcat1b\" width=\"148\" height=\"127\" \/><\/a><\/td>\n<\/tr>\n<tr style=\"height: 28px;\">\n<td style=\"width: 50%; height: 28px; text-align: center;\"><strong>IsHelperLane\u00a0\u00a0<\/strong><\/td>\n<td style=\"width: 50%; height: 28px; text-align: center;\"><strong>QuadReadAcrossDiagonal<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 132px;\">\n<td style=\"width: 50%; height: 132px;\"><a href=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat2-1.png\"><img decoding=\"async\" class=\"size-medium wp-image-6641 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat2-1.png\" alt=\"Image qcat2\" width=\"212\" height=\"181\" \/><\/a><\/td>\n<td style=\"width: 50%; height: 132px;\"><a href=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat2b.png\"><img decoding=\"async\" class=\"wp-image-6642 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat2b.png\" alt=\"Image qcat2b\" width=\"148\" height=\"127\" \/><\/a><\/td>\n<\/tr>\n<tr style=\"height: 28px;\">\n<td style=\"width: 50%; height: 28px; text-align: center;\">\u00a0<strong>QuadReadAcrossX\u00a0\u00a0<\/strong><\/td>\n<td style=\"width: 50%; text-align: center; height: 28px;\"><strong>QuadReadAcrossY<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 131px;\">\n<td style=\"width: 50%; height: 131px;\"><a href=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat3-1.png\"><img decoding=\"async\" class=\"size-medium wp-image-6643 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat3-1.png\" alt=\"Image qcat3\" width=\"212\" height=\"181\" \/><\/a><\/td>\n<td style=\"width: 50%; height: 131px;\"><a href=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat3b.png\"><img decoding=\"async\" class=\"wp-image-6644 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/directx\/wp-content\/uploads\/sites\/42\/2022\/07\/qcat3b.png\" alt=\"Image qcat3b\" width=\"153\" height=\"129\" \/><\/a><\/td>\n<\/tr>\n<tr style=\"height: 28px;\">\n<td style=\"width: 50%; height: 28px; text-align: center;\"><strong>QuadAny<\/strong><\/td>\n<td style=\"width: 50%; text-align: center; height: 28px;\"><strong>QuadAll<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>(Sorry they don&#8217;t look much like cats\ud83d\ude15 Engineer art \ud83d\ude06)<\/p>\n<p>The bottom row contains the new efficient queries that determine if a given expression is true for any or all of the lanes in the current quad are true.<\/p>\n<p>Quads can return whether any or all of them evaluate an expression to true<\/p>\n<p>QuadAny can efficiently resolve non-quad-uniform flow problems:<\/p>\n<pre class=\"prettyprint\">float4 main(int x: X, float2 uv : TEXCOORD0) : SV_Target {\r\n  float4 ret = 0;\r\n  float2 temp_uv = modifyuv(uv);\r\n  if (x &gt; SCREEN_X)\r\n    ret = t0.Sample(s0, temp_uv);\r\n  return ret;\r\n}<\/pre>\n<p>BECOMES<\/p>\n<pre class=\"prettyprint\">float4 main(float x : X, float2 uv : TEXCOORD0) : SV_Target {\r\n  float4 ret = 0;\r\n  if (QuadAny(x &gt; SCREEN_X)) {\r\n    float2 temp_uv = modifyuv(uv);\r\n    float4 sampled_result = t0.Sample(s0, temp_uv);\r\n    if (x &gt; SCREEN_X)\r\n      ret = sampled_result;\r\n  }\r\n  return ret;\r\n}<\/pre>\n<h2 id=\"helper-lanes-in-wave-ops-mode\">Helper Lanes in Wave Ops Mode<i class=\"fabric-icon fabric-icon--Link\" aria-hidden=\"true\"><\/i><\/h2>\n<p>Sometimes you need a little help. For those times, Shader Model 6.7 introduces the WaveOpsIncludeHelperlanes Attribute!<\/p>\n<p>Helper lanes previously only contributed to derivative calculations and not wave operations. That meant that derivative operations that depend on values or control flow that derived from wave operations had undefined results. In combination with the\u00a0<em>IsHelperLane()<\/em>\u00a0query added with Shader Model 6.6, developers will have full control over how wave ops interact and behave on helper lanes. This control will allow derivative operations to be reliably used in the presence of wave operations.<\/p>\n<p>This is effected by applying the <i>WaveOpsIncludeHelperLanes\u00a0<\/i>attribute to the shader entry function:<\/p>\n<pre class=\"prettyprint\">[WaveOpsIncludeHelperLanes] \/\/ Yes, it's just this easy!\r\nvoid func() ...\r\n<\/pre>\n<p>Lanes will be created as or demoted to helper lanes exactly as they were before. The only effect of this attribute is that they will now contribute to the wave functions and, as such, they will persist until the last wave operation is complete so that they can contribute to those results. So some helper lanes might stick around a bit longer than they used to.<\/p>\n<h2>Great! How Can I Try It Out?<\/h2>\n<p>I love your enthusiasm! You need three things:<\/p>\n<ul>\n<li>A compiler that allows you to compile shader model 6.7 shaders<\/li>\n<li>A runtime SDK that allows you to use the new D3D interfaces and recognizes the compiled shaders<\/li>\n<li>A hardware-specific driver to run those shaders<\/li>\n<\/ul>\n<p>You can get the compiler from the <a href=\"https:\/\/github.com\/microsoft\/DirectXShaderCompiler\/releases\/tag\/v1.7.2207\">July 2022 DXC release<\/a>. You&#8217;ll need to specify the appropriate shader target with the ending <em>*_6_7<\/em> to compile a shader using the new features.<\/p>\n<p>You&#8217;ll need to use either the <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Direct3D.D3D12\/1.606.3\">1.606.3 Agility SDK<\/a> or the <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Direct3D.D3D12\/1.706.3-preview\">1.706.3 preview Agility SDK<\/a> with your build.<\/p>\n<p><span data-contrast=\"auto\">Finally, you can get preview drivers for the following platforms:<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><b><span data-contrast=\"auto\">AMD<\/span><\/b><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">AMD support for Shader Model 6.7 will be publicly released in an upcoming AMD Radeon Software Adrenalin release. The AMD Adrenalin driver for 1.706.3 preview Agility SDK can be used until then: <\/span><a href=\"https:\/\/www.amd.com\/en\/support\/kb\/release-notes\/rn-rad-ms-agility-sdk-2022-1-706\"><span data-contrast=\"none\">https:\/\/www.amd.com\/en\/support\/kb\/release-notes\/rn-rad-ms-agility-sdk-2022-1-706<\/span><\/a><span data-contrast=\"auto\">\u00a0<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><b><span data-contrast=\"auto\">NVIDIA<\/span><\/b><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Developers interested in working with the latest Public and Preview Agility SDKs on NVIDIA hardware should reach out to their NVIDIA representative for more details.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><b><span data-contrast=\"auto\">Intel<\/span><\/b><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">A preview driver for Intel\u00ae Arc\u2122 Graphics Family (DG2) cards is available at: <\/span><a href=\"https:\/\/www.intel.com\/content\/www\/us\/en\/download\/737144\/737145\"><span data-contrast=\"none\">https:\/\/www.intel.com\/content\/www\/us\/en\/download\/737144\/737145<\/span><\/a><span data-contrast=\"auto\">\u00a0<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Support for additional Intel\u00ae graphic cards will be available in future driver updates.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>For more details about these features, see the documentation and specs in <a href=\"https:\/\/microsoft.github.io\/DirectX-Specs\/d3d\/HLSL_ShaderModel6_7.html\">DirectX-Specs<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The DirectX Compiler Team and our partners are pleased to announce the release of Shader Model 6.7! Shader Model 6.7 expands texture fetching, quad querying, and wave capabilities to enable ever more complex (and compatible) new shader-driven features! Advanced Texture Operations SM 6.7 adds a collection of useful texture capabilities that fill in gaps the [&hellip;]<\/p>\n","protected":false},"author":45155,"featured_media":12651,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6547","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-directx"],"acf":[],"blog_post_summary":"<p>The DirectX Compiler Team and our partners are pleased to announce the release of Shader Model 6.7! Shader Model 6.7 expands texture fetching, quad querying, and wave capabilities to enable ever more complex (and compatible) new shader-driven features! Advanced Texture Operations SM 6.7 adds a collection of useful texture capabilities that fill in gaps the [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/posts\/6547","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/users\/45155"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/comments?post=6547"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/posts\/6547\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/media\/12651"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/media?parent=6547"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/categories?post=6547"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/directx\/wp-json\/wp\/v2\/tags?post=6547"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}