Skip to content
Snippets Groups Projects
  • ReinUsesLisp's avatar
    shader_ir: Implement VOTE · 4e35177e
    ReinUsesLisp authored
    Implement VOTE using Nvidia's intrinsics. Documentation about these can
    be found here
    https://developer.nvidia.com/reading-between-threads-shader-intrinsics
    
    Instead of using portable ARB instructions I opted to use Nvidia
    intrinsics because these are the closest we have to how Tegra X1
    hardware renders.
    
    To stub VOTE on non-Nvidia drivers (including nouveau) this commit
    simulates a GPU with a warp size of one, returning what is meaningful
    for the instruction being emulated:
    
    * anyThreadNV(value) -> value
    * allThreadsNV(value) -> value
    * allThreadsEqualNV(value) -> true
    
    ballotARB, also known as "uint64_t(activeThreadsNV())", emits
    
    VOTE.ANY Rd, PT, PT;
    
    on nouveau's compiler. This doesn't match exactly to Nvidia's code
    
    VOTE.ALL Rd, PT, PT;
    
    Which is emulated with activeThreadsNV() by this commit. In theory this
    shouldn't really matter since .ANY, .ALL and .EQ affect the predicates
    (set to PT on those cases) and not the registers.
    4e35177e