On Mon, Nov 30, 2015 at 7:15 PM, Matt Turner <[email protected]> wrote: > On Mon, Nov 30, 2015 at 3:51 PM, Ilia Mirkin <[email protected]> wrote: >> On Mon, Nov 30, 2015 at 6:38 PM, Matt Turner <[email protected]> wrote: >>> On Mon, Nov 30, 2015 at 3:34 PM, Ilia Mirkin <[email protected]> wrote: >>>> On Mon, Nov 30, 2015 at 6:32 PM, Matt Turner <[email protected]> wrote: >>>>> --- >>>>> src/glsl/builtin_functions.cpp | 15 ++++++++++++++- >>>>> 1 file changed, 14 insertions(+), 1 deletion(-) >>>>> >>>>> diff --git a/src/glsl/builtin_functions.cpp >>>>> b/src/glsl/builtin_functions.cpp >>>>> index 88f9a71..2f21ffc 100644 >>>>> --- a/src/glsl/builtin_functions.cpp >>>>> +++ b/src/glsl/builtin_functions.cpp >>>>> @@ -538,6 +538,7 @@ private: >>>>> ir_variable *in_var(const glsl_type *type, const char *name); >>>>> ir_variable *out_var(const glsl_type *type, const char *name); >>>>> ir_constant *imm(float f, unsigned vector_elements=1); >>>>> + ir_constant *imm(bool b, unsigned vector_elements=1); >>>>> ir_constant *imm(int i, unsigned vector_elements=1); >>>>> ir_constant *imm(unsigned u, unsigned vector_elements=1); >>>>> ir_constant *imm(double d, unsigned vector_elements=1); >>>>> @@ -3000,6 +3001,12 @@ builtin_builder::out_var(const glsl_type *type, >>>>> const char *name) >>>>> } >>>>> >>>>> ir_constant * >>>>> +builtin_builder::imm(bool b, unsigned vector_elements) >>>>> +{ >>>>> + return new(mem_ctx) ir_constant(b, vector_elements); >>>>> +} >>>>> + >>>>> +ir_constant * >>>>> builtin_builder::imm(float f, unsigned vector_elements) >>>>> { >>>>> return new(mem_ctx) ir_constant(f, vector_elements); >>>>> @@ -4358,7 +4365,13 @@ >>>>> builtin_builder::_notEqual(builtin_available_predicate avail, >>>>> ir_function_signature * >>>>> builtin_builder::_any(const glsl_type *type) >>>>> { >>>>> - return unop(always_available, ir_unop_any, glsl_type::bool_type, >>>>> type); >>>>> + ir_variable *v = in_var(type, "v"); >>>>> + MAKE_SIG(glsl_type::bool_type, always_available, 1, v); >>>>> + >>>>> + const unsigned vec_elem = v->type->vector_elements; >>>>> + body.emit(ret(expr(ir_binop_any_nequal, v, imm(false, vec_elem)))); >>>> >>>> This results in an extra comparison generated by the st_glsl_to_tgsi >>>> code, which can be annoying to get rid of... Why do you need to do >>>> this? >>> >>> Couldn't we fix the st_glsl_to_tgsi to handle that better? I wouldn't >>> be surprised to find such a thing in the wild. >> >> I guess it could special-case the exact IR generated there? The thing >> is that it just OR's everything together (when you have native integer >> support... which everything does outside of r300/nv30), which you can >> only do in a few select cases. If you'd like to implement that, I >> wouldn't object. As-is, it's a pessimization though. > > I'm not familiar with any of this code and I don't know how to test or > debug it -- sorry. > > It should be trivial to optimize if someone cares. I believe all you > need to do is skip emitting the SNE and instead copy src[0] to temp > under these circumstances: > > if (ir->operands[0]->type == glsl_type::bool_type && > ir->operands[1]->as_constant() && > ir->operands[1]->as_constant()->is_zero())
As long as you can build the gallium swrast (and enable debug), you can add ST_DEBUG=tgsi to get the generated TGSI printed out. -ilia _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
