glsl: Only set ir_variable::constant_value for const-decorated variables
[mesa.git] / src / glsl / program.h
index d21b04344cd18614e93e31c005522d3e61762e0c..64f54635f62486a4a1a42a98c7ce2a95d97a1dda 100644 (file)
  * 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
- * BRIAN PAUL 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.
+ * 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 <GL/gl.h>
-#include "main/mtypes.h"
+#include "main/core.h"
 
-/**
- * Based on gl_shader in Mesa's mtypes.h.
- */
-struct glsl_shader {
-   GLenum Type;
-   GLuint Name;
-   GLint RefCount;
-   GLboolean DeletePending;
-   GLboolean CompileStatus;
-   const GLchar *Source;  /**< Source code string */
-   size_t SourceLen;
-   GLchar *InfoLog;
-
-   struct exec_list ir;
-   struct glsl_symbol_table *symbols;
-};
-
-
-typedef int gl_state_index;
-#define STATE_LENGTH 5
-
-/**
- * Program parameter.
- * Used by shaders/programs for uniforms, constants, varying vars, etc.
- */
-struct gl_program_parameter
-{
-   const char *Name;        /**< Null-terminated string */
-   gl_register_file Type;   /**< PROGRAM_NAMED_PARAM, CONSTANT or STATE_VAR */
-   GLenum DataType;         /**< GL_FLOAT, GL_FLOAT_VEC2, etc */
-   /**
-    * Number of components (1..4), or more.
-    * If the number of components is greater than 4,
-    * this parameter is part of a larger uniform like a GLSL matrix or array.
-    * The next program parameter's Size will be Size-4 of this parameter.
-    */
-   GLuint Size;
-   GLboolean Used;          /**< Helper flag for GLSL uniform tracking */
-   GLboolean Initialized;   /**< Has the ParameterValue[] been set? */
-   GLbitfield Flags;        /**< Bitmask of PROG_PARAM_*_BIT */
-   /**
-    * A sequence of STATE_* tokens and integers to identify GL state.
-    */
-   gl_state_index StateIndexes[STATE_LENGTH];
-};
-
-
-/**
- * List of gl_program_parameter instances.
- */
-struct gl_program_parameter_list
-{
-   GLuint Size;           /**< allocated size of Parameters, ParameterValues */
-   GLuint NumParameters;  /**< number of parameters in arrays */
-   struct gl_program_parameter *Parameters; /**< Array [Size] */
-   GLfloat (*ParameterValues)[4];        /**< Array [Size] of GLfloat[4] */
-   GLbitfield StateFlags; /**< _NEW_* flags indicating which state changes
-                               might invalidate ParameterValues[] */
-};
-
-
-/**
- * Shader program uniform variable.
- * The glGetUniformLocation() and glUniform() commands will use this
- * information.
- * Note that a uniform such as "binormal" might be used in both the
- * vertex shader and the fragment shader.  When glUniform() is called to
- * set the uniform's value, it must be updated in both the vertex and
- * fragment shaders.  The uniform may be in different locations in the
- * two shaders so we keep track of that here.
- */
-struct gl_uniform
-{
-   const char *Name;        /**< Null-terminated string */
-   GLint VertPos;
-   GLint FragPos;
-   GLboolean Initialized;   /**< For debug.  Has this uniform been set? */
-#if 0
-   GLenum DataType;         /**< GL_FLOAT, GL_FLOAT_VEC2, etc */
-   GLuint Size;             /**< Number of components (1..4) */
+#ifdef __cplusplus
+extern "C" {
 #endif
-};
 
+extern void
+_mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
+                         bool dump_ast, bool dump_hir);
 
-/**
- * List of gl_uniforms
- */
-struct gl_uniform_list
-{
-   GLuint Size;                 /**< allocated size of Uniforms array */
-   GLuint NumUniforms;          /**< number of uniforms in the array */
-   struct gl_uniform *Uniforms; /**< Array [Size] */
-};
-
-
-/**
- * Based on gl_shader_program in Mesa's mtypes.h.
- */
-struct glsl_program {
-   GLenum Type;  /**< Always GL_SHADER_PROGRAM (internal token) */
-   GLuint Name;  /**< aka handle or ID */
-   GLint RefCount;  /**< Reference count */
-   GLboolean DeletePending;
-
-   GLuint NumShaders;          /**< number of attached shaders */
-   struct glsl_shader **Shaders; /**< List of attached the shaders */
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
 
-   /**
-    * Per-stage shaders resulting from the first stage of linking.
-    */
-   /*@{*/
-   unsigned _NumLinkedShaders;
-   struct glsl_shader **_LinkedShaders;
-   /*@}*/
+extern void
+link_shaders(struct gl_context *ctx, struct gl_shader_program *prog);
 
-   /** User-defined attribute bindings (glBindAttribLocation) */
-   struct gl_program_parameter_list *Attributes;
+extern void
+build_program_resource_list(struct gl_shader_program *shProg);
 
-   /* post-link info: */
-   struct gl_uniform_list *Uniforms;
-   struct gl_program_parameter_list *Varying;
-   GLboolean LinkStatus;   /**< GL_LINK_STATUS */
-   GLboolean Validated;
-   GLboolean _Used;        /**< Ever used for drawing? */
-   GLchar *InfoLog;
-};
+extern void
+linker_error(struct gl_shader_program *prog, const char *fmt, ...)
+   PRINTFLIKE(2, 3);
 
 extern void
-link_shaders(struct glsl_program *prog);
+linker_warning(struct gl_shader_program *prog, const char *fmt, ...)
+   PRINTFLIKE(2, 3);
+
+extern long
+parse_program_resource_name(const GLchar *name,
+                            const GLchar **out_base_name_end);