[Mesa-dev] [PATCH 1/6] glsl: When constructing a variable with an interface type, set interface_type

Paul Berry stereotype441 at gmail.com
Fri Oct 18 21:17:16 CEST 2013


On 11 October 2013 11:18, Ian Romanick <idr at freedesktop.org> wrote:

> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Ever since the addition of interface blocks with instance names, we have
> had an implicit invariant:
>
>     var->type->is_interface() == (var->type == var->interface_type)
>
> A similar invariant exists if var->type->fields.array->is_interface().
>

Can we please spell this out in more detail?  As written, it seems to be
implying that the following two invariants both hold simultaneously:

var->type->is_interface() == (var->type == var->interface_type)
AND
var->type->fields.array->is_interface() == ...

Which is impossible because you can't access "fields.array" of an interface
type.

I think the invariant you mean is something like this:

If var->type->is_interface(), then var->interface_type == var->type.
If var->type->is_array() and var->type->fields.array->is_interface(), then
var->interface_type == var->type->fields.array.

With that fixed, this patch is:

Reviewed-by: Paul Berry <stereotype441 at gmail.com>


>
>
> However, the ir_variable constructor doesn't maintain either invariant.
> That seems kind of silly... and I tripped over it while writing some
> other code.  This patch makes the constructor do the right thing, and it
> introduces some tests to verify that behavior.
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/glsl/Makefile.am               | 16 +++++++
>  src/glsl/ast_to_hir.cpp            |  1 -
>  src/glsl/builtin_variables.cpp     |  1 -
>  src/glsl/ir.cpp                    | 11 ++++-
>  src/glsl/tests/general_ir_test.cpp | 89
> ++++++++++++++++++++++++++++++++++++++
>  5 files changed, 114 insertions(+), 4 deletions(-)
>  create mode 100644 src/glsl/tests/general_ir_test.cpp
>
> diff --git a/src/glsl/Makefile.am b/src/glsl/Makefile.am
> index cbf253c..f43f49d 100644
> --- a/src/glsl/Makefile.am
> +++ b/src/glsl/Makefile.am
> @@ -32,6 +32,7 @@ AM_CXXFLAGS = $(VISIBILITY_CXXFLAGS)
>  include Makefile.sources
>
>  TESTS = glcpp/tests/glcpp-test                         \
> +       tests/general-ir-test                           \
>         tests/optimization-test                         \
>         tests/ralloc-test                               \
>         tests/sampler-types-test                        \
> @@ -45,12 +46,27 @@ noinst_LTLIBRARIES = libglsl.la libglcpp.la
>  check_PROGRAMS =                                       \
>         glcpp/glcpp                                     \
>         glsl_test                                       \
> +       tests/general-ir-test                           \
>         tests/ralloc-test                               \
>         tests/sampler-types-test                        \
>         tests/uniform-initializer-test
>
>  noinst_PROGRAMS = glsl_compiler
>
> +tests_general_ir_test_SOURCES =                \
> +       $(top_srcdir)/src/mesa/main/hash_table.c        \
> +       $(top_srcdir)/src/mesa/main/imports.c           \
> +       $(top_srcdir)/src/mesa/program/prog_hash_table.c\
> +       $(top_srcdir)/src/mesa/program/symbol_table.c   \
> +       $(GLSL_SRCDIR)/standalone_scaffolding.cpp \
> +       tests/general_ir_test.cpp
> +tests_general_ir_test_CFLAGS =                         \
> +       $(PTHREAD_CFLAGS)
> +tests_general_ir_test_LDADD =                          \
> +       $(top_builddir)/src/gtest/libgtest.la           \
> +       $(top_builddir)/src/glsl/libglsl.la             \
> +       $(PTHREAD_LIBS)
> +
>  tests_uniform_initializer_test_SOURCES =               \
>         $(top_srcdir)/src/mesa/main/hash_table.c        \
>         $(top_srcdir)/src/mesa/main/imports.c           \
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index dfa32d9..b644b22 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -4876,7 +4876,6 @@ ast_interface_block::hir(exec_list *instructions,
>                                        var_mode);
>        }
>
> -      var->init_interface_type(block_type);
>        if (state->target == geometry_shader && var_mode ==
> ir_var_shader_in)
>           handle_geometry_shader_input_decl(state, loc, var);
>
> diff --git a/src/glsl/builtin_variables.cpp
> b/src/glsl/builtin_variables.cpp
> index ae0a03f..9d78b2e 100644
> --- a/src/glsl/builtin_variables.cpp
> +++ b/src/glsl/builtin_variables.cpp
> @@ -858,7 +858,6 @@ builtin_variable_generator::generate_varyings()
>           this->per_vertex_in.construct_interface_instance();
>        ir_variable *var = add_variable("gl_in", array(per_vertex_in_type,
> 0),
>                                        ir_var_shader_in, -1);
> -      var->init_interface_type(per_vertex_in_type);
>     }
>     if (state->target == vertex_shader || state->target ==
> geometry_shader) {
>        const glsl_type *per_vertex_out_type =
> diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
> index de9613e..54a8e40 100644
> --- a/src/glsl/ir.cpp
> +++ b/src/glsl/ir.cpp
> @@ -1603,8 +1603,15 @@ ir_variable::ir_variable(const struct glsl_type
> *type, const char *name,
>     this->depth_layout = ir_depth_layout_none;
>     this->used = false;
>
> -   if (type && type->base_type == GLSL_TYPE_SAMPLER)
> -      this->read_only = true;
> +   if (type != NULL) {
> +      if (type->base_type == GLSL_TYPE_SAMPLER)
> +         this->read_only = true;
> +
> +      if (type->is_interface())
> +         this->init_interface_type(type);
> +      else if (type->is_array() && type->fields.array->is_interface())
> +         this->init_interface_type(type->fields.array);
> +   }
>  }
>
>

> diff --git a/src/glsl/tests/general_ir_test.cpp
> b/src/glsl/tests/general_ir_test.cpp
> new file mode 100644
> index 0000000..862fa19
> --- /dev/null
> +++ b/src/glsl/tests/general_ir_test.cpp
> @@ -0,0 +1,89 @@
> +/*
> + * Copyright © 2013 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.
> + */
> +#include <gtest/gtest.h>
> +#include "main/compiler.h"
> +#include "main/mtypes.h"
> +#include "main/macros.h"
> +#include "ralloc.h"
> +#include "ir.h"
> +
> +TEST(ir_variable_constructor, interface)
> +{
> +   void *mem_ctx = ralloc_context(NULL);
> +
> +   static const glsl_struct_field f[] = {
> +      {
> +         glsl_type::vec(4),
> +         "v",
> +         false
> +      }
> +   };
> +
> +   const glsl_type *const interface =
> +      glsl_type::get_interface_instance(f,
> +                                        ARRAY_SIZE(f),
> +                                        GLSL_INTERFACE_PACKING_STD140,
> +                                        "simple_interface");
> +
> +   static const char name[] = "named_instance";
> +
> +   ir_variable *const v =
> +      new(mem_ctx) ir_variable(interface, name, ir_var_uniform);
> +
> +   EXPECT_STREQ(name, v->name);
> +   EXPECT_NE(name, v->name);
> +   EXPECT_EQ(interface, v->type);
> +   EXPECT_EQ(interface, v->get_interface_type());
> +}
> +
> +TEST(ir_variable_constructor, interface_array)
> +{
> +   void *mem_ctx = ralloc_context(NULL);
> +
> +   static const glsl_struct_field f[] = {
> +      {
> +         glsl_type::vec(4),
> +         "v",
> +         false
> +      }
> +   };
> +
> +   const glsl_type *const interface =
> +      glsl_type::get_interface_instance(f,
> +                                        ARRAY_SIZE(f),
> +                                        GLSL_INTERFACE_PACKING_STD140,
> +                                        "simple_interface");
> +
> +   const glsl_type *const interface_array =
> +      glsl_type::get_array_instance(interface, 2);
> +
> +   static const char name[] = "array_instance";
> +
> +   ir_variable *const v =
> +      new(mem_ctx) ir_variable(interface_array, name, ir_var_uniform);
> +
> +   EXPECT_STREQ(name, v->name);
> +   EXPECT_NE(name, v->name);
> +   EXPECT_EQ(interface_array, v->type);
> +   EXPECT_EQ(interface, v->get_interface_type());
> +}
> --
> 1.8.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131018/76ab51c1/attachment.html>


More information about the mesa-dev mailing list