gsdx ogl: use vector for layout parameter of Vertex Array

And keep the state in the object
This commit is contained in:
Gregory Hainaut 2018-08-27 14:32:23 +02:00
parent 8a93a71504
commit 5694ef56ca
2 changed files with 22 additions and 21 deletions

View File

@ -347,18 +347,17 @@ bool GSDeviceOGL::Create(const std::shared_ptr<GSWnd> &wnd)
GL_PUSH("GSDeviceOGL::Vertex Buffer"); GL_PUSH("GSDeviceOGL::Vertex Buffer");
static_assert(sizeof(GSVertexPT1) == sizeof(GSVertex), "wrong GSVertex size"); static_assert(sizeof(GSVertexPT1) == sizeof(GSVertex), "wrong GSVertex size");
GSInputLayoutOGL il_convert[] = std::vector<GSInputLayoutOGL> il_convert = {
{ {0, 2 , GL_FLOAT , GL_FALSE , sizeof(GSVertexPT1) , (const GLvoid*)(0) } ,
{2 , GL_FLOAT , GL_FALSE , sizeof(GSVertexPT1) , (const GLvoid*)(0) } , {1, 2 , GL_FLOAT , GL_FALSE , sizeof(GSVertexPT1) , (const GLvoid*)(16) } ,
{2 , GL_FLOAT , GL_FALSE , sizeof(GSVertexPT1) , (const GLvoid*)(16) } , {2, 4 , GL_UNSIGNED_BYTE , GL_FALSE , sizeof(GSVertex) , (const GLvoid*)(8) } ,
{4 , GL_UNSIGNED_BYTE , GL_FALSE , sizeof(GSVertex) , (const GLvoid*)(8) } , {3, 1 , GL_FLOAT , GL_FALSE , sizeof(GSVertex) , (const GLvoid*)(12) } ,
{1 , GL_FLOAT , GL_FALSE , sizeof(GSVertex) , (const GLvoid*)(12) } , {4, 2 , GL_UNSIGNED_SHORT , GL_FALSE , sizeof(GSVertex) , (const GLvoid*)(16) } ,
{2 , GL_UNSIGNED_SHORT , GL_FALSE , sizeof(GSVertex) , (const GLvoid*)(16) } , {5, 1 , GL_UNSIGNED_INT , GL_FALSE , sizeof(GSVertex) , (const GLvoid*)(20) } ,
{1 , GL_UNSIGNED_INT , GL_FALSE , sizeof(GSVertex) , (const GLvoid*)(20) } , {6, 2 , GL_UNSIGNED_SHORT , GL_FALSE , sizeof(GSVertex) , (const GLvoid*)(24) } ,
{2 , GL_UNSIGNED_SHORT , GL_FALSE , sizeof(GSVertex) , (const GLvoid*)(24) } , {7, 4 , GL_UNSIGNED_BYTE , GL_TRUE , sizeof(GSVertex) , (const GLvoid*)(28) } , // Only 1 byte is useful but hardware unit only support 4B
{4 , GL_UNSIGNED_BYTE , GL_TRUE , sizeof(GSVertex) , (const GLvoid*)(28) } , // Only 1 byte is useful but hardware unit only support 4B
}; };
m_va = new GSVertexBufferStateOGL(il_convert, countof(il_convert)); m_va = new GSVertexBufferStateOGL(il_convert);
} }
// **************************************************************** // ****************************************************************

View File

@ -28,6 +28,7 @@ extern uint64 g_vertex_upload_byte;
#endif #endif
struct GSInputLayoutOGL { struct GSInputLayoutOGL {
GLint location;
GLint size; GLint size;
GLenum type; GLenum type;
GLboolean normalize; GLboolean normalize;
@ -216,12 +217,13 @@ class GSVertexBufferStateOGL {
GLuint m_va; GLuint m_va;
GLenum m_topology; GLenum m_topology;
std::vector<GSInputLayoutOGL> m_layout;
// No copy constructor please // No copy constructor please
GSVertexBufferStateOGL(const GSVertexBufferStateOGL& ) = delete; GSVertexBufferStateOGL(const GSVertexBufferStateOGL& ) = delete;
public: public:
GSVertexBufferStateOGL(GSInputLayoutOGL* layout, uint32 layout_nbr) : m_vb(NULL), m_ib(NULL), m_topology(0) GSVertexBufferStateOGL(const std::vector<GSInputLayoutOGL>& layout) : m_vb(NULL), m_ib(NULL), m_topology(0), m_layout(layout)
{ {
glGenVertexArrays(1, &m_va); glGenVertexArrays(1, &m_va);
glBindVertexArray(m_va); glBindVertexArray(m_va);
@ -232,7 +234,7 @@ public:
m_vb->bind(); m_vb->bind();
m_ib->bind(); m_ib->bind();
set_internal_format(layout, layout_nbr); set_internal_format();
} }
void bind() void bind()
@ -243,23 +245,23 @@ public:
m_vb->bind(); m_vb->bind();
} }
void set_internal_format(GSInputLayoutOGL* layout, uint32 layout_nbr) void set_internal_format()
{ {
for (uint32 i = 0; i < layout_nbr; i++) { for (const auto &l : m_layout) {
// Note this function need both a vertex array object and a GL_ARRAY_BUFFER buffer // Note this function need both a vertex array object and a GL_ARRAY_BUFFER buffer
glEnableVertexAttribArray(i); glEnableVertexAttribArray(l.location);
switch (layout[i].type) { switch (l.type) {
case GL_UNSIGNED_SHORT: case GL_UNSIGNED_SHORT:
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
if (layout[i].normalize) { if (l.normalize) {
glVertexAttribPointer(i, layout[i].size, layout[i].type, layout[i].normalize, layout[i].stride, layout[i].offset); glVertexAttribPointer(l.location, l.size, l.type, l.normalize, l.stride, l.offset);
} else { } else {
// Rule: when shader use integral (not normalized) you must use glVertexAttribIPointer (note the extra I) // Rule: when shader use integral (not normalized) you must use glVertexAttribIPointer (note the extra I)
glVertexAttribIPointer(i, layout[i].size, layout[i].type, layout[i].stride, layout[i].offset); glVertexAttribIPointer(l.location, l.size, l.type, l.stride, l.offset);
} }
break; break;
default: default:
glVertexAttribPointer(i, layout[i].size, layout[i].type, layout[i].normalize, layout[i].stride, layout[i].offset); glVertexAttribPointer(l.location, l.size, l.type, l.normalize, l.stride, l.offset);
break; break;
} }
} }