[Mesa-dev] [PATCH 2/7] glsl: Add glsl_type::get_sampler_instance method.
Kenneth Graunke
kenneth at whitecape.org
Fri Jul 27 10:49:20 PDT 2012
From: Ian Romanick <ian.d.romanick at intel.com>
v2/Kayden: Use enum glsl_base_type instead of unsigned for the
glsl_type::get_sampler_instance base type parameter.
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
src/glsl/glsl_types.cpp | 124 ++++++++++++++++++++++++++++++++++++++++++++++++
src/glsl/glsl_types.h | 14 ++++++
2 files changed, 138 insertions(+)
diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
index 3d78660..798d658 100644
--- a/src/glsl/glsl_types.cpp
+++ b/src/glsl/glsl_types.cpp
@@ -555,6 +555,130 @@ glsl_type::get_record_instance(const glsl_struct_field *fields,
return t;
}
+/**
+ * Convert sampler type attributes into an index in the sampler_types array
+ */
+#define SAMPLER_TYPE_INDEX(dim, sample_type, array, shadow) \
+ ((unsigned(dim) * 12) + (sample_type * 4) + (unsigned(array) * 2) \
+ + unsigned(shadow))
+
+/**
+ * \note
+ * Arrays like this are \b the argument for C99-style designated initializers.
+ * Too bad C++ and VisualStudio are too cool for that sort of useful
+ * functionality.
+ */
+const glsl_type *const glsl_type::sampler_types[] = {
+ /* GLSL_SAMPLER_DIM_1D */
+ &builtin_130_types[10], /* uint */
+ NULL, /* uint, shadow */
+ &builtin_130_types[5], /* uint, array */
+ NULL, /* uint, array, shadow */
+ &builtin_130_types[9], /* int */
+ NULL, /* int, shadow */
+ &builtin_130_types[4], /* int, array */
+ NULL, /* int, array, shadow */
+ &builtin_110_types[0], /* float */
+ &builtin_110_types[1], /* float, shadow */
+ &builtin_EXT_texture_array_types[0], /* float, array */
+ &builtin_EXT_texture_array_types[2], /* float, array, shadow */
+
+ /* GLSL_SAMPLER_DIM_2D */
+ &builtin_130_types[12], /* uint */
+ NULL, /* uint, shadow */
+ &builtin_130_types[7], /* uint, array */
+ NULL, /* uint, array, shadow */
+ &builtin_130_types[11], /* int */
+ NULL, /* int, shadow */
+ &builtin_130_types[6], /* int, array */
+ NULL, /* int, array, shadow */
+ &builtin_core_types[15], /* float */
+ &builtin_110_types[2], /* float, shadow */
+ &builtin_EXT_texture_array_types[1], /* float, array */
+ &builtin_EXT_texture_array_types[3], /* float, array, shadow */
+
+ /* GLSL_SAMPLER_DIM_3D */
+ &builtin_130_types[14], /* uint */
+ NULL, /* uint, shadow */
+ NULL, /* uint, array */
+ NULL, /* uint, array, shadow */
+ &builtin_130_types[13], /* int */
+ NULL, /* int, shadow */
+ NULL, /* int, array */
+ NULL, /* int, array, shadow */
+ &builtin_110_types[3], /* float */
+ NULL, /* float, shadow */
+ NULL, /* float, array */
+ NULL, /* float, array, shadow */
+
+ /* GLSL_SAMPLER_DIM_CUBE */
+ &builtin_130_types[16], /* uint */
+ NULL, /* uint, shadow */
+ NULL, /* uint, array */
+ NULL, /* uint, array, shadow */
+ &builtin_130_types[15], /* int */
+ NULL, /* int, shadow */
+ NULL, /* int, array */
+ NULL, /* int, array, shadow */
+ &builtin_core_types[16], /* float */
+ &builtin_130_types[8], /* float, shadow */
+ NULL, /* float, array */
+ NULL, /* float, array, shadow */
+
+ /* GLSL_SAMPLER_DIM_RECT */
+ NULL, /* uint */
+ NULL, /* uint, shadow */
+ NULL, /* uint, array */
+ NULL, /* uint, array, shadow */
+ NULL, /* int */
+ NULL, /* int, shadow */
+ NULL, /* int, array */
+ NULL, /* int, array, shadow */
+ &builtin_ARB_texture_rectangle_types[0], /* float */
+ &builtin_ARB_texture_rectangle_types[1], /* float, shadow */
+ NULL, /* float, array */
+ NULL, /* float, array, shadow */
+
+ /* GLSL_SAMPLER_DIM_BUF */
+ &builtin_EXT_texture_buffer_object_types[2], /* uint */
+ NULL, /* uint, shadow */
+ NULL, /* uint, array */
+ NULL, /* uint, array, shadow */
+ &builtin_EXT_texture_buffer_object_types[1], /* int */
+ NULL, /* int, shadow */
+ NULL, /* int, array */
+ NULL, /* int, array, shadow */
+ &builtin_EXT_texture_buffer_object_types[0], /* float */
+ NULL, /* float, shadow */
+ NULL, /* float, array */
+ NULL, /* float, array, shadow */
+
+ /* GLSL_SAMPLER_DIM_EXTERNAL */
+ NULL, /* uint */
+ NULL, /* uint, shadow */
+ NULL, /* uint, array */
+ NULL, /* uint, array, shadow */
+ NULL, /* int */
+ NULL, /* int, shadow */
+ NULL, /* int, array */
+ NULL, /* int, array, shadow */
+ &builtin_OES_EGL_image_external_types[0], /* float */
+ NULL, /* float, shadow */
+ NULL, /* float, array */
+ NULL, /* float, array, shadow */
+};
+
+const glsl_type *
+glsl_type::get_sampler_instance(glsl_sampler_dim dim,
+ bool shadow, bool array,
+ enum glsl_base_type base_type)
+{
+ const glsl_type *const t =
+ sampler_types[SAMPLER_TYPE_INDEX(dim, base_type, array, shadow)];
+
+ return t;
+}
+
const glsl_type *
glsl_type::field_type(const char *name) const
diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
index 915d1a2..681eda7 100644
--- a/src/glsl/glsl_types.h
+++ b/src/glsl/glsl_types.h
@@ -232,6 +232,13 @@ struct glsl_type {
const char *name);
/**
+ * Get the instance of a sampler type
+ */
+ static const glsl_type *get_sampler_instance(glsl_sampler_dim dim,
+ bool shadow, bool array,
+ enum glsl_base_type base_type);
+
+ /**
* Query the total number of scalars that make up a scalar, vector or matrix
*/
unsigned components() const
@@ -524,6 +531,13 @@ private:
/*@}*/
/**
+ * Table of sampler types used internally by get_sampler_instance
+ *
+ * \sa glsl_type::get_sampler_instance
+ */
+ static const glsl_type *const sampler_types[];
+
+ /**
* \name Methods to populate a symbol table with built-in types.
*
* \internal
--
1.7.11.3
More information about the mesa-dev
mailing list