Set the type of ir_texture properly; infer it from the sampler type.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 3 Jun 2010 22:07:34 +0000 (15:07 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 9 Jun 2010 18:14:57 +0000 (11:14 -0700)
builtin_types.h
glsl_types.h
ir.cpp
ir.h
ir_reader.cpp

index 148917e0dcff3f0efe1cc7c5c1220fd24d26584b..41ce5d218960da5fa57f108043fede1ca9566464 100644 (file)
@@ -65,6 +65,7 @@ static const struct glsl_type builtin_core_types[] = {
 
 const glsl_type *const glsl_type::bool_type  = & builtin_core_types[0];
 const glsl_type *const glsl_type::int_type   = & builtin_core_types[4];
+const glsl_type *const glsl_type::ivec4_type = & builtin_core_types[7];
 const glsl_type *const glsl_type::float_type = & builtin_core_types[8];
 const glsl_type *const glsl_type::vec2_type = & builtin_core_types[9];
 const glsl_type *const glsl_type::vec3_type = & builtin_core_types[10];
@@ -230,6 +231,7 @@ static const struct glsl_type builtin_130_types[] = {
 };
 
 const glsl_type *const glsl_type::uint_type = & builtin_130_types[0];
+const glsl_type *const glsl_type::uvec4_type = & builtin_130_types[3];
 /*@}*/
 
 /** \name Sampler types added by GL_ARB_texture_rectangle
index 96e4c74d5b5c556f009f2cd5abc8276e2d4fdfeb..22df13b07f0e0a94d854d79697d2d95fe6b45594 100644 (file)
@@ -108,7 +108,9 @@ struct glsl_type {
    /*@{*/
    static const glsl_type *const error_type;
    static const glsl_type *const int_type;
+   static const glsl_type *const ivec4_type;
    static const glsl_type *const uint_type;
+   static const glsl_type *const uvec4_type;
    static const glsl_type *const float_type;
    static const glsl_type *const vec2_type;
    static const glsl_type *const vec3_type;
diff --git a/ir.cpp b/ir.cpp
index 9a713494d3b467c8bcb336fa28d0433f96d27170..ca34c247192493ce24061d1369593d4ccb3df109 100644 (file)
--- a/ir.cpp
+++ b/ir.cpp
@@ -324,6 +324,26 @@ ir_texture::get_opcode(const char *str)
 }
 
 
+void
+ir_texture::set_sampler(ir_dereference *sampler)
+{
+   assert(sampler != NULL);
+   this->sampler = sampler;
+
+   switch (sampler->type->sampler_type) {
+   case GLSL_TYPE_FLOAT:
+      this->type = glsl_type::vec4_type;
+      break;
+   case GLSL_TYPE_INT:
+      this->type = glsl_type::ivec4_type;
+      break;
+   case GLSL_TYPE_UINT:
+      this->type = glsl_type::uvec4_type;
+      break;
+   }
+}
+
+
 ir_swizzle::ir_swizzle(ir_rvalue *val, unsigned x, unsigned y, unsigned z,
                       unsigned w, unsigned count)
    : val(val)
diff --git a/ir.h b/ir.h
index a286e7b9324c987c1ce1df4121723dcfd4d5f3c9..33ce4a04c360ab1de53316b8d6e4c40785f621e4 100644 (file)
--- a/ir.h
+++ b/ir.h
@@ -787,6 +787,9 @@ public:
     */
    const char *opcode_string();
 
+   /** Set the sampler and infer the type. */
+   void set_sampler(ir_dereference *sampler);
+
    /**
     * Do a reverse-lookup to translate a string into an ir_texture_opcode.
     */
index 4c97cc8ebade405f8153e7dd9c7f950412672b6c..0a2d18e2e0103fbeb554141f3bcfb1ade46ac5ce 100644 (file)
@@ -934,11 +934,12 @@ read_texture(_mesa_glsl_parse_state *st, s_list *list)
 
    // Read sampler (must be a deref)
    s_expression *sampler_expr = (s_expression *) tag->next;
-   tex->sampler = read_dereference(st, sampler_expr);
-   if (tex->sampler == NULL) {
+   ir_dereference *sampler = read_dereference(st, sampler_expr);
+   if (sampler == NULL) {
       ir_read_error(st, NULL, "when reading sampler in (%s ...)", tag->value());
       return NULL;
    }
+   tex->set_sampler(sampler);
 
    // Read coordinate (any rvalue)
    s_expression *coordinate_expr = (s_expression *) sampler_expr->next;