According to the claims in the MS patent and looking at the requirement for VRS in DX12. I believe that the one MS has patented is their way of doing Tier 2 (if I am reading correctly). I've highlighted what I believe are the major differences for spotting.
From reading AMD patent, I believe it designed so far to only support Tier 1.
Turing's VRS method supports portions of Tier 2. I'm am unsure if it's full Tier 2 support.
My current understanding:
MS' method has multiple methods in which developers can determine the sampling method in determine how to shade the sampled area. Ranging from directly inputed values, to texture, SSR, vertices, it has a range of methods to determine the regions in which the shading rate is determined in a single draw call.
Turing provides a couple methods too; though without seeing the patent, from their website it appears to support from a variety of methods as well; though not all the methods that MS has.
AMD's patent showcases heavy usage of quads to determine it's shading rates; I believe this is inferior to the other methods, as the image is tiled and put into fine grain quads. So it doesn't seem to support textures or vertices. Nor does it appear to accept just provided sampling value either. I suspect if you have a bunch of angled items that you want variably shaded differently from the rest, then this is not going to be as effective here. I think a drawback here for AMD's method is going to be clarity around the edges.
***
VRS Abstract MS:
Methods and devices for rendering graphics in a computer system include a graphical processing unit (GPU) with a flexible, dynamic, application-directed mechanism for varying the rate at which fragment shading is performed for rendering an image to a display. In particular, the described aspects allow different shading rates to be used for different regions of a primitive based on a new, interpolated shading rate parameter. In other words, the described aspects enable the GPU to change shading rates on-the-fly between different fragments of each primitive. Additionally, or independently, the GPU utilizes each respective shading rate parameter to determine how many sample positions to consider to be covered by the computed shaded output, e.g., the fragment color, thereby allowing the color sample to be shared across two or more pixels.
VRS Abstract AMD:
A technique for performing rasterization and pixel shading with decoupled resolution is provided herein. The technique involves performing rasterization as normal to generate fine rasterization data and a set of (fine) quads. The quads are accumulated into a tile buffer and coarse quads are generated from the quads in the tile buffer based on a shading rate. The shading rate determines how many pixels of the fine quads are combined to generate coarse pixels of the coarse quads. Combination of fine pixels involves generating a single coarse pixel for each such fine pixel to be combined. The positions of the coarse pixels of the coarse quads are set based on the positions of the corresponding fine pixels. The coarse quads are shaded normally and the resulting shaded coarse quads are modified based on the fine rasterization data to generate shaded fine quads.
As per Direct X specifications:
edit: i guess we don't allow tables here
Tier 1
- Shading rate can only be specified on a per-draw-basis; nothing more granular than that
- Shading rate applies uniformly to what is drawn independently of where it lies within the rendertarget
- Use of 1x2, programmable sample positions, or conservative rasterization may cause fall-back into fine shading
Tier 2
- Shading rate can be specified on a per-draw-basis, as in Tier 1. It can also be specified by a combination of per-draw-basis, and of:
- Semantic from the per-provoking-vertex, and
- a screenspace image
- Shading rates from the three sources are combined using a set of combiners
- Screen space image tile size is 16x16 or smaller
- Shading rate requested by the app is guaranteed to be delivered exactly (for precision of temporal and other reconstruction filters)
- SV_ShadingRate PS input is supported
- The per-provoking vertex rate, also referred to here as a per-primitive rate, is valid when one viewport is used and SV_ViewportIndex is not written to.
- The per-provoking vertex rate, also referred to as a per-primitive rate, can be used with more than one viewport if the SupportsPerVertexShadingRateWithMultipleViewports cap is marked true. Additionally, in that case, it can be used when SV_ViewportIndex is written to.
There's more:
https://microsoft.github.io/DirectX-Specs/d3d/VariableRateShading.html
Just going through this now. will edit for better reading in a moment. and I have some thoughts to write about.
AMD patent:
http://www.freepatentsonline.com/y2019/0066371.html
MS patent:
https://patents.google.com/patent/US20180047203A1/en