Gawain: remove GL enum from vertex format API
authorMike Erwin <significant.bit@gmail.com>
Fri, 7 Apr 2017 20:00:03 +0000 (16:00 -0400)
committerMike Erwin <significant.bit@gmail.com>
Fri, 7 Apr 2017 20:00:03 +0000 (16:00 -0400)
Callers now have to use Gawain's COMP enum to specify vertex attributes.

This makes the API more bullet-proof (at least less vulnerable) since GLenum covers waaay more than component types.

Also prepares us for Vulkan.

intern/gawain/gawain/vertex_format.h
intern/gawain/src/batch.c
intern/gawain/src/immediate.c
intern/gawain/src/vertex_format.c

index fcebaec8772a8407f713f77061f06a1a86a039de..a5cab4a9d9978a21929ea32d5114ed6948e9080b 100644 (file)
 //   ^-- this is only guaranteed on Windows right now, will be true on all platforms soon
 
 typedef enum {
 //   ^-- 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_I8,
+       COMP_U8,
+       COMP_I16,
+       COMP_U16,
+       COMP_I32,
+       COMP_U32,
 
 
-       COMP_F32 = GL_FLOAT, // TODO: drop the GL_ equivalence here, use a private lookup table
+       COMP_F32,
 
 #if USE_10_10_10
 
 #if USE_10_10_10
-       COMP_I10 = GL_INT_2_10_10_10_REV
+       COMP_I10
 #endif
 } VertexCompType;
 
 #endif
 } VertexCompType;
 
@@ -45,6 +45,7 @@ typedef enum {
 
 typedef struct {
        VertexCompType comp_type;
 
 typedef struct {
        VertexCompType comp_type;
+       unsigned gl_comp_type;
        unsigned comp_ct; // 1 to 4
        unsigned sz; // size in bytes, 1 to 16
        unsigned offset; // from beginning of vertex, in bytes
        unsigned comp_ct; // 1 to 4
        unsigned sz; // size in bytes, 1 to 16
        unsigned offset; // from beginning of vertex, in bytes
index cac34d445bb06fdc4c983bb4b4377d981b073281..68771e593833ea5bcad997eebf052ec487b08196 100644 (file)
@@ -137,13 +137,13 @@ static void Batch_update_program_bindings(Batch* batch)
                                {
                                case KEEP_FLOAT:
                                case CONVERT_INT_TO_FLOAT:
                                {
                                case KEEP_FLOAT:
                                case CONVERT_INT_TO_FLOAT:
-                                       glVertexAttribPointer(loc, a->comp_ct, a->comp_type, GL_FALSE, stride, pointer);
+                                       glVertexAttribPointer(loc, a->comp_ct, a->gl_comp_type, GL_FALSE, stride, pointer);
                                        break;
                                case NORMALIZE_INT_TO_FLOAT:
                                        break;
                                case NORMALIZE_INT_TO_FLOAT:
-                                       glVertexAttribPointer(loc, a->comp_ct, a->comp_type, GL_TRUE, stride, pointer);
+                                       glVertexAttribPointer(loc, a->comp_ct, a->gl_comp_type, GL_TRUE, stride, pointer);
                                        break;
                                case KEEP_INT:
                                        break;
                                case KEEP_INT:
-                                       glVertexAttribIPointer(loc, a->comp_ct, a->comp_type, stride, pointer);
+                                       glVertexAttribIPointer(loc, a->comp_ct, a->gl_comp_type, stride, pointer);
                                }
                        }
                }
                                }
                        }
                }
index e6d338afbc1685280881af429aa91f62823ce98f..8867c541edc3dec6821d7b7b6dd43e34166d3b7e 100644 (file)
@@ -329,13 +329,13 @@ static void immDrawSetup(void)
                        {
                        case KEEP_FLOAT:
                        case CONVERT_INT_TO_FLOAT:
                        {
                        case KEEP_FLOAT:
                        case CONVERT_INT_TO_FLOAT:
-                               glVertexAttribPointer(loc, a->comp_ct, a->comp_type, GL_FALSE, stride, pointer);
+                               glVertexAttribPointer(loc, a->comp_ct, a->gl_comp_type, GL_FALSE, stride, pointer);
                                break;
                        case NORMALIZE_INT_TO_FLOAT:
                                break;
                        case NORMALIZE_INT_TO_FLOAT:
-                               glVertexAttribPointer(loc, a->comp_ct, a->comp_type, GL_TRUE, stride, pointer);
+                               glVertexAttribPointer(loc, a->comp_ct, a->gl_comp_type, GL_TRUE, stride, pointer);
                                break;
                        case KEEP_INT:
                                break;
                        case KEEP_INT:
-                               glVertexAttribIPointer(loc, a->comp_ct, a->comp_type, stride, pointer);
+                               glVertexAttribIPointer(loc, a->comp_ct, a->gl_comp_type, stride, pointer);
                        }
                }
 
                        }
                }
 
index b1fb7721e38043e348756d6693f126f003bd8f5b..924cff423620bc0be9705a679b47715380777fd4 100644 (file)
@@ -36,14 +36,33 @@ void VertexFormat_copy(VertexFormat* dest, const VertexFormat* src)
        memcpy(dest, src, sizeof(VertexFormat));
        }
 
        memcpy(dest, src, sizeof(VertexFormat));
        }
 
+static GLenum convert_comp_type_to_gl(VertexCompType type)
+       {
+       static const GLenum table[] = {
+               [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,
+
+       #if USE_10_10_10
+               [COMP_I10] = GL_INT_2_10_10_10_REV
+       #endif
+               };
+       return table[type];
+       }
+
 static unsigned comp_sz(VertexCompType type)
        {
 #if TRUST_NO_ONE
 static unsigned comp_sz(VertexCompType type)
        {
 #if TRUST_NO_ONE
-       assert(type >= GL_BYTE && type <= GL_FLOAT);
+       assert(type <= COMP_F32); // other types have irregular sizes (not bytes)
 #endif
 
        const GLubyte sizes[] = {1,1,2,2,4,4,4};
 #endif
 
        const GLubyte sizes[] = {1,1,2,2,4,4,4};
-       return sizes[type - GL_BYTE];
+       return sizes[type];
        }
 
 static unsigned attrib_sz(const Attrib *a)
        }
 
 static unsigned attrib_sz(const Attrib *a)
@@ -137,6 +156,7 @@ unsigned VertexFormat_add_attrib(VertexFormat* format, const char* name, VertexC
 
        attrib->name = copy_attrib_name(format, name);
        attrib->comp_type = comp_type;
 
        attrib->name = copy_attrib_name(format, name);
        attrib->comp_type = comp_type;
+       attrib->gl_comp_type = convert_comp_type_to_gl(comp_type);
 #if USE_10_10_10
        attrib->comp_ct = (comp_type == COMP_I10) ? 4 : comp_ct; // system needs 10_10_10_2 to be 4 or BGRA
 #else
 #if USE_10_10_10
        attrib->comp_ct = (comp_type == COMP_I10) ? 4 : comp_ct; // system needs 10_10_10_2 to be 4 or BGRA
 #else