Gawain: new enum type for vertex attrib components
Motivations: 1) GLenum is too broad; tightly-defined enum just for this is safer. 2) enable a Vulkan future New code should use these instead of GL_FLOAT etc. When all existing code has been updated to use new enum, we can drop compatibility with GLenum values. Early work towards 10_10_10 format, more to come soon.
This commit is contained in:
@@ -36,7 +36,7 @@ void VertexFormat_copy(VertexFormat* dest, const VertexFormat* src)
|
||||
memcpy(dest, src, sizeof(VertexFormat));
|
||||
}
|
||||
|
||||
static unsigned comp_sz(GLenum type)
|
||||
static unsigned comp_sz(VertexCompType type)
|
||||
{
|
||||
#if TRUST_NO_ONE
|
||||
assert(type >= GL_BYTE && type <= GL_FLOAT);
|
||||
@@ -48,11 +48,21 @@ static unsigned comp_sz(GLenum type)
|
||||
|
||||
static unsigned attrib_sz(const Attrib *a)
|
||||
{
|
||||
#if USE_10_10_10
|
||||
if (a->comp_type == COMP_I10)
|
||||
return 4; // always packed as 10_10_10_2
|
||||
#endif
|
||||
|
||||
return a->comp_ct * comp_sz(a->comp_type);
|
||||
}
|
||||
|
||||
static unsigned attrib_align(const Attrib *a)
|
||||
{
|
||||
#if USE_10_10_10
|
||||
if (a->comp_type == COMP_I10)
|
||||
return 4; // always packed as 10_10_10_2
|
||||
#endif
|
||||
|
||||
unsigned c = comp_sz(a->comp_type);
|
||||
if (a->comp_ct == 3 && c <= 2)
|
||||
return 4 * c; // AMD HW can't fetch these well, so pad it out (other vendors too?)
|
||||
@@ -96,7 +106,7 @@ static const char* copy_attrib_name(VertexFormat* format, const char* name)
|
||||
return name_copy;
|
||||
}
|
||||
|
||||
unsigned add_attrib(VertexFormat* format, const char* name, GLenum comp_type, unsigned comp_ct, VertexFetchMode fetch_mode)
|
||||
unsigned add_attrib(VertexFormat* format, const char* name, VertexCompType comp_type, unsigned comp_ct, VertexFetchMode fetch_mode)
|
||||
{
|
||||
#if TRUST_NO_ONE
|
||||
assert(format->attrib_ct < MAX_VERTEX_ATTRIBS); // there's room for more
|
||||
@@ -104,27 +114,19 @@ unsigned add_attrib(VertexFormat* format, const char* name, GLenum comp_type, un
|
||||
assert(comp_ct >= 1 && comp_ct <= 4);
|
||||
switch (comp_type)
|
||||
{
|
||||
case GL_FLOAT:
|
||||
case COMP_F32:
|
||||
// float type can only kept as float
|
||||
assert(fetch_mode == KEEP_FLOAT);
|
||||
break;
|
||||
#if 0 // enable this after switching to our own enum for comp_type
|
||||
#if USE_10_10_10
|
||||
case COMP_I10:
|
||||
assert(comp_ct == 3); // 10_10_10 format intended for normals (xyz) or colors (rgb)
|
||||
assert(fetch_mode == NORMALIZE_INT_TO_FLOAT);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
// integer types can be kept as int or converted/normalized to float
|
||||
assert(fetch_mode != KEEP_FLOAT);
|
||||
#else
|
||||
case GL_BYTE:
|
||||
case GL_UNSIGNED_BYTE:
|
||||
case GL_SHORT:
|
||||
case GL_UNSIGNED_SHORT:
|
||||
case GL_INT:
|
||||
case GL_UNSIGNED_INT:
|
||||
// integer types can be converted, normalized, or kept as int
|
||||
assert(fetch_mode != KEEP_FLOAT);
|
||||
break;
|
||||
default:
|
||||
assert(false); // invalid comp_type
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -17,6 +17,25 @@
|
||||
#define AVG_VERTEX_ATTRIB_NAME_LEN 5
|
||||
#define VERTEX_ATTRIB_NAMES_BUFFER_LEN ((AVG_VERTEX_ATTRIB_NAME_LEN + 1) * MAX_VERTEX_ATTRIBS)
|
||||
|
||||
#define USE_10_10_10 0
|
||||
// (GLEW_VERSION_3_3 || GLEW_ARB_vertex_type_2_10_10_10_rev)
|
||||
// ^-- this is only guaranteed on Windows right now, will be true on all platforms soon
|
||||
|
||||
typedef enum {
|
||||
COMP_I8 = GL_BYTE,
|
||||
COMP_U8 = GL_UNSIGNED_BYTE,
|
||||
COMP_I16 = GL_SHORT,
|
||||
COMP_U16 = GL_UNSIGNED_SHORT,
|
||||
COMP_I32 = GL_INT,
|
||||
COMP_U32 = GL_UNSIGNED_INT,
|
||||
|
||||
COMP_F32 = GL_FLOAT, // TODO: drop the GL_ equivalence here, use a private lookup table
|
||||
|
||||
#if USE_10_10_10
|
||||
COMP_I10 = GL_INT_2_10_10_10_REV
|
||||
#endif
|
||||
} VertexCompType;
|
||||
|
||||
typedef enum {
|
||||
KEEP_FLOAT,
|
||||
KEEP_INT,
|
||||
@@ -25,7 +44,7 @@ typedef enum {
|
||||
} VertexFetchMode;
|
||||
|
||||
typedef struct {
|
||||
GLenum comp_type;
|
||||
VertexCompType comp_type;
|
||||
unsigned comp_ct; // 1 to 4
|
||||
unsigned sz; // size in bytes, 1 to 16
|
||||
unsigned offset; // from beginning of vertex, in bytes
|
||||
@@ -45,7 +64,7 @@ typedef struct {
|
||||
void VertexFormat_clear(VertexFormat*);
|
||||
void VertexFormat_copy(VertexFormat* dest, const VertexFormat* src);
|
||||
|
||||
unsigned add_attrib(VertexFormat*, const char* name, GLenum comp_type, unsigned comp_ct, VertexFetchMode);
|
||||
unsigned add_attrib(VertexFormat*, const char* name, VertexCompType, unsigned comp_ct, VertexFetchMode);
|
||||
|
||||
// for internal use
|
||||
void VertexFormat_pack(VertexFormat*);
|
||||
|
||||
Reference in New Issue
Block a user