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