#include "shader_enums.h"
#include "blob.h"
+#include "c11/threads.h"
+
+#ifdef __cplusplus
+#include "main/config.h"
+#endif
struct glsl_type;
GLSL_TYPE_UINT = 0,
GLSL_TYPE_INT,
GLSL_TYPE_FLOAT,
+ GLSL_TYPE_FLOAT16,
GLSL_TYPE_DOUBLE,
+ GLSL_TYPE_UINT8,
+ GLSL_TYPE_INT8,
+ GLSL_TYPE_UINT16,
+ GLSL_TYPE_INT16,
GLSL_TYPE_UINT64,
GLSL_TYPE_INT64,
GLSL_TYPE_BOOL,
GLSL_TYPE_ERROR
};
+static inline bool glsl_base_type_is_16bit(enum glsl_base_type type)
+{
+ return type == GLSL_TYPE_FLOAT16 ||
+ type == GLSL_TYPE_UINT16 ||
+ type == GLSL_TYPE_INT16;
+}
+
static inline bool glsl_base_type_is_64bit(enum glsl_base_type type)
{
return type == GLSL_TYPE_DOUBLE ||
#ifdef __cplusplus
#include "GL/gl.h"
#include "util/ralloc.h"
-#include "main/mtypes.h" /* for gl_texture_index, C++'s enum rules are broken */
+#include "main/menums.h" /* for gl_texture_index, C++'s enum rules are broken */
struct glsl_type {
GLenum gl_type;
unsigned interface_row_major:1;
private:
- glsl_type()
+ glsl_type() : mem_ctx(NULL)
{
// Dummy constructor, just for the sake of ASSERT_BITFIELD_SIZE.
}
public:
- /* Callers of this ralloc-based new need not call delete. It's
- * easier to just ralloc_free 'mem_ctx' (or any of its ancestors). */
- static void* operator new(size_t size)
- {
- ASSERT_BITFIELD_SIZE(glsl_type, base_type, GLSL_TYPE_ERROR);
- ASSERT_BITFIELD_SIZE(glsl_type, sampled_type, GLSL_TYPE_ERROR);
- ASSERT_BITFIELD_SIZE(glsl_type, sampler_dimensionality,
- GLSL_SAMPLER_DIM_SUBPASS_MS);
-
- mtx_lock(&glsl_type::mem_mutex);
-
- /* mem_ctx should have been created by the static members */
- assert(glsl_type::mem_ctx != NULL);
-
- void *type;
-
- type = ralloc_size(glsl_type::mem_ctx, size);
- assert(type != NULL);
-
- mtx_unlock(&glsl_type::mem_mutex);
-
- return type;
- }
-
- /* If the user *does* call delete, that's OK, we will just
- * ralloc_free in that case. */
- static void operator delete(void *type)
- {
- mtx_lock(&glsl_type::mem_mutex);
- ralloc_free(type);
- mtx_unlock(&glsl_type::mem_mutex);
- }
-
/**
* \name Vector and matrix element counts
*
* Convenience accessors for vector types (shorter than get_instance()).
* @{
*/
+ static const glsl_type *vec(unsigned components, const glsl_type *const ts[]);
static const glsl_type *vec(unsigned components);
+ static const glsl_type *f16vec(unsigned components);
static const glsl_type *dvec(unsigned components);
static const glsl_type *ivec(unsigned components);
static const glsl_type *uvec(unsigned components);
static const glsl_type *bvec(unsigned components);
static const glsl_type *i64vec(unsigned components);
static const glsl_type *u64vec(unsigned components);
+ static const glsl_type *i16vec(unsigned components);
+ static const glsl_type *u16vec(unsigned components);
+ static const glsl_type *i8vec(unsigned components);
+ static const glsl_type *u8vec(unsigned components);
/**@}*/
/**
bool is_matrix() const
{
/* GLSL only has float matrices. */
- return (matrix_columns > 1) && (base_type == GLSL_TYPE_FLOAT || base_type == GLSL_TYPE_DOUBLE);
+ return (matrix_columns > 1) && (base_type == GLSL_TYPE_FLOAT ||
+ base_type == GLSL_TYPE_DOUBLE ||
+ base_type == GLSL_TYPE_FLOAT16);
}
/**
return glsl_base_type_is_64bit(base_type);
}
+ /**
+ * Query whether or not a type is 16-bit
+ */
+ bool is_16bit() const
+ {
+ return glsl_base_type_is_16bit(base_type);
+ }
+
/**
* Query whether or not a type is a non-array boolean type
*/
return (bool) interface_row_major;
}
+ ~glsl_type();
+
private:
- static mtx_t mem_mutex;
static mtx_t hash_mutex;
/**
- * ralloc context for all glsl_type allocations
- *
- * Set on the first call to \c glsl_type::new.
+ * ralloc context for the type itself.
*/
- static void *mem_ctx;
-
- void init_ralloc_type_ctx(void);
+ void *mem_ctx;
/** Constructor for vector and matrix types */
glsl_type(GLenum gl_type,