It’s that time again!
Microsoft and its partners are excited to announce the ongoing development of the latest HLSL Shader Model, 6.7!
Shader Model 6.7 expands texture, quad, and wave shader capabilities in response to requests from HLSL users.
It is still a work in progress and not yet available in any release, but implementation and updates will be showing up in the DXC Github Repository.
Feature Details
Advanced Texture Operations
SM 6.7 adds a collection of useful texture capabilities that fill in gaps the capabilities of certain texture operations as well as adding versatile new ones collectively referred to as Advanced Texture Operations. This will be an optional feature.
Raw Gather
Developers have long requested more control over how sampled elements are processed. Gather operations grant the ability to retrieve individual channels of the sampled elements. Not only was this limited to a single channel, but it involved implicit conversions and other processing they had no control over.
Raw gathers give the control to the author by retrieving the raw element data without any conversion. They retrieve the four elements that have been sampled with bilinear filtering using Sample. The elements are retrieved in the form of unsigned integers with sizes matching the size of the full elements.
To enable these gathers, resources with various formats can be aliased to unsigned integer resource views with unsigned integer formats of equal size to the full element. These resource views are then used in the shader to retrieve the raw texture data.
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.
Programmable Offsets
Current 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.
Shader Model 6.7 frees Sample and Load offset arguments to be variable values just as they are in gather operations. The respected range remains [-8,7], corresponding to the 4 least significant bits of the provided values.
SampleCmpLevel
Previously, if you wanted to perform SampleCmp, you could either use the level determined by your hardware for the texture coordinates provided or use zero. Developers found this limiting and requested the ability to employ the MIP level that best benefits their algorithms.
With 6.7, you will be able to specify any MIP level you want (even if it’s not zero).
Writable MSAA Textures
Shader authors will be able to use a UAV multisample texture object to read and write to specified sample indices. This has proven useful on other platforms and will soon be available in HLSL with even more capability.
QuadAny/QuadAll
A popular request has been for an efficient way to query quad lane results. Waves have had the ability to return whether an expression is true for any or all of their lanes.
Quads will get efficient queries to determine if a given expression is true for any or all of the lanes in the current quad are true.
Helper Lanes in Wave Ops Mode
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 IsHelperLane() query 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.
A [WaveOpsIncludeHelperLanes] entry function attribute that will allow developers to opt in to allowing helper lanes to participate in all wave operations.
Great! When Can I try it?
We’re coding as fast as we can! Look forward to an official release and lots more details later in the year!
What is the roadmap for WARP supporting this? (E.g. DXCapsViewer still shows 6.2 or was 6.3 supported shader model).
Some seriously awesome improvements here, thanks looking forward to trying it out