Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* -*- c++ -*- */
  2. /*
  3.  * Copyright © 2009 Intel Corporation
  4.  *
  5.  * Permission is hereby granted, free of charge, to any person obtaining a
  6.  * copy of this software and associated documentation files (the "Software"),
  7.  * to deal in the Software without restriction, including without limitation
  8.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9.  * and/or sell copies of the Software, and to permit persons to whom the
  10.  * Software is furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice (including the next
  13.  * paragraph) shall be included in all copies or substantial portions of the
  14.  * Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22.  * DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25. #pragma once
  26. #ifndef GLSL_TYPES_H
  27. #define GLSL_TYPES_H
  28.  
  29. #include <string.h>
  30. #include <assert.h>
  31.  
  32. extern "C" {
  33. #include "GL/gl.h"
  34. }
  35.  
  36. #include "ralloc.h"
  37.  
  38. struct _mesa_glsl_parse_state;
  39. struct glsl_symbol_table;
  40.  
  41. extern "C" void
  42. _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state);
  43.  
  44. extern "C" void
  45. _mesa_glsl_release_types(void);
  46.  
  47. enum glsl_base_type {
  48.    GLSL_TYPE_UINT = 0,
  49.    GLSL_TYPE_INT,
  50.    GLSL_TYPE_FLOAT,
  51.    GLSL_TYPE_BOOL,
  52.    GLSL_TYPE_SAMPLER,
  53.    GLSL_TYPE_STRUCT,
  54.    GLSL_TYPE_ARRAY,
  55.    GLSL_TYPE_VOID,
  56.    GLSL_TYPE_ERROR
  57. };
  58.  
  59. enum glsl_sampler_dim {
  60.    GLSL_SAMPLER_DIM_1D = 0,
  61.    GLSL_SAMPLER_DIM_2D,
  62.    GLSL_SAMPLER_DIM_3D,
  63.    GLSL_SAMPLER_DIM_CUBE,
  64.    GLSL_SAMPLER_DIM_RECT,
  65.    GLSL_SAMPLER_DIM_BUF
  66. };
  67.  
  68.  
  69. struct glsl_type {
  70.    GLenum gl_type;
  71.    glsl_base_type base_type;
  72.  
  73.    unsigned sampler_dimensionality:3;
  74.    unsigned sampler_shadow:1;
  75.    unsigned sampler_array:1;
  76.    unsigned sampler_type:2;    /**< Type of data returned using this sampler.
  77.                                 * only \c GLSL_TYPE_FLOAT, \c GLSL_TYPE_INT,
  78.                                 * and \c GLSL_TYPE_UINT are valid.
  79.                                 */
  80.  
  81.    /* Callers of this ralloc-based new need not call delete. It's
  82.     * easier to just ralloc_free 'mem_ctx' (or any of its ancestors). */
  83.    static void* operator new(size_t size)
  84.    {
  85.       if (glsl_type::mem_ctx == NULL) {
  86.          glsl_type::mem_ctx = ralloc_context(NULL);
  87.          assert(glsl_type::mem_ctx != NULL);
  88.       }
  89.  
  90.       void *type;
  91.  
  92.       type = ralloc_size(glsl_type::mem_ctx, size);
  93.       assert(type != NULL);
  94.  
  95.       return type;
  96.    }
  97.  
  98.    /* If the user *does* call delete, that's OK, we will just
  99.     * ralloc_free in that case. */
  100.    static void operator delete(void *type)
  101.    {
  102.       ralloc_free(type);
  103.    }
  104.  
  105.    /**
  106.     * \name Vector and matrix element counts
  107.     *
  108.     * For scalars, each of these values will be 1.  For non-numeric types
  109.     * these will be 0.
  110.     */
  111.    /*@{*/
  112.    unsigned vector_elements:3; /**< 1, 2, 3, or 4 vector elements. */
  113.    unsigned matrix_columns:3;  /**< 1, 2, 3, or 4 matrix columns. */
  114.    /*@}*/
  115.  
  116.    /**
  117.     * Name of the data type
  118.     *
  119.     * This may be \c NULL for anonymous structures, for arrays, or for
  120.     * function types.
  121.     */
  122.    const char *name;
  123.  
  124.    /**
  125.     * For \c GLSL_TYPE_ARRAY, this is the length of the array.  For
  126.     * \c GLSL_TYPE_STRUCT, it is the number of elements in the structure and
  127.     * the number of values pointed to by \c fields.structure (below).
  128.     */
  129.    unsigned length;
  130.  
  131.    /**
  132.     * Subtype of composite data types.
  133.     */
  134.    union {
  135.       const struct glsl_type *array;            /**< Type of array elements. */
  136.       const struct glsl_type *parameters;       /**< Parameters to function. */
  137.       struct glsl_struct_field *structure;      /**< List of struct fields. */
  138.    } fields;
  139.  
  140.  
  141.    /**
  142.     * \name Pointers to various public type singletons
  143.     */
  144.    /*@{*/
  145.    static const glsl_type *const error_type;
  146.    static const glsl_type *const void_type;
  147.    static const glsl_type *const int_type;
  148.    static const glsl_type *const ivec4_type;
  149.    static const glsl_type *const uint_type;
  150.    static const glsl_type *const uvec2_type;
  151.    static const glsl_type *const uvec3_type;
  152.    static const glsl_type *const uvec4_type;
  153.    static const glsl_type *const float_type;
  154.    static const glsl_type *const vec2_type;
  155.    static const glsl_type *const vec3_type;
  156.    static const glsl_type *const vec4_type;
  157.    static const glsl_type *const bool_type;
  158.    static const glsl_type *const mat2_type;
  159.    static const glsl_type *const mat2x3_type;
  160.    static const glsl_type *const mat2x4_type;
  161.    static const glsl_type *const mat3x2_type;
  162.    static const glsl_type *const mat3_type;
  163.    static const glsl_type *const mat3x4_type;
  164.    static const glsl_type *const mat4x2_type;
  165.    static const glsl_type *const mat4x3_type;
  166.    static const glsl_type *const mat4_type;
  167.    /*@}*/
  168.  
  169.  
  170.    /**
  171.     * For numeric and boolean derrived types returns the basic scalar type
  172.     *
  173.     * If the type is a numeric or boolean scalar, vector, or matrix type,
  174.     * this function gets the scalar type of the individual components.  For
  175.     * all other types, including arrays of numeric or boolean types, the
  176.     * error type is returned.
  177.     */
  178.    const glsl_type *get_base_type() const;
  179.  
  180.    /**
  181.     * Query the type of elements in an array
  182.     *
  183.     * \return
  184.     * Pointer to the type of elements in the array for array types, or \c NULL
  185.     * for non-array types.
  186.     */
  187.    const glsl_type *element_type() const
  188.    {
  189.       return is_array() ? fields.array : NULL;
  190.    }
  191.  
  192.    /**
  193.     * Get the instance of a built-in scalar, vector, or matrix type
  194.     */
  195.    static const glsl_type *get_instance(unsigned base_type, unsigned rows,
  196.                                         unsigned columns);
  197.  
  198.    /**
  199.     * Get the instance of an array type
  200.     */
  201.    static const glsl_type *get_array_instance(const glsl_type *base,
  202.                                               unsigned elements);
  203.  
  204.    /**
  205.     * Get the instance of a record type
  206.     */
  207.    static const glsl_type *get_record_instance(const glsl_struct_field *fields,
  208.                                                unsigned num_fields,
  209.                                                const char *name);
  210.  
  211.    /**
  212.     * Query the total number of scalars that make up a scalar, vector or matrix
  213.     */
  214.    unsigned components() const
  215.    {
  216.       return vector_elements * matrix_columns;
  217.    }
  218.  
  219.    /**
  220.     * Calculate the number of components slots required to hold this type
  221.     *
  222.     * This is used to determine how many uniform or varying locations a type
  223.     * might occupy.
  224.     */
  225.    unsigned component_slots() const;
  226.  
  227.  
  228.    /**
  229.     * Query whether or not a type is a scalar (non-vector and non-matrix).
  230.     */
  231.    bool is_scalar() const
  232.    {
  233.       return (vector_elements == 1)
  234.          && (base_type >= GLSL_TYPE_UINT)
  235.          && (base_type <= GLSL_TYPE_BOOL);
  236.    }
  237.  
  238.    /**
  239.     * Query whether or not a type is a vector
  240.     */
  241.    bool is_vector() const
  242.    {
  243.       return (vector_elements > 1)
  244.          && (matrix_columns == 1)
  245.          && (base_type >= GLSL_TYPE_UINT)
  246.          && (base_type <= GLSL_TYPE_BOOL);
  247.    }
  248.  
  249.    /**
  250.     * Query whether or not a type is a matrix
  251.     */
  252.    bool is_matrix() const
  253.    {
  254.       /* GLSL only has float matrices. */
  255.       return (matrix_columns > 1) && (base_type == GLSL_TYPE_FLOAT);
  256.    }
  257.  
  258.    /**
  259.     * Query whether or not a type is a non-array numeric type
  260.     */
  261.    bool is_numeric() const
  262.    {
  263.       return (base_type >= GLSL_TYPE_UINT) && (base_type <= GLSL_TYPE_FLOAT);
  264.    }
  265.  
  266.    /**
  267.     * Query whether or not a type is an integral type
  268.     */
  269.    bool is_integer() const
  270.    {
  271.       return (base_type == GLSL_TYPE_UINT) || (base_type == GLSL_TYPE_INT);
  272.    }
  273.  
  274.    /**
  275.     * Query whether or not a type is a float type
  276.     */
  277.    bool is_float() const
  278.    {
  279.       return base_type == GLSL_TYPE_FLOAT;
  280.    }
  281.  
  282.    /**
  283.     * Query whether or not a type is a non-array boolean type
  284.     */
  285.    bool is_boolean() const
  286.    {
  287.       return base_type == GLSL_TYPE_BOOL;
  288.    }
  289.  
  290.    /**
  291.     * Query whether or not a type is a sampler
  292.     */
  293.    bool is_sampler() const
  294.    {
  295.       return base_type == GLSL_TYPE_SAMPLER;
  296.    }
  297.  
  298.    /**
  299.     * Query whether or not a type is an array
  300.     */
  301.    bool is_array() const
  302.    {
  303.       return base_type == GLSL_TYPE_ARRAY;
  304.    }
  305.  
  306.    /**
  307.     * Query whether or not a type is a record
  308.     */
  309.    bool is_record() const
  310.    {
  311.       return base_type == GLSL_TYPE_STRUCT;
  312.    }
  313.  
  314.    /**
  315.     * Query whether or not a type is the void type singleton.
  316.     */
  317.    bool is_void() const
  318.    {
  319.       return base_type == GLSL_TYPE_VOID;
  320.    }
  321.  
  322.    /**
  323.     * Query whether or not a type is the error type singleton.
  324.     */
  325.    bool is_error() const
  326.    {
  327.       return base_type == GLSL_TYPE_ERROR;
  328.    }
  329.  
  330.    /**
  331.     * Query the full type of a matrix row
  332.     *
  333.     * \return
  334.     * If the type is not a matrix, \c glsl_type::error_type is returned.
  335.     * Otherwise a type matching the rows of the matrix is returned.
  336.     */
  337.    const glsl_type *row_type() const
  338.    {
  339.       return is_matrix()
  340.          ? get_instance(base_type, matrix_columns, 1)
  341.          : error_type;
  342.    }
  343.  
  344.    /**
  345.     * Query the full type of a matrix column
  346.     *
  347.     * \return
  348.     * If the type is not a matrix, \c glsl_type::error_type is returned.
  349.     * Otherwise a type matching the columns of the matrix is returned.
  350.     */
  351.    const glsl_type *column_type() const
  352.    {
  353.       return is_matrix()
  354.          ? get_instance(base_type, vector_elements, 1)
  355.          : error_type;
  356.    }
  357.  
  358.  
  359.    /**
  360.     * Get the type of a structure field
  361.     *
  362.     * \return
  363.     * Pointer to the type of the named field.  If the type is not a structure
  364.     * or the named field does not exist, \c glsl_type::error_type is returned.
  365.     */
  366.    const glsl_type *field_type(const char *name) const;
  367.  
  368.  
  369.    /**
  370.     * Get the location of a filed within a record type
  371.     */
  372.    int field_index(const char *name) const;
  373.  
  374.  
  375.    /**
  376.     * Query the number of elements in an array type
  377.     *
  378.     * \return
  379.     * The number of elements in the array for array types or -1 for non-array
  380.     * types.  If the number of elements in the array has not yet been declared,
  381.     * zero is returned.
  382.     */
  383.    int array_size() const
  384.    {
  385.       return is_array() ? length : -1;
  386.    }
  387.  
  388. private:
  389.    /**
  390.     * ralloc context for all glsl_type allocations
  391.     *
  392.     * Set on the first call to \c glsl_type::new.
  393.     */
  394.    static void *mem_ctx;
  395.  
  396.    void init_ralloc_type_ctx(void);
  397.  
  398.    /** Constructor for vector and matrix types */
  399.    glsl_type(GLenum gl_type,
  400.              glsl_base_type base_type, unsigned vector_elements,
  401.              unsigned matrix_columns, const char *name);
  402.  
  403.    /** Constructor for sampler types */
  404.    glsl_type(GLenum gl_type,
  405.              enum glsl_sampler_dim dim, bool shadow, bool array,
  406.              unsigned type, const char *name);
  407.  
  408.    /** Constructor for record types */
  409.    glsl_type(const glsl_struct_field *fields, unsigned num_fields,
  410.              const char *name);
  411.  
  412.    /** Constructor for array types */
  413.    glsl_type(const glsl_type *array, unsigned length);
  414.  
  415.    /** Hash table containing the known array types. */
  416.    static struct hash_table *array_types;
  417.  
  418.    /** Hash table containing the known record types. */
  419.    static struct hash_table *record_types;
  420.  
  421.    static int record_key_compare(const void *a, const void *b);
  422.    static unsigned record_key_hash(const void *key);
  423.  
  424.    /**
  425.     * \name Pointers to various type singletons
  426.     */
  427.    /*@{*/
  428.    static const glsl_type _error_type;
  429.    static const glsl_type _void_type;
  430.    static const glsl_type builtin_core_types[];
  431.    static const glsl_type builtin_structure_types[];
  432.    static const glsl_type builtin_110_deprecated_structure_types[];
  433.    static const glsl_type builtin_110_types[];
  434.    static const glsl_type builtin_120_types[];
  435.    static const glsl_type builtin_130_types[];
  436.    static const glsl_type builtin_ARB_texture_rectangle_types[];
  437.    static const glsl_type builtin_EXT_texture_array_types[];
  438.    static const glsl_type builtin_EXT_texture_buffer_object_types[];
  439.    /*@}*/
  440.  
  441.    /**
  442.     * \name Methods to populate a symbol table with built-in types.
  443.     *
  444.     * \internal
  445.     * This is one of the truely annoying things about C++.  Methods that are
  446.     * completely internal and private to a type still have to be advertised to
  447.     * the world in a public header file.
  448.     */
  449.    /*@{*/
  450.    static void generate_100ES_types(glsl_symbol_table *);
  451.    static void generate_110_types(glsl_symbol_table *);
  452.    static void generate_120_types(glsl_symbol_table *);
  453.    static void generate_130_types(glsl_symbol_table *);
  454.    static void generate_ARB_texture_rectangle_types(glsl_symbol_table *, bool);
  455.    static void generate_EXT_texture_array_types(glsl_symbol_table *, bool);
  456.    /*@}*/
  457.  
  458.    /**
  459.     * \name Friend functions.
  460.     *
  461.     * These functions are friends because they must have C linkage and the
  462.     * need to call various private methods or access various private static
  463.     * data.
  464.     */
  465.    /*@{*/
  466.    friend void _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *);
  467.    friend void _mesa_glsl_release_types(void);
  468.    /*@}*/
  469. };
  470.  
  471. struct glsl_struct_field {
  472.    const struct glsl_type *type;
  473.    const char *name;
  474. };
  475.  
  476. #endif /* GLSL_TYPES_H */
  477.