glsl: add new interpolateAt* builtin functions

V2: - Don't assume everyone wants interpolateAtSample() lowered to
      interpolateAtOffset. It turns out this isn't what we want most
      of the time for i965. Lowering can be added later in an ir pass
      which drivers opt into, rather than bolting it straight into the
      builtin definition.
    - Only expose the interpolateAt* builtins in the fragment language.

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
Chris Forbes
2013-11-10 19:34:53 +13:00
parent 1d5b06664f
commit b45d417108
+67
View File
@@ -225,6 +225,14 @@ shader_packing_or_gpu_shader5(const _mesa_glsl_parse_state *state)
gpu_shader5(state);
}
static bool
fs_gpu_shader5(const _mesa_glsl_parse_state *state)
{
return state->stage == MESA_SHADER_FRAGMENT &&
(state->is_version(400, 0) || state->ARB_gpu_shader5_enable);
}
static bool
texture_array_lod(const _mesa_glsl_parse_state *state)
{
@@ -627,6 +635,9 @@ private:
B1(uaddCarry)
B1(usubBorrow)
B1(mulExtended)
B1(interpolateAtCentroid)
B1(interpolateAtOffset)
B1(interpolateAtSample)
ir_function_signature *_atomic_intrinsic(builtin_available_predicate avail);
ir_function_signature *_atomic_op(const char *intrinsic,
@@ -2186,6 +2197,24 @@ builtin_builder::create_builtins()
_mulExtended(glsl_type::uvec3_type),
_mulExtended(glsl_type::uvec4_type),
NULL);
add_function("interpolateAtCentroid",
_interpolateAtCentroid(glsl_type::float_type),
_interpolateAtCentroid(glsl_type::vec2_type),
_interpolateAtCentroid(glsl_type::vec3_type),
_interpolateAtCentroid(glsl_type::vec4_type),
NULL);
add_function("interpolateAtOffset",
_interpolateAtOffset(glsl_type::float_type),
_interpolateAtOffset(glsl_type::vec2_type),
_interpolateAtOffset(glsl_type::vec3_type),
_interpolateAtOffset(glsl_type::vec4_type),
NULL);
add_function("interpolateAtSample",
_interpolateAtSample(glsl_type::float_type),
_interpolateAtSample(glsl_type::vec2_type),
_interpolateAtSample(glsl_type::vec3_type),
_interpolateAtSample(glsl_type::vec4_type),
NULL);
add_function("atomicCounter",
_atomic_op("__intrinsic_atomic_read",
@@ -4259,6 +4288,44 @@ builtin_builder::_mulExtended(const glsl_type *type)
return sig;
}
ir_function_signature *
builtin_builder::_interpolateAtCentroid(const glsl_type *type)
{
ir_variable *interpolant = in_var(type, "interpolant");
interpolant->data.must_be_shader_input = 1;
MAKE_SIG(type, fs_gpu_shader5, 1, interpolant);
body.emit(ret(interpolate_at_centroid(interpolant)));
return sig;
}
ir_function_signature *
builtin_builder::_interpolateAtOffset(const glsl_type *type)
{
ir_variable *interpolant = in_var(type, "interpolant");
interpolant->data.must_be_shader_input = 1;
ir_variable *offset = in_var(glsl_type::vec2_type, "offset");
MAKE_SIG(type, fs_gpu_shader5, 2, interpolant, offset);
body.emit(ret(interpolate_at_offset(interpolant, offset)));
return sig;
}
ir_function_signature *
builtin_builder::_interpolateAtSample(const glsl_type *type)
{
ir_variable *interpolant = in_var(type, "interpolant");
interpolant->data.must_be_shader_input = 1;
ir_variable *sample_num = in_var(glsl_type::int_type, "sample_num");
MAKE_SIG(type, fs_gpu_shader5, 2, interpolant, sample_num);
body.emit(ret(interpolate_at_sample(interpolant, sample_num)));
return sig;
}
ir_function_signature *
builtin_builder::_atomic_intrinsic(builtin_available_predicate avail)
{