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

Ian Romanick idr at freedesktop.org
Mon Dec 19 22:33:12 UTC 2016


On 12/18/2016 10:09 PM, Timothy Arceri wrote:
> 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.

I believe you are correct.  I'll change that.

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



More information about the mesa-dev mailing list