#ifndef PROG_PARAMETER_H
#define PROG_PARAMETER_H
#include <stdbool.h>
#include <stdint.h>
#include "prog_statevars.h"
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum
{
PROGRAM_TEMPORARY,
PROGRAM_ARRAY,
PROGRAM_INPUT,
PROGRAM_OUTPUT,
PROGRAM_STATE_VAR,
PROGRAM_CONSTANT,
PROGRAM_UNIFORM,
PROGRAM_WRITE_ONLY,
PROGRAM_ADDRESS,
PROGRAM_SAMPLER,
PROGRAM_SYSTEM_VALUE,
PROGRAM_UNDEFINED,
PROGRAM_IMMEDIATE,
PROGRAM_BUFFER,
PROGRAM_MEMORY,
PROGRAM_IMAGE,
PROGRAM_HW_ATOMIC,
PROGRAM_FILE_MAX
} gl_register_file;
typedef union gl_constant_value
{
GLfloat f;
GLint b;
GLint i;
GLuint u;
} gl_constant_value;
struct gl_program_parameter
{
const char *Name;
gl_register_file Type:5;
bool Padded:1;
GLenum16 DataType;
GLushort Size;
gl_state_index16 StateIndexes[STATE_LENGTH];
uint32_t UniformStorageIndex;
uint32_t MainUniformStorageIndex;
};
struct gl_program_parameter_list
{
GLuint Size;
GLuint NumParameters;
unsigned NumParameterValues;
struct gl_program_parameter *Parameters;
unsigned *ParameterValueOffset;
gl_constant_value *ParameterValues;
GLbitfield StateFlags;
};
extern struct gl_program_parameter_list *
_mesa_new_parameter_list(void);
extern struct gl_program_parameter_list *
_mesa_new_parameter_list_sized(unsigned size);
extern void
_mesa_free_parameter_list(struct gl_program_parameter_list *paramList);
extern void
_mesa_reserve_parameter_storage(struct gl_program_parameter_list *paramList,
unsigned reserve_slots);
extern GLint
_mesa_add_parameter(struct gl_program_parameter_list *paramList,
gl_register_file type, const char *name,
GLuint size, GLenum datatype,
const gl_constant_value *values,
const gl_state_index16 state[STATE_LENGTH],
bool pad_and_align);
extern GLint
_mesa_add_typed_unnamed_constant(struct gl_program_parameter_list *paramList,
const gl_constant_value values[4], GLuint size,
GLenum datatype, GLuint *swizzleOut);
static inline GLint
_mesa_add_unnamed_constant(struct gl_program_parameter_list *paramList,
const gl_constant_value values[4], GLuint size,
GLuint *swizzleOut)
{
return _mesa_add_typed_unnamed_constant(paramList, values, size, GL_NONE,
swizzleOut);
}
extern GLint
_mesa_add_sized_state_reference(struct gl_program_parameter_list *paramList,
const gl_state_index16 stateTokens[STATE_LENGTH],
const unsigned size, bool pad_and_align);
extern GLint
_mesa_add_state_reference(struct gl_program_parameter_list *paramList,
const gl_state_index16 stateTokens[]);
static inline GLint
_mesa_lookup_parameter_index(const struct gl_program_parameter_list *paramList,
const char *name)
{
if (!paramList)
return -1;
for (GLint i = 0; i < (GLint) paramList->NumParameters; i++) {
if (paramList->Parameters[i].Name &&
strcmp(paramList->Parameters[i].Name, name) == 0)
return i;
}
return -1;
}
static inline bool
_mesa_gl_datatype_is_64bit(GLenum datatype)
{
switch (datatype) {
case GL_DOUBLE:
case GL_DOUBLE_VEC2:
case GL_DOUBLE_VEC3:
case GL_DOUBLE_VEC4:
case GL_DOUBLE_MAT2:
case GL_DOUBLE_MAT2x3:
case GL_DOUBLE_MAT2x4:
case GL_DOUBLE_MAT3:
case GL_DOUBLE_MAT3x2:
case GL_DOUBLE_MAT3x4:
case GL_DOUBLE_MAT4:
case GL_DOUBLE_MAT4x2:
case GL_DOUBLE_MAT4x3:
case GL_INT64_ARB:
case GL_INT64_VEC2_ARB:
case GL_INT64_VEC3_ARB:
case GL_INT64_VEC4_ARB:
case GL_UNSIGNED_INT64_ARB:
case GL_UNSIGNED_INT64_VEC2_ARB:
case GL_UNSIGNED_INT64_VEC3_ARB:
case GL_UNSIGNED_INT64_VEC4_ARB:
return true;
default:
return false;
}
}
#ifdef __cplusplus
}
#endif
#endif