diff options
author | Mike Erwin <significant.bit@gmail.com> | 2017-04-07 23:00:03 +0300 |
---|---|---|
committer | Mike Erwin <significant.bit@gmail.com> | 2017-04-07 23:00:03 +0300 |
commit | c1dc078840541bd64f95fdeca52267c75a061e04 (patch) | |
tree | 86ac278dfa321e509e34a5afad9b5ab3300e6a6f /intern | |
parent | 1ad52872604efb0a11011bcc7cd198c56ea97163 (diff) |
Gawain: remove GL enum from vertex format API
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.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/gawain/gawain/vertex_format.h | 17 | ||||
-rw-r--r-- | intern/gawain/src/batch.c | 6 | ||||
-rw-r--r-- | intern/gawain/src/immediate.c | 6 | ||||
-rw-r--r-- | intern/gawain/src/vertex_format.c | 24 |
4 files changed, 37 insertions, 16 deletions
diff --git a/intern/gawain/gawain/vertex_format.h b/intern/gawain/gawain/vertex_format.h index fcebaec8772..a5cab4a9d99 100644 --- a/intern/gawain/gawain/vertex_format.h +++ b/intern/gawain/gawain/vertex_format.h @@ -22,17 +22,17 @@ // ^-- 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 - COMP_I10 = GL_INT_2_10_10_10_REV + COMP_I10 #endif } VertexCompType; @@ -45,6 +45,7 @@ typedef enum { 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 diff --git a/intern/gawain/src/batch.c b/intern/gawain/src/batch.c index cac34d445bb..68771e59383 100644 --- a/intern/gawain/src/batch.c +++ b/intern/gawain/src/batch.c @@ -137,13 +137,13 @@ static void Batch_update_program_bindings(Batch* batch) { 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: - 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: - glVertexAttribIPointer(loc, a->comp_ct, a->comp_type, stride, pointer); + glVertexAttribIPointer(loc, a->comp_ct, a->gl_comp_type, stride, pointer); } } } diff --git a/intern/gawain/src/immediate.c b/intern/gawain/src/immediate.c index e6d338afbc1..8867c541edc 100644 --- a/intern/gawain/src/immediate.c +++ b/intern/gawain/src/immediate.c @@ -329,13 +329,13 @@ static void immDrawSetup(void) { 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: - 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: - glVertexAttribIPointer(loc, a->comp_ct, a->comp_type, stride, pointer); + glVertexAttribIPointer(loc, a->comp_ct, a->gl_comp_type, stride, pointer); } } diff --git a/intern/gawain/src/vertex_format.c b/intern/gawain/src/vertex_format.c index b1fb7721e38..924cff42362 100644 --- a/intern/gawain/src/vertex_format.c +++ b/intern/gawain/src/vertex_format.c @@ -36,14 +36,33 @@ void VertexFormat_copy(VertexFormat* dest, const VertexFormat* src) 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 - 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}; - return sizes[type - GL_BYTE]; + return sizes[type]; } 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->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 |