nir: Add _deref versions of all of the _var intrinsics
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Acked-by: Rob Clark <robdclark@gmail.com> Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Acked-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -124,6 +124,10 @@ intrinsic("load_var", dest_comp=0, num_vars=1, flags=[CAN_ELIMINATE])
|
||||
intrinsic("store_var", src_comp=[0], num_vars=1, indices=[WRMASK])
|
||||
intrinsic("copy_var", num_vars=2)
|
||||
|
||||
intrinsic("load_deref", dest_comp=0, src_comp=[1], flags=[CAN_ELIMINATE])
|
||||
intrinsic("store_deref", src_comp=[1, 0], indices=[WRMASK])
|
||||
intrinsic("copy_deref", src_comp=[1, 1])
|
||||
|
||||
# Interpolation of input. The interp_var_at* intrinsics are similar to the
|
||||
# load_var intrinsic acting on a shader input except that they interpolate
|
||||
# the input differently. The at_sample and at_offset intrinsics take an
|
||||
@@ -137,6 +141,19 @@ intrinsic("interp_var_at_sample", src_comp=[1], dest_comp=0, num_vars=1,
|
||||
intrinsic("interp_var_at_offset", src_comp=[2], dest_comp=0, num_vars=1,
|
||||
flags=[CAN_ELIMINATE, CAN_REORDER])
|
||||
|
||||
# Interpolation of input. The interp_deref_at* intrinsics are similar to the
|
||||
# load_var intrinsic acting on a shader input except that they interpolate the
|
||||
# input differently. The at_sample and at_offset intrinsics take an
|
||||
# additional source that is an integer sample id or a vec2 position offset
|
||||
# respectively.
|
||||
|
||||
intrinsic("interp_deref_at_centroid", dest_comp=0, src_comp=[1],
|
||||
flags=[ CAN_ELIMINATE, CAN_REORDER])
|
||||
intrinsic("interp_deref_at_sample", src_comp=[1, 1], dest_comp=0,
|
||||
flags=[CAN_ELIMINATE, CAN_REORDER])
|
||||
intrinsic("interp_deref_at_offset", src_comp=[1, 2], dest_comp=0,
|
||||
flags=[CAN_ELIMINATE, CAN_REORDER])
|
||||
|
||||
# Ask the driver for the size of a given buffer. It takes the buffer index
|
||||
# as source.
|
||||
intrinsic("get_buffer_size", src_comp=[1], dest_comp=1,
|
||||
@@ -258,14 +275,17 @@ intrinsic("set_vertex_count", src_comp=[1])
|
||||
|
||||
def atomic(name, flags=[]):
|
||||
intrinsic(name + "_var", dest_comp=1, num_vars=1, flags=flags)
|
||||
intrinsic(name + "_deref", src_comp=[1], dest_comp=1, flags=flags)
|
||||
intrinsic(name, src_comp=[1], dest_comp=1, indices=[BASE], flags=flags)
|
||||
|
||||
def atomic2(name):
|
||||
intrinsic(name + "_var", src_comp=[1], dest_comp=1, num_vars=1)
|
||||
intrinsic(name + "_deref", src_comp=[1, 1], dest_comp=1)
|
||||
intrinsic(name, src_comp=[1, 1], dest_comp=1, indices=[BASE])
|
||||
|
||||
def atomic3(name):
|
||||
intrinsic(name + "_var", src_comp=[1, 1], dest_comp=1, num_vars=1)
|
||||
intrinsic(name + "_deref", src_comp=[1, 1, 1], dest_comp=1)
|
||||
intrinsic(name, src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])
|
||||
|
||||
atomic("atomic_counter_inc")
|
||||
@@ -307,6 +327,34 @@ intrinsic("image_var_atomic_comp_swap", src_comp=[4, 1, 1, 1], dest_comp=1, num_
|
||||
intrinsic("image_var_size", dest_comp=0, num_vars=1, flags=[CAN_ELIMINATE, CAN_REORDER])
|
||||
intrinsic("image_var_samples", dest_comp=1, num_vars=1, flags=[CAN_ELIMINATE, CAN_REORDER])
|
||||
|
||||
# Image load, store and atomic intrinsics.
|
||||
#
|
||||
# All image intrinsics take an image target passed as a nir_variable. The
|
||||
# variable is passed in using a chain of nir_deref_instr with as the first
|
||||
# source of the image intrinsic. Image variables contain a number of memory
|
||||
# and layout qualifiers that influence the semantics of the intrinsic.
|
||||
#
|
||||
# All image intrinsics take a four-coordinate vector and a sample index as
|
||||
# first two sources, determining the location within the image that will be
|
||||
# accessed by the intrinsic. Components not applicable to the image target
|
||||
# in use are undefined. Image store takes an additional four-component
|
||||
# argument with the value to be written, and image atomic operations take
|
||||
# either one or two additional scalar arguments with the same meaning as in
|
||||
# the ARB_shader_image_load_store specification.
|
||||
intrinsic("image_deref_load", src_comp=[1, 4, 1], dest_comp=4,
|
||||
flags=[CAN_ELIMINATE])
|
||||
intrinsic("image_deref_store", src_comp=[1, 4, 1, 4])
|
||||
intrinsic("image_deref_atomic_add", src_comp=[1, 4, 1, 1], dest_comp=1)
|
||||
intrinsic("image_deref_atomic_min", src_comp=[1, 4, 1, 1], dest_comp=1)
|
||||
intrinsic("image_deref_atomic_max", src_comp=[1, 4, 1, 1], dest_comp=1)
|
||||
intrinsic("image_deref_atomic_and", src_comp=[1, 4, 1, 1], dest_comp=1)
|
||||
intrinsic("image_deref_atomic_or", src_comp=[1, 4, 1, 1], dest_comp=1)
|
||||
intrinsic("image_deref_atomic_xor", src_comp=[1, 4, 1, 1], dest_comp=1)
|
||||
intrinsic("image_deref_atomic_exchange", src_comp=[1, 4, 1, 1], dest_comp=1)
|
||||
intrinsic("image_deref_atomic_comp_swap", src_comp=[1, 4, 1, 1, 1], dest_comp=1)
|
||||
intrinsic("image_deref_size", src_comp=[1], dest_comp=0, flags=[CAN_ELIMINATE, CAN_REORDER])
|
||||
intrinsic("image_deref_samples", src_comp=[1], dest_comp=1, flags=[CAN_ELIMINATE, CAN_REORDER])
|
||||
|
||||
# Vulkan descriptor set intrinsics
|
||||
#
|
||||
# The Vulkan API uses a different binding model from GL. In the Vulkan
|
||||
@@ -356,6 +404,30 @@ intrinsic("var_atomic_xor", src_comp=[1], dest_comp=1, num_vars=1)
|
||||
intrinsic("var_atomic_exchange", src_comp=[1], dest_comp=1, num_vars=1)
|
||||
intrinsic("var_atomic_comp_swap", src_comp=[1, 1], dest_comp=1, num_vars=1)
|
||||
|
||||
# variable atomic intrinsics
|
||||
#
|
||||
# All of these variable atomic memory operations read a value from memory,
|
||||
# compute a new value using one of the operations below, write the new value
|
||||
# to memory, and return the original value read.
|
||||
#
|
||||
# All operations take 2 sources except CompSwap that takes 3. These sources
|
||||
# represent:
|
||||
#
|
||||
# 0: A deref to the memory on which to perform the atomic
|
||||
# 1: The data parameter to the atomic function (i.e. the value to add
|
||||
# in shared_atomic_add, etc).
|
||||
# 2: For CompSwap only: the second data parameter.
|
||||
intrinsic("deref_atomic_add", src_comp=[1, 1], dest_comp=1)
|
||||
intrinsic("deref_atomic_imin", src_comp=[1, 1], dest_comp=1)
|
||||
intrinsic("deref_atomic_umin", src_comp=[1, 1], dest_comp=1)
|
||||
intrinsic("deref_atomic_imax", src_comp=[1, 1], dest_comp=1)
|
||||
intrinsic("deref_atomic_umax", src_comp=[1, 1], dest_comp=1)
|
||||
intrinsic("deref_atomic_and", src_comp=[1, 1], dest_comp=1)
|
||||
intrinsic("deref_atomic_or", src_comp=[1, 1], dest_comp=1)
|
||||
intrinsic("deref_atomic_xor", src_comp=[1, 1], dest_comp=1)
|
||||
intrinsic("deref_atomic_exchange", src_comp=[1, 1], dest_comp=1)
|
||||
intrinsic("deref_atomic_comp_swap", src_comp=[1, 1, 1], dest_comp=1)
|
||||
|
||||
# SSBO atomic intrinsics
|
||||
#
|
||||
# All of the SSBO atomic memory operations read a value from memory,
|
||||
|
Reference in New Issue
Block a user