[Mesa-dev] [PATCH 04/19] glsl: Use simpler visitor to determine which UBO and SSBO blocks are used

Timothy Arceri timothy.arceri at collabora.com
Mon Dec 19 06:09:26 UTC 2016


On Thu, 2016-12-15 at 20:10 -0800, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> Very soon this visitor will get more complicated.  The users of the
> existing ir_variable_refcount visitor won't need the coming
> functionality, and this use doesn't need much of the functionality of
> ir_variable_refcount.
> 
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Cc: mesa-stable at lists.freedesktop.org
> ---
>  src/compiler/Makefile.sources           |   2 +
>  src/compiler/glsl/ir_array_refcount.cpp | 100
> ++++++++++++++++++++++++++++++++
>  src/compiler/glsl/ir_array_refcount.h   |  65 +++++++++++++++++++++
>  src/compiler/glsl/link_uniforms.cpp     |  10 ++--
>  4 files changed, 172 insertions(+), 5 deletions(-)
>  create mode 100644 src/compiler/glsl/ir_array_refcount.cpp
>  create mode 100644 src/compiler/glsl/ir_array_refcount.h
> 
> diff --git a/src/compiler/Makefile.sources
> b/src/compiler/Makefile.sources
> index 17b15de..15f410f 100644
> --- a/src/compiler/Makefile.sources
> +++ b/src/compiler/Makefile.sources
> @@ -29,6 +29,8 @@ LIBGLSL_FILES = \
>  	glsl/glsl_to_nir.cpp \
>  	glsl/glsl_to_nir.h \
>  	glsl/hir_field_selection.cpp \
> +	glsl/ir_array_refcount.cpp \
> +	glsl/ir_array_refcount.h \
>  	glsl/ir_basic_block.cpp \
>  	glsl/ir_basic_block.h \
>  	glsl/ir_builder.cpp \
> diff --git a/src/compiler/glsl/ir_array_refcount.cpp
> b/src/compiler/glsl/ir_array_refcount.cpp
> new file mode 100644
> index 0000000..41a0914
> --- /dev/null
> +++ b/src/compiler/glsl/ir_array_refcount.cpp
> @@ -0,0 +1,100 @@
> +/*
> + * Copyright © 2016 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person
> obtaining a
> + * copy of this software and associated documentation files (the
> "Software"),
> + * to deal in the Software without restriction, including without
> limitation
> + * the rights to use, copy, modify, merge, publish, distribute,
> sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom
> the
> + * Software is furnished to do so, subject to the following
> conditions:
> + *
> + * The above copyright notice and this permission notice (including
> the next
> + * paragraph) shall be included in all copies or substantial
> portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO
> EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
> OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> OTHER
> + * DEALINGS IN THE SOFTWARE.
> + */
> +
> +/**
> + * \file ir_array_refcount.cpp
> + *
> + * Provides a visitor which produces a list of variables referenced.
> + */
> +
> +#include "ir.h"
> +#include "ir_visitor.h"
> +#include "ir_array_refcount.h"
> +#include "compiler/glsl_types.h"
> +#include "util/hash_table.h"
> +
> +ir_array_refcount_visitor::ir_array_refcount_visitor()
> +{
> +   this->mem_ctx = ralloc_context(NULL);
> +   this->ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
> +                                      _mesa_key_pointer_equal);
> +}
> +
> +static void
> +free_entry(struct hash_entry *entry)
> +{
> +   ir_array_refcount_entry *ivre = (ir_array_refcount_entry *)
> entry->data;
> +   delete ivre;
> +}
> +
> +ir_array_refcount_visitor::~ir_array_refcount_visitor()
> +{
> +   ralloc_free(this->mem_ctx);
> +   _mesa_hash_table_destroy(this->ht, free_entry);
> +}
> +
> +ir_array_refcount_entry::ir_array_refcount_entry(ir_variable *var)
> +   : var(var), is_referenced(false)
> +{
> +   /* empty */
> +}
> +
> +
> +ir_array_refcount_entry *
> +ir_array_refcount_visitor::get_variable_entry(ir_variable *var)
> +{
> +   assert(var);
> +
> +   struct hash_entry *e = _mesa_hash_table_search(this->ht, var);
> +   if (e)
> +      return (ir_array_refcount_entry *)e->data;
> +
> +   ir_array_refcount_entry *entry = new
> ir_array_refcount_entry(var);
> +   _mesa_hash_table_insert(this->ht, var, entry);
> +
> +   return entry;
> +}
> +
> +
> +ir_visitor_status
> +ir_array_refcount_visitor::visit(ir_dereference_variable *ir)
> +{
> +   ir_variable *const var = ir->variable_referenced();
> +   ir_array_refcount_entry *entry = this->get_variable_entry(var);
> +
> +   if (entry)

I don't think this can ever be not true. maybe just assert(entry). If
new fails it will throw an exception rather than return null as far as
I understand.

Otherwise seems fine:

Reviewed-by: Timothy Arceri <timothy.arceri at collabora.com>

> +      entry->is_referenced = true;
> +
> +   return visit_continue;
> +}
> +
> +
> +ir_visitor_status
> +ir_array_refcount_visitor::visit_enter(ir_function_signature *ir)
> +{
> +   /* We don't want to descend into the function parameters and
> +    * dead-code eliminate them, so just accept the body here.
> +    */
> +   visit_list_elements(this, &ir->body);
> +   return visit_continue_with_parent;
> +}
> diff --git a/src/compiler/glsl/ir_array_refcount.h
> b/src/compiler/glsl/ir_array_refcount.h
> new file mode 100644
> index 0000000..9ec46d2
> --- /dev/null
> +++ b/src/compiler/glsl/ir_array_refcount.h
> @@ -0,0 +1,65 @@
> +/*
> + * Copyright © 2016 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person
> obtaining a
> + * copy of this software and associated documentation files (the
> "Software"),
> + * to deal in the Software without restriction, including without
> limitation
> + * the rights to use, copy, modify, merge, publish, distribute,
> sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom
> the
> + * Software is furnished to do so, subject to the following
> conditions:
> + *
> + * The above copyright notice and this permission notice (including
> the next
> + * paragraph) shall be included in all copies or substantial
> portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO
> EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
> OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> OTHER
> + * DEALINGS IN THE SOFTWARE.
> + */
> +
> +/**
> + * \file ir_array_refcount.h
> + *
> + * Provides a visitor which produces a list of variables referenced.
> + */
> +
> +#include "ir.h"
> +#include "ir_visitor.h"
> +#include "compiler/glsl_types.h"
> +
> +class ir_array_refcount_entry
> +{
> +public:
> +   ir_array_refcount_entry(ir_variable *var);
> +
> +   ir_variable *var; /* The key: the variable's pointer. */
> +
> +   /** Has the variable been referenced? */
> +   bool is_referenced;
> +};
> +
> +class ir_array_refcount_visitor : public ir_hierarchical_visitor {
> +public:
> +   ir_array_refcount_visitor(void);
> +   ~ir_array_refcount_visitor(void);
> +
> +   virtual ir_visitor_status visit(ir_dereference_variable *);
> +
> +   virtual ir_visitor_status visit_enter(ir_function_signature *);
> +
> +   /**
> +    * Find variable in the hash table, and insert it if not present
> +    */
> +   ir_array_refcount_entry *get_variable_entry(ir_variable *var);
> +
> +   /**
> +    * Hash table mapping ir_variable to ir_array_refcount_entry.
> +    */
> +   struct hash_table *ht;
> +
> +   void *mem_ctx;
> +};
> diff --git a/src/compiler/glsl/link_uniforms.cpp
> b/src/compiler/glsl/link_uniforms.cpp
> index dd6336e..2f851ce 100644
> --- a/src/compiler/glsl/link_uniforms.cpp
> +++ b/src/compiler/glsl/link_uniforms.cpp
> @@ -28,7 +28,7 @@
>  #include "glsl_symbol_table.h"
>  #include "program.h"
>  #include "util/string_to_uint_map.h"
> -#include "ir_variable_refcount.h"
> +#include "ir_array_refcount.h"
>  
>  /**
>   * \file link_uniforms.cpp
> @@ -868,11 +868,11 @@ public:
>  };
>  
>  static bool
> -variable_is_referenced(ir_variable_refcount_visitor &v, ir_variable
> *var)
> +variable_is_referenced(ir_array_refcount_visitor &v, ir_variable
> *var)
>  {
> -   ir_variable_refcount_entry *const entry =
> v.get_variable_entry(var);
> +   ir_array_refcount_entry *const entry = v.get_variable_entry(var);
>  
> -   return entry->referenced_count > 0;
> +   return entry->is_referenced;
>  
>  }
>  
> @@ -886,7 +886,7 @@ static void
>  link_update_uniform_buffer_variables(struct gl_linked_shader
> *shader,
>                                       unsigned stage)
>  {
> -   ir_variable_refcount_visitor v;
> +   ir_array_refcount_visitor v;
>  
>     v.run(shader->ir);
>  


More information about the mesa-dev mailing list