[Mesa-dev] [PATCH v3 06/13] mesa/st/glsl_to_tgsi: Add class to track array live range

Nicolai Hähnle nhaehnle at gmail.com
Tue May 1 10:32:54 UTC 2018


On 28.04.2018 21:30, Gert Wollny wrote:
> todo explain

Indeed... how is that different from the tracking of ordinary registers?

Cheers,
Nicolai


> 
> Signed-off-by: Gert Wollny <gw.fossdev at gmail.com>
> ---
>   .../state_tracker/st_glsl_to_tgsi_array_merge.cpp  | 69 ++++++++++++++++++++++
>   .../state_tracker/st_glsl_to_tgsi_array_merge.h    | 46 +++++++++++++++
>   2 files changed, 115 insertions(+)
> 
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi_array_merge.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi_array_merge.cpp
> index 52d0d81796..89b9bf66d4 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi_array_merge.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi_array_merge.cpp
> @@ -37,6 +37,75 @@ using std::unique_ptr;
>   using std::make_unique;
>   #endif
>   
> +
> +array_live_range::array_live_range():
> +   id(0),
> +   length(0),
> +   first_access(0),
> +   last_access(0),
> +   component_access_mask(0),
> +   used_component_count(0)
> +{
> +}
> +
> +array_live_range::array_live_range(unsigned aid, unsigned alength):
> +   id(aid),
> +   length(alength),
> +   first_access(0),
> +   last_access(0),
> +   component_access_mask(0),
> +   used_component_count(0)
> +{
> +}
> +
> +array_live_range::array_live_range(unsigned aid, unsigned alength, int begin,
> +                               int end, int sw):
> +   id(aid),
> +   length(alength),
> +   first_access(begin),
> +   last_access(end),
> +   component_access_mask(sw),
> +   used_component_count(util_bitcount(sw))
> +{
> +}
> +
> +void array_live_range::set_live_range(int _begin, int _end)
> +{
> +   set_begin(_begin);
> +   set_end(_end);
> +}
> +
> +void array_live_range::set_access_mask(int mask)
> +{
> +   component_access_mask = mask;
> +   used_component_count = util_bitcount(mask);
> +}
> +
> +void array_live_range::merge_live_range(const array_live_range &other)
> +{
> +   if (other.begin() < first_access)
> +      first_access = other.begin();
> +   if (other.end() > last_access)
> +      last_access = other.end();
> +}
> +
> +void array_live_range::print(std::ostream& os) const
> +{
> +   os << "[id:" << id
> +      << ", length:" << length
> +      << ", (b:" << first_access
> +      << ", e:" << last_access
> +      << "), sw:" << component_access_mask
> +      << ", nc:" << used_component_count
> +      << "]";
> +}
> +
> +bool array_live_range::time_doesnt_overlap(const array_live_range& other) const
> +{
> +   return (other.last_access < first_access ||
> +           last_access < other.first_access);
> +}
> +
>   namespace tgsi_array_merge {
>   
>   array_remapping::array_remapping():
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi_array_merge.h b/src/mesa/state_tracker/st_glsl_to_tgsi_array_merge.h
> index c74c854e09..b9fb498e69 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi_array_merge.h
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi_array_merge.h
> @@ -27,6 +27,52 @@
>   #include "st_glsl_to_tgsi_private.h"
>   #include <iosfwd>
>   
> +/* Helper class to evaluate the required live range of an array.
> + *
> + * For arrays not only the live range must be tracked, but also the arrays
> + * length and since we want to interleave arrays, we also track an access mask.
> + * Consequently, one array can be merged into another or interleaved with
> + * another only if the target array is longer.
> + */
> +class array_live_range {
> +public:
> +   array_live_range();
> +   array_live_range(unsigned aid, unsigned alength);
> +   array_live_range(unsigned aid, unsigned alength, int first_access,
> +                  int last_access, int mask);
> +
> +   void set_live_range(int first_access, int last_access);
> +   void set_begin(int _begin){first_access = _begin;}
> +   void set_end(int _end){last_access = _end;}
> +   void set_access_mask(int s);
> +   void merge_live_range(const array_live_range& other);
> +
> +   unsigned array_id() const {return id;}
> +   int array_length() const { return length;}
> +   int begin() const { return first_access;}
> +   int end() const { return last_access;}
> +   int access_mask() const { return component_access_mask;}
> +   int used_components() const {return used_component_count;}
> +
> +   bool time_doesnt_overlap(const array_live_range& other) const;
> +
> +   void print(std::ostream& os) const;
> +
> +private:
> +   unsigned id;
> +   unsigned length;
> +   int first_access;
> +   int last_access;
> +   int component_access_mask;
> +   int used_component_count;
> +};
> +
> +inline
> +std::ostream& operator << (std::ostream& os, const array_live_range& lt) {
> +   lt.print(os);
> +   return os;
> +}
> +
>   namespace tgsi_array_merge {
>   
>   /* Helper class to merge and interleave arrays.
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list