Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* -*- c++ -*- */
  2. /*
  3.  * Copyright © 2010 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_SYMBOL_TABLE
  27. #define GLSL_SYMBOL_TABLE
  28.  
  29. #include <new>
  30.  
  31. extern "C" {
  32. #include "program/symbol_table.h"
  33. }
  34. #include "ir.h"
  35.  
  36. class symbol_table_entry;
  37. struct glsl_type;
  38.  
  39. /**
  40.  * Facade class for _mesa_symbol_table
  41.  *
  42.  * Wraps the existing \c _mesa_symbol_table data structure to enforce some
  43.  * type safe and some symbol table invariants.
  44.  */
  45. struct glsl_symbol_table {
  46.    DECLARE_RALLOC_CXX_OPERATORS(glsl_symbol_table)
  47.  
  48.    glsl_symbol_table();
  49.    ~glsl_symbol_table();
  50.  
  51.    /* In 1.10, functions and variables have separate namespaces. */
  52.    bool separate_function_namespace;
  53.  
  54.    void push_scope();
  55.    void pop_scope();
  56.  
  57.    /**
  58.     * Determine whether a name was declared at the current scope
  59.     */
  60.    bool name_declared_this_scope(const char *name);
  61.  
  62.    /**
  63.     * \name Methods to add symbols to the table
  64.     *
  65.     * There is some temptation to rename all these functions to \c add_symbol
  66.     * or similar.  However, this breaks symmetry with the getter functions and
  67.     * reduces the clarity of the intention of code that uses these methods.
  68.     */
  69.    /*@{*/
  70.    bool add_variable(ir_variable *v);
  71.    bool add_type(const char *name, const glsl_type *t);
  72.    bool add_function(ir_function *f);
  73.    bool add_interface(const char *name, const glsl_type *i,
  74.                       enum ir_variable_mode mode);
  75.    /*@}*/
  76.  
  77.    /**
  78.     * Add an function at global scope without checking for scoping conflicts.
  79.     */
  80.    void add_global_function(ir_function *f);
  81.  
  82.    /**
  83.     * \name Methods to get symbols from the table
  84.     */
  85.    /*@{*/
  86.    ir_variable *get_variable(const char *name);
  87.    const glsl_type *get_type(const char *name);
  88.    ir_function *get_function(const char *name);
  89.    const glsl_type *get_interface(const char *name,
  90.                                   enum ir_variable_mode mode);
  91.    /*@}*/
  92.  
  93.    /**
  94.     * Disable a previously-added variable so that it no longer appears to be
  95.     * in the symbol table.  This is necessary when gl_PerVertex is redeclared,
  96.     * to ensure that previously-available built-in variables are no longer
  97.     * available.
  98.     */
  99.    void disable_variable(const char *name);
  100.  
  101. private:
  102.    symbol_table_entry *get_entry(const char *name);
  103.  
  104.    struct _mesa_symbol_table *table;
  105.    void *mem_ctx;
  106. };
  107.  
  108. #endif /* GLSL_SYMBOL_TABLE */
  109.