[Mesa-dev] Mesa (shader-work): glsl: add pass to lower variable array indexing to conditional assignments
Luca Barbieri
luca at luca-barbieri.com
Mon Sep 13 18:45:22 PDT 2010
> I think you forgot to include this file in this commit.
Yes, sorry.
> This is one that I was going to give some review comments on. I really
> want to have this change in 7.9, but the patch is going to need some
> changes. When we first discussed using C++ in the GLSL compiler in
> Mesa, we got some feedback about C++ features not to use. The main ones
> on the list are:
>
> - RTTI
> - Operator overloading
> - Multiple / virtual inheritance
> - Templates
I would suggest to avoid banning any feature, and instead allow all of
them (in C++03 + TR1, until we decide that C++0x is OK too) and decide
in each instance whether it is being used appropriately or not.
That said, I removed both templates and operator overloading from the pass.
Note that templates are often essential to write generic code and
build collection classes.
Also, I think you should start using the STL: there are several parts
of the compilers that could use a std::map or std::unordered_map and
are doing linear scans instead, resulting in potential catastrophic
slowdown in pathological cases (e.g. finding induction variables).
exec_node and exec_list should also take template parameters for the
next/prev pointers: this would make the code more type-safe.
RTTI is probably a better replacement for the as_IR_TYPE() functions:
they can be written as dynamic_cast<IR_TYPE*>(foo) instead, or
&dynamic_cast<IR_TYPE&>(*foo) if you want an exception on failure.
Operator overloading can be essential in the places where it is
natural (e.g. defining a type that can hold all possible numeric types
of a language).
Overloading the call operator avoids needing to introduce an
unnecessary function name.
Multiple / virtual inheritance is indeed best to use rarely: I can't
think of any use of it in the current compiler.
Exceptions are another possible "contentious" feature.
> Based on my memory of the code, it should be pretty easy to eliminate
> the use of templates.
Yes, it's trivial, since the current code always uses the same
parameter, and I did it in the current committed code. I also removed
operator overloading.
The best long-term solution would however be to add an ir_switch node
and put the "switch_generator" code in a lowering pass for it.
Recent version of GLSL have a switch construct anyway.
Note that the current switch_generator only handles sequential cases
and would need to be extended to non-sequential ones.
This is nontrivial if empty fallthroughs are allowed because binary
search doesn't always work (e.g. case 1: case 3: a(); break; case 2:
b(); break).
More information about the mesa-dev
mailing list