diff options
Diffstat (limited to 'src/compiler/nir/nir_intrinsics.h')
-rw-r--r-- | src/compiler/nir/nir_intrinsics.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_intrinsics.h b/src/compiler/nir/nir_intrinsics.h index 2f74555ee48..cf2ddc8ac72 100644 --- a/src/compiler/nir/nir_intrinsics.h +++ b/src/compiler/nir/nir_intrinsics.h @@ -306,6 +306,35 @@ SYSTEM_VALUE(num_work_groups, 3, 0, xx, xx, xx) SYSTEM_VALUE(helper_invocation, 1, 0, xx, xx, xx) SYSTEM_VALUE(channel_num, 1, 0, xx, xx, xx) +/** + * Barycentric coordinate intrinsics. + * + * These set up the barycentric coordinates for a particular interpolation. + * The first three are for the simple cases: pixel, centroid, or per-sample + * (at gl_SampleID). The next 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 + * INTERP_MODE_NOPERSPECTIVE enum values. + * + * The vec2 value produced by these intrinsics is intended for use as the + * barycoord source of a load_interpolated_input intrinsic. + */ + +#define BARYCENTRIC(name, sources, source_components) \ + INTRINSIC(load_barycentric_##name, sources, ARR(source_components), \ + true, 2, 0, 1, INTERP_MODE, xx, xx, \ + NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER) + +/* no sources. const_index[] = { interp_mode } */ +BARYCENTRIC(pixel, 0, 0) +BARYCENTRIC(centroid, 0, 0) +BARYCENTRIC(sample, 0, 0) +/* src[] = { sample_id }. const_index[] = { interp_mode } */ +BARYCENTRIC(at_sample, 1, 1) +/* src[] = { offset.xy }. const_index[] = { interp_mode } */ +BARYCENTRIC(at_offset, 1, 2) + /* * Load operations pull data from some piece of GPU memory. All load * operations operate in terms of offsets into some piece of theoretical @@ -339,6 +368,9 @@ LOAD(ubo, 2, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REOR LOAD(input, 1, 2, BASE, COMPONENT, xx, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER) /* src[] = { vertex, offset }. const_index[] = { base, component } */ LOAD(per_vertex_input, 2, 2, BASE, COMPONENT, xx, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER) +/* src[] = { barycoord, offset }. const_index[] = { base, component } */ +LOAD(interpolated_input, 2, 2, BASE, COMPONENT, xx, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER) + /* src[] = { buffer_index, offset }. No const_index */ LOAD(ssbo, 2, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE) /* src[] = { offset }. const_index[] = { base, component } */ |