diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2015-02-20 22:51:21 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2015-02-20 22:51:21 +0000 |
commit | e6e3394a78b6d19474b3aea1458d8718d19d8325 (patch) | |
tree | fe92a58246a2181ba1459d22b92fbfc629b3cbb9 /dist/Mesa/src/glsl/builtin_functions.cpp | |
parent | 8bb43317c5713539f43fcdcb25a30cf59aa981d6 (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.cpp | 274 |
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, ¶ms) { + foreach_list(node, ¶ms) { + 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; } |