nir: add nir_intrinsic_load_barycentric_model

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3578>
This commit is contained in:
Samuel Pitoiset
2020-01-24 11:36:37 +01:00
committed by Marge Bot
parent df8dd12e5b
commit 9021b45b35
2 changed files with 14 additions and 11 deletions

View File

@@ -1250,8 +1250,9 @@ static inline nir_ssa_def *
nir_load_barycentric(nir_builder *build, nir_intrinsic_op op, nir_load_barycentric(nir_builder *build, nir_intrinsic_op op,
unsigned interp_mode) unsigned interp_mode)
{ {
unsigned num_components = op == nir_intrinsic_load_barycentric_model ? 3 : 2;
nir_intrinsic_instr *bary = nir_intrinsic_instr_create(build->shader, op); nir_intrinsic_instr *bary = nir_intrinsic_instr_create(build->shader, op);
nir_ssa_dest_init(&bary->instr, &bary->dest, 2, 32, NULL); nir_ssa_dest_init(&bary->instr, &bary->dest, num_components, 32, NULL);
nir_intrinsic_set_interp_mode(bary, interp_mode); nir_intrinsic_set_interp_mode(bary, interp_mode);
nir_builder_instr_insert(build, &bary->instr); nir_builder_instr_insert(build, &bary->instr);
return &bary->dest.ssa; return &bary->dest.ssa;

View File

@@ -646,9 +646,10 @@ system_value("user_data_amd", 4)
# Barycentric coordinate intrinsics. # Barycentric coordinate intrinsics.
# #
# These set up the barycentric coordinates for a particular interpolation. # These set up the barycentric coordinates for a particular interpolation.
# The first three are for the simple cases: pixel, centroid, or per-sample # The first four are for the simple cases: pixel, centroid, per-sample
# (at gl_SampleID). The next two handle interpolating at a specified # (at gl_SampleID), or pull model (1/W, 1/I, 1/J) at the pixel center. The next
# sample location, or interpolating with a vec2 offset, # three two handle interpolating at a specified sample location, or
# interpolating with a vec2 offset,
# #
# The interp_mode index should be either the INTERP_MODE_SMOOTH or # The interp_mode index should be either the INTERP_MODE_SMOOTH or
# INTERP_MODE_NOPERSPECTIVE enum values. # INTERP_MODE_NOPERSPECTIVE enum values.
@@ -656,18 +657,19 @@ system_value("user_data_amd", 4)
# The vec2 value produced by these intrinsics is intended for use as the # The vec2 value produced by these intrinsics is intended for use as the
# barycoord source of a load_interpolated_input intrinsic. # barycoord source of a load_interpolated_input intrinsic.
def barycentric(name, src_comp=[]): def barycentric(name, dst_comp, src_comp=[]):
intrinsic("load_barycentric_" + name, src_comp=src_comp, dest_comp=2, intrinsic("load_barycentric_" + name, src_comp=src_comp, dest_comp=dst_comp,
indices=[INTERP_MODE], flags=[CAN_ELIMINATE, CAN_REORDER]) indices=[INTERP_MODE], flags=[CAN_ELIMINATE, CAN_REORDER])
# no sources. # no sources.
barycentric("pixel") barycentric("pixel", 2)
barycentric("centroid") barycentric("centroid", 2)
barycentric("sample") barycentric("sample", 2)
barycentric("model", 3)
# src[] = { sample_id }. # src[] = { sample_id }.
barycentric("at_sample", [1]) barycentric("at_sample", 2, [1])
# src[] = { offset.xy }. # src[] = { offset.xy }.
barycentric("at_offset", [2]) barycentric("at_offset", 2, [2])
# Load sample position: # Load sample position:
# #