summaryrefslogtreecommitdiff
path: root/dist/Mesa/src/glsl/builtin_functions.cpp
diff options
context:
space:
mode:
authorJonathan Gray <jsg@cvs.openbsd.org>2015-02-20 22:51:21 +0000
committerJonathan Gray <jsg@cvs.openbsd.org>2015-02-20 22:51:21 +0000
commite6e3394a78b6d19474b3aea1458d8718d19d8325 (patch)
treefe92a58246a2181ba1459d22b92fbfc629b3cbb9 /dist/Mesa/src/glsl/builtin_functions.cpp
parent8bb43317c5713539f43fcdcb25a30cf59aa981d6 (diff)
Import Mesa 10.2.9
Diffstat (limited to 'dist/Mesa/src/glsl/builtin_functions.cpp')
-rw-r--r--dist/Mesa/src/glsl/builtin_functions.cpp274
1 files changed, 26 insertions, 248 deletions
diff --git a/dist/Mesa/src/glsl/builtin_functions.cpp b/dist/Mesa/src/glsl/builtin_functions.cpp
index bb7fbcdc1..f9f06862e 100644
--- a/dist/Mesa/src/glsl/builtin_functions.cpp
+++ b/dist/Mesa/src/glsl/builtin_functions.cpp
@@ -226,14 +226,6 @@ shader_packing_or_gpu_shader5(const _mesa_glsl_parse_state *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)
{
return lod_exists_in_stage(state) &&
@@ -318,14 +310,6 @@ fs_oes_derivatives(const _mesa_glsl_parse_state *state)
}
static bool
-fs_derivative_control(const _mesa_glsl_parse_state *state)
-{
- return state->stage == MESA_SHADER_FRAGMENT &&
- (state->is_version(450, 0) ||
- state->ARB_derivative_control_enable);
-}
-
-static bool
tex1d_lod(const _mesa_glsl_parse_state *state)
{
return !state->es_shader && lod_exists_in_stage(state);
@@ -375,12 +359,6 @@ shader_image_load_store(const _mesa_glsl_parse_state *state)
state->ARB_shader_image_load_store_enable);
}
-static bool
-gs_streams(const _mesa_glsl_parse_state *state)
-{
- return gpu_shader5(state) && gs_only(state);
-}
-
/** @} */
/******************************************************************************/
@@ -442,7 +420,6 @@ private:
ir_swizzle *matrix_elt(ir_variable *var, int col, int row);
ir_expression *asin_expr(ir_variable *x);
- void do_atan(ir_factory &body, const glsl_type *type, ir_variable *res, operand y_over_x);
/**
* Call function \param f with parameters specified as the linked
@@ -617,22 +594,12 @@ private:
B0(EmitVertex)
B0(EndPrimitive)
- ir_function_signature *_EmitStreamVertex(builtin_available_predicate avail,
- const glsl_type *stream_type);
- ir_function_signature *_EndStreamPrimitive(builtin_available_predicate avail,
- const glsl_type *stream_type);
B2(textureQueryLod);
B1(textureQueryLevels);
B1(dFdx);
B1(dFdy);
B1(fwidth);
- B1(dFdxCoarse);
- B1(dFdyCoarse);
- B1(fwidthCoarse);
- B1(dFdxFine);
- B1(dFdyFine);
- B1(fwidthFine);
B1(noise1);
B1(noise2);
B1(noise3);
@@ -650,9 +617,6 @@ 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,
@@ -721,8 +685,7 @@ builtin_builder::find(_mesa_glsl_parse_state *state,
if (f == NULL)
return NULL;
- ir_function_signature *sig =
- f->matching_signature(state, actual_parameters, true);
+ ir_function_signature *sig = f->matching_signature(state, actual_parameters);
if (sig == NULL)
return NULL;
@@ -1745,14 +1708,6 @@ builtin_builder::create_builtins()
add_function("EmitVertex", _EmitVertex(), NULL);
add_function("EndPrimitive", _EndPrimitive(), NULL);
- add_function("EmitStreamVertex",
- _EmitStreamVertex(gs_streams, glsl_type::uint_type),
- _EmitStreamVertex(gs_streams, glsl_type::int_type),
- NULL);
- add_function("EndStreamPrimitive",
- _EndStreamPrimitive(gs_streams, glsl_type::uint_type),
- _EndStreamPrimitive(gs_streams, glsl_type::int_type),
- NULL);
add_function("textureQueryLOD",
_textureQueryLod(glsl_type::sampler1D_type, glsl_type::float_type),
@@ -1883,8 +1838,8 @@ builtin_builder::create_builtins()
NULL);
add_function("texture2DProjLod",
- _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
- _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
+ _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
+ _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
NULL);
add_function("texture3D",
@@ -1911,7 +1866,7 @@ builtin_builder::create_builtins()
NULL);
add_function("textureCubeLod",
- _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
+ _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
NULL);
add_function("texture2DRect",
@@ -2163,12 +2118,6 @@ builtin_builder::create_builtins()
F(dFdx)
F(dFdy)
F(fwidth)
- F(dFdxCoarse)
- F(dFdyCoarse)
- F(fwidthCoarse)
- F(dFdxFine)
- F(dFdyFine)
- F(fwidthFine)
F(noise1)
F(noise2)
F(noise3)
@@ -2219,24 +2168,6 @@ 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",
@@ -2626,7 +2557,8 @@ builtin_builder::call(ir_function *f, ir_variable *ret, exec_list params)
{
exec_list actual_params;
- foreach_in_list(ir_variable, var, &params) {
+ foreach_list(node, &params) {
+ ir_variable *var = (ir_variable *) node;
actual_params.push_tail(var_ref(var));
}
@@ -2685,7 +2617,11 @@ builtin_builder::_atan2(const glsl_type *type)
ir_factory outer_then(&outer_if->then_instructions, mem_ctx);
/* Then...call atan(y/x) */
- do_atan(body, glsl_type::float_type, r, div(y, x));
+ ir_variable *y_over_x = outer_then.make_temp(glsl_type::float_type, "y_over_x");
+ outer_then.emit(assign(y_over_x, div(y, x)));
+ outer_then.emit(assign(r, mul(y_over_x, rsq(add(mul(y_over_x, y_over_x),
+ imm(1.0f))))));
+ outer_then.emit(assign(r, asin_expr(r)));
/* ...and fix it up: */
ir_if *inner_if = new(mem_ctx) ir_if(less(x, imm(0.0f)));
@@ -2708,65 +2644,17 @@ builtin_builder::_atan2(const glsl_type *type)
return sig;
}
-void
-builtin_builder::do_atan(ir_factory &body, const glsl_type *type, ir_variable *res, operand y_over_x)
-{
- /*
- * range-reduction, first step:
- *
- * / y_over_x if |y_over_x| <= 1.0;
- * x = <
- * \ 1.0 / y_over_x otherwise
- */
- ir_variable *x = body.make_temp(type, "atan_x");
- body.emit(assign(x, div(min2(abs(y_over_x),
- imm(1.0f)),
- max2(abs(y_over_x),
- imm(1.0f)))));
-
- /*
- * approximate atan by evaluating polynomial:
- *
- * x * 0.9999793128310355 - x^3 * 0.3326756418091246 +
- * x^5 * 0.1938924977115610 - x^7 * 0.1173503194786851 +
- * x^9 * 0.0536813784310406 - x^11 * 0.0121323213173444
- */
- ir_variable *tmp = body.make_temp(type, "atan_tmp");
- body.emit(assign(tmp, mul(x, x)));
- body.emit(assign(tmp, mul(add(mul(sub(mul(add(mul(sub(mul(add(mul(imm(-0.0121323213173444f),
- tmp),
- imm(0.0536813784310406f)),
- tmp),
- imm(0.1173503194786851f)),
- tmp),
- imm(0.1938924977115610f)),
- tmp),
- imm(0.3326756418091246f)),
- tmp),
- imm(0.9999793128310355f)),
- x)));
-
- /* range-reduction fixup */
- body.emit(assign(tmp, add(tmp,
- mul(b2f(greater(abs(y_over_x),
- imm(1.0f, type->components()))),
- add(mul(tmp,
- imm(-2.0f)),
- imm(M_PI_2f))))));
-
- /* sign fixup */
- body.emit(assign(res, mul(tmp, sign(y_over_x))));
-}
-
ir_function_signature *
builtin_builder::_atan(const glsl_type *type)
{
ir_variable *y_over_x = in_var(type, "y_over_x");
MAKE_SIG(type, always_available, 1, y_over_x);
- ir_variable *tmp = body.make_temp(type, "tmp");
- do_atan(body, type, tmp, y_over_x);
- body.emit(ret(tmp));
+ ir_variable *t = body.make_temp(type, "t");
+ body.emit(assign(t, mul(y_over_x, rsq(add(mul(y_over_x, y_over_x),
+ imm(1.0f))))));
+
+ body.emit(ret(asin_expr(t)));
return sig;
}
@@ -3984,28 +3872,7 @@ builtin_builder::_EmitVertex()
{
MAKE_SIG(glsl_type::void_type, gs_only, 0);
- ir_rvalue *stream = new(mem_ctx) ir_constant(0, 1);
- body.emit(new(mem_ctx) ir_emit_vertex(stream));
-
- return sig;
-}
-
-ir_function_signature *
-builtin_builder::_EmitStreamVertex(builtin_available_predicate avail,
- const glsl_type *stream_type)
-{
- /* Section 8.12 (Geometry Shader Functions) of the GLSL 4.0 spec says:
- *
- * "Emit the current values of output variables to the current output
- * primitive on stream stream. The argument to stream must be a constant
- * integral expression."
- */
- ir_variable *stream =
- new(mem_ctx) ir_variable(stream_type, "stream", ir_var_const_in);
-
- MAKE_SIG(glsl_type::void_type, avail, 1, stream);
-
- body.emit(new(mem_ctx) ir_emit_vertex(var_ref(stream)));
+ body.emit(new(mem_ctx) ir_emit_vertex());
return sig;
}
@@ -4015,28 +3882,7 @@ builtin_builder::_EndPrimitive()
{
MAKE_SIG(glsl_type::void_type, gs_only, 0);
- ir_rvalue *stream = new(mem_ctx) ir_constant(0, 1);
- body.emit(new(mem_ctx) ir_end_primitive(stream));
-
- return sig;
-}
-
-ir_function_signature *
-builtin_builder::_EndStreamPrimitive(builtin_available_predicate avail,
- const glsl_type *stream_type)
-{
- /* Section 8.12 (Geometry Shader Functions) of the GLSL 4.0 spec says:
- *
- * "Completes the current output primitive on stream stream and starts
- * a new one. The argument to stream must be a constant integral
- * expression."
- */
- ir_variable *stream =
- new(mem_ctx) ir_variable(stream_type, "stream", ir_var_const_in);
-
- MAKE_SIG(glsl_type::void_type, avail, 1, stream);
-
- body.emit(new(mem_ctx) ir_end_primitive(var_ref(stream)));
+ body.emit(new(mem_ctx) ir_end_primitive());
return sig;
}
@@ -4075,11 +3921,7 @@ builtin_builder::_textureQueryLevels(const glsl_type *sampler_type)
}
UNOP(dFdx, ir_unop_dFdx, fs_oes_derivatives)
-UNOP(dFdxCoarse, ir_unop_dFdx_coarse, fs_derivative_control)
-UNOP(dFdxFine, ir_unop_dFdx_fine, fs_derivative_control)
UNOP(dFdy, ir_unop_dFdy, fs_oes_derivatives)
-UNOP(dFdyCoarse, ir_unop_dFdy_coarse, fs_derivative_control)
-UNOP(dFdyFine, ir_unop_dFdy_fine, fs_derivative_control)
ir_function_signature *
builtin_builder::_fwidth(const glsl_type *type)
@@ -4093,30 +3935,6 @@ builtin_builder::_fwidth(const glsl_type *type)
}
ir_function_signature *
-builtin_builder::_fwidthCoarse(const glsl_type *type)
-{
- ir_variable *p = in_var(type, "p");
- MAKE_SIG(type, fs_derivative_control, 1, p);
-
- body.emit(ret(add(abs(expr(ir_unop_dFdx_coarse, p)),
- abs(expr(ir_unop_dFdy_coarse, p)))));
-
- return sig;
-}
-
-ir_function_signature *
-builtin_builder::_fwidthFine(const glsl_type *type)
-{
- ir_variable *p = in_var(type, "p");
- MAKE_SIG(type, fs_derivative_control, 1, p);
-
- body.emit(ret(add(abs(expr(ir_unop_dFdx_fine, p)),
- abs(expr(ir_unop_dFdy_fine, p)))));
-
- return sig;
-}
-
-ir_function_signature *
builtin_builder::_noise1(const glsl_type *type)
{
return unop(v110, ir_unop_noise, glsl_type::float_type, type);
@@ -4383,44 +4201,6 @@ builtin_builder::_mulExtended(const glsl_type *type)
}
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)
{
ir_variable *counter = in_var(glsl_type::atomic_uint_type, "counter");
@@ -4510,11 +4290,9 @@ builtin_builder::_image_prototype(const glsl_type *image_type,
sig->parameters.push_tail(in_var(glsl_type::int_type, "sample"));
/* Data arguments. */
- for (unsigned i = 0; i < num_arguments; ++i) {
- char *arg_name = ralloc_asprintf(NULL, "arg%d", i);
- sig->parameters.push_tail(in_var(data_type, arg_name));
- ralloc_free(arg_name);
- }
+ for (unsigned i = 0; i < num_arguments; ++i)
+ sig->parameters.push_tail(in_var(data_type,
+ ralloc_asprintf(NULL, "arg%d", i)));
/* Set the maximal set of qualifiers allowed for this image
* built-in. Function calls with arguments having fewer
@@ -4523,11 +4301,11 @@ builtin_builder::_image_prototype(const glsl_type *image_type,
* accept everything that needs to be accepted, and reject cases
* like loads from write-only or stores to read-only images.
*/
- image->data.image_read_only = (flags & IMAGE_FUNCTION_READ_ONLY) != 0;
- image->data.image_write_only = (flags & IMAGE_FUNCTION_WRITE_ONLY) != 0;
- image->data.image_coherent = true;
- image->data.image_volatile = true;
- image->data.image_restrict = true;
+ image->data.image.read_only = flags & IMAGE_FUNCTION_READ_ONLY;
+ image->data.image.write_only = flags & IMAGE_FUNCTION_WRITE_ONLY;
+ image->data.image.coherent = true;
+ image->data.image._volatile = true;
+ image->data.image.restrict_flag = true;
return sig;
}