mirror of https://github.com/PCSX2/pcsx2.git
gsdx ogl: use vector for layout parameter of Vertex Array
And keep the state in the object
This commit is contained in:
parent
8a93a71504
commit
5694ef56ca
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****************************************************************
|
// ****************************************************************
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue