14ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick/*
24ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * Copyright © 2011 Intel Corporation
34ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick *
44ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * Permission is hereby granted, free of charge, to any person obtaining a
54ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * copy of this software and associated documentation files (the "Software"),
64ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * to deal in the Software without restriction, including without limitation
74ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
84ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * and/or sell copies of the Software, and to permit persons to whom the
94ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * Software is furnished to do so, subject to the following conditions:
104ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick *
114ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * The above copyright notice and this permission notice (including the next
124ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * paragraph) shall be included in all copies or substantial portions of the
134ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * Software.
144ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick *
154ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
164ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
174ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
184ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
194ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
204ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
214ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick * DEALINGS IN THE SOFTWARE.
224ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick */
234ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
244ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick#pragma once
254ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick#ifndef IR_UNIFORM_H
264ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick#define IR_UNIFORM_H
274ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
284ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
294ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick/* stdbool.h is necessary because this file is included in both C and C++ code.
304ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick */
314ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick#include <stdbool.h>
3263e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
334ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick#include "program/prog_parameter.h"  /* For union gl_constant_value. */
344ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
3563e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
3663e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#ifdef __cplusplus
3763e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonsecaextern "C" {
3863e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif
3963e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
404ad460991cb1f4d8904b075133af414a624a27f3Ian Romanickenum gl_uniform_driver_format {
414ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   uniform_native = 0,          /**< Store data in the native format. */
424ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   uniform_int_float,           /**< Store integer data as floats. */
434ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   uniform_bool_float,          /**< Store boolean data as floats. */
444ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
454ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
464ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * Store boolean data as integer using 1 for \c true.
474ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
484ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   uniform_bool_int_0_1,
494ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
504ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
514ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * Store boolean data as integer using ~0 for \c true.
524ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
53fab88822735e7a8eeb0ce13ff13f90184e916f9fBrian Paul   uniform_bool_int_0_not0
544ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick};
554ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
564ad460991cb1f4d8904b075133af414a624a27f3Ian Romanickstruct gl_uniform_driver_storage {
574ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
584ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * Number of bytes from one array element to the next.
594ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
604ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   uint8_t element_stride;
614ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
624ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
634ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * Number of bytes from one vector in a matrix to the next.
644ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
654ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   uint8_t vector_stride;
664ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
674ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
684ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * Base format of the stored data.
694ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    *
704ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * This field must have a value from \c GLSL_TYPE_UINT through \c
714ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * GLSL_TYPE_SAMPLER.
724ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
734ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   uint8_t format;
744ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
754ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
764ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * Pointer to the base of the data.
774ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
784ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   void *data;
794ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick};
804ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
814ad460991cb1f4d8904b075133af414a624a27f3Ian Romanickstruct gl_uniform_storage {
824ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   char *name;
834ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   const struct glsl_type *type;
844ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
854ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
864ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * The number of elements in this uniform.
874ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    *
884ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * For non-arrays, this is always 0.  For arrays, the value is the size of
894ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * the array.
904ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
914ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   unsigned array_elements;
924ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
934ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
944ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * Has this uniform ever been set?
954ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
964ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   bool initialized;
974ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
984ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
994ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * Base sampler index
1004ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    *
1014ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * If \c ::base_type is \c GLSL_TYPE_SAMPLER, this represents the index of
1024ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * this sampler.  If \c ::array_elements is not zero, the array will use
1034ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * sampler indexes \c ::sampler through \c ::sampler + \c ::array_elements
1044ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * - 1, inclusive.
1054ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
1064ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   uint8_t sampler;
1074ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
1084ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
1094ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * Storage used by the driver for the uniform
1104ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
1114ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   unsigned num_driver_storage;
1124ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   struct gl_uniform_driver_storage *driver_storage;
1134ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
1144ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   /**
1154ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * Storage used by Mesa for the uniform
1164ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    *
1174ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * This form of the uniform is used by Mesa's implementation of \c
1184ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * glGetUniform.  It can also be used by drivers to obtain the value of the
1194ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    * uniform if the \c ::driver_storage interface is not used.
1204ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick    */
1214ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick   union gl_constant_value *storage;
122a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt
123a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   /** Fields for GL_ARB_uniform_buffer_object
124a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * @{
125a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    */
126a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt
127a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   /**
128a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * GL_UNIFORM_BLOCK_INDEX: index of the uniform block containing
129a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * the uniform, or -1 for the default uniform block.  Note that the
130a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * index is into the linked program's UniformBlocks[] array, not
131a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * the linked shader's.
132a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    */
133a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   int block_index;
134a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt
135a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   /** GL_UNIFORM_OFFSET: byte offset within the uniform block, or -1. */
136a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   int offset;
137a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt
138a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   /**
139a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * GL_UNIFORM_MATRIX_STRIDE: byte stride between columns or rows of
140a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * a matrix.  Set to 0 for non-matrices in UBOs, or -1 for uniforms
141a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * in the default uniform block.
142a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    */
143a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   int matrix_stride;
144a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt
145a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   /**
146a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * GL_UNIFORM_ARRAY_STRIDE: byte stride between elements of the
147a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * array.  Set to zero for non-arrays in UBOs, or -1 for uniforms
148a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    * in the default uniform block.
149a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt    */
150a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   int array_stride;
151a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt
152a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   /** GL_UNIFORM_ROW_MAJOR: true iff it's a row-major matrix in a UBO */
153a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   bool row_major;
154a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt
155a74507dc94f6383f2a81850866fceec108c2ab34Eric Anholt   /** @} */
1564ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick};
1574ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
1584ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick#ifdef __cplusplus
1594ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick}
1604ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick#endif
1614ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick
1624ad460991cb1f4d8904b075133af414a624a27f3Ian Romanick#endif /* IR_UNIFORM_H */
163