Element array buffer binding is part of VAO state

This commit is contained in:
baldurk
2014-11-29 01:58:00 +00:00
parent 87f9a15a3e
commit 71ef286e51
5 changed files with 21 additions and 4 deletions
+9
View File
@@ -57,6 +57,7 @@ struct VAOInitialData
{
VertexAttribInitialData VertexAttribs[16];
VertexBufferInitialData VertexBuffers[16];
ResourceId ElementArrayBuffer;
};
template<>
@@ -288,6 +289,10 @@ bool GLResourceManager::Prepare_InitialState(GLResource res)
gl.glGetIntegeri_v(eGL_VERTEX_BINDING_DIVISOR, i, (GLint *)&data->VertexBuffers[i].Divisor);
}
GLuint buffer = 0;
gl.glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&buffer);
data->ElementArrayBuffer = GetID(BufferRes(res.Context, buffer));
SetInitialContents(Id, InitialContentData(GLResource(MakeNullResource), 0, (byte *)data));
gl.glBindVertexArray(VAO);
@@ -738,6 +743,7 @@ bool GLResourceManager::Serialise_InitialState(GLResource res)
m_pSerialiser->Serialise("VertexAttrib[]", data.VertexAttribs[i]);
m_pSerialiser->Serialise("VertexBuffer[]", data.VertexBuffers[i]);
}
m_pSerialiser->Serialise("ElementArrayBuffer", data.ElementArrayBuffer);
if(m_State < WRITING)
{
@@ -864,6 +870,9 @@ void GLResourceManager::Apply_InitialState(GLResource live, InitialContentData i
gl.glBindVertexBuffer(i, buffer, (GLintptr)buf.Offset, (GLsizei)buf.Stride);
gl.glVertexBindingDivisor(i, buf.Divisor);
}
GLuint buffer = initialdata->ElementArrayBuffer == ResourceId() ? 0 : GetLiveResource(initialdata->ElementArrayBuffer).name;
gl.glBindBuffer(eGL_ELEMENT_ARRAY_BUFFER, buffer);
gl.glBindVertexArray(VAO);
}
-2
View File
@@ -157,7 +157,6 @@ void GLRenderState::FetchState()
m_Real->glGetIntegerv(eGL_COPY_WRITE_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Copy_Write]);
m_Real->glGetIntegerv(eGL_DRAW_INDIRECT_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Draw_Indirect]);
m_Real->glGetIntegerv(eGL_DISPATCH_INDIRECT_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Dispatch_Indirect]);
m_Real->glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Element_Array]);
m_Real->glGetIntegerv(eGL_PIXEL_PACK_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Pixel_Pack]);
m_Real->glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Pixel_Unpack]);
m_Real->glGetIntegerv(eGL_QUERY_BUFFER_BINDING, (GLint*)&BufferBindings[eBufIdx_Query]);
@@ -381,7 +380,6 @@ void GLRenderState::ApplyState()
m_Real->glBindBuffer(eGL_COPY_WRITE_BUFFER, BufferBindings[eBufIdx_Copy_Write]);
m_Real->glBindBuffer(eGL_DRAW_INDIRECT_BUFFER, BufferBindings[eBufIdx_Draw_Indirect]);
m_Real->glBindBuffer(eGL_DISPATCH_INDIRECT_BUFFER, BufferBindings[eBufIdx_Dispatch_Indirect]);
m_Real->glBindBuffer(eGL_ELEMENT_ARRAY_BUFFER, BufferBindings[eBufIdx_Element_Array]);
m_Real->glBindBuffer(eGL_PIXEL_PACK_BUFFER, BufferBindings[eBufIdx_Pixel_Pack]);
m_Real->glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, BufferBindings[eBufIdx_Pixel_Unpack]);
m_Real->glBindBuffer(eGL_QUERY_BUFFER, BufferBindings[eBufIdx_Query]);
-1
View File
@@ -99,7 +99,6 @@ struct GLRenderState
eBufIdx_Copy_Write,
eBufIdx_Draw_Indirect,
eBufIdx_Dispatch_Indirect,
eBufIdx_Element_Array,
eBufIdx_Pixel_Pack,
eBufIdx_Pixel_Unpack,
eBufIdx_Query,
+3 -1
View File
@@ -785,7 +785,9 @@ void GLReplay::SavePipelineState()
void *ctx = m_ReplayCtx.ctx;
pipe.m_VtxIn.ibuffer.Buffer = rm->GetOriginalID(rm->GetID(BufferRes(ctx, rs.BufferBindings[GLRenderState::eBufIdx_Element_Array])));
GLuint ibuffer = 0;
gl.glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&ibuffer);
pipe.m_VtxIn.ibuffer.Buffer = rm->GetOriginalID(rm->GetID(BufferRes(ctx, ibuffer)));
// Vertex buffers and attributes
GLint numVBufferBindings = 16;
@@ -160,6 +160,15 @@ void WrappedOpenGL::glBindBuffer(GLenum target, GLuint buffer)
r->AddChunk(chunk);
}
// element array buffer binding is vertex array record state, record there (if we've not just stopped)
if(m_State == WRITING_IDLE && target == eGL_ELEMENT_ARRAY_BUFFER && m_VertexArrayRecord && VertexArrayUpdateCheck())
{
SCOPED_SERIALISE_CONTEXT(BIND_BUFFER);
Serialise_glBindBuffer(target, buffer);
m_VertexArrayRecord->AddChunk(scope.Get());
}
}
}