Fixed buffer corruption bugs ! (Yeah !)
Former-commit-id: 3e2c82a786810a160d324f8ccf284f8e505613a0
This commit is contained in:
parent
74d396a376
commit
fe6816b089
|
|
@ -77,6 +77,7 @@ class NAZARA_API NzOpenGL
|
||||||
static void BindProgram(GLuint id);
|
static void BindProgram(GLuint id);
|
||||||
static void BindTexture(nzImageType type, GLuint id);
|
static void BindTexture(nzImageType type, GLuint id);
|
||||||
static void BindTexture(unsigned int textureUnit, nzImageType type, GLuint id);
|
static void BindTexture(unsigned int textureUnit, nzImageType type, GLuint id);
|
||||||
|
static void BindTextureUnit(unsigned int textureUnit);
|
||||||
|
|
||||||
static void DeleteBuffer(nzBufferType type, GLuint id);
|
static void DeleteBuffer(nzBufferType type, GLuint id);
|
||||||
static void DeleteProgram(GLuint id);
|
static void DeleteProgram(GLuint id);
|
||||||
|
|
@ -85,6 +86,7 @@ class NAZARA_API NzOpenGL
|
||||||
static GLuint GetCurrentBuffer(nzBufferType type);
|
static GLuint GetCurrentBuffer(nzBufferType type);
|
||||||
static GLuint GetCurrentProgram();
|
static GLuint GetCurrentProgram();
|
||||||
static GLuint GetCurrentTexture();
|
static GLuint GetCurrentTexture();
|
||||||
|
static GLuint GetCurrentTexture(unsigned int textureUnit);
|
||||||
static NzOpenGLFunc GetEntry(const NzString& entryPoint);
|
static NzOpenGLFunc GetEntry(const NzString& entryPoint);
|
||||||
static unsigned int GetGLSLVersion();
|
static unsigned int GetGLSLVersion();
|
||||||
static NzString GetRendererName();
|
static NzString GetRendererName();
|
||||||
|
|
@ -98,6 +100,10 @@ class NAZARA_API NzOpenGL
|
||||||
static bool IsSupported(nzOpenGLExtension extension);
|
static bool IsSupported(nzOpenGLExtension extension);
|
||||||
static bool IsSupported(const NzString& string);
|
static bool IsSupported(const NzString& string);
|
||||||
|
|
||||||
|
static void SetBuffer(nzBufferType type, GLuint id);
|
||||||
|
static void SetProgram(GLuint id);
|
||||||
|
static void SetTexture(GLuint id);
|
||||||
|
static void SetTexture(unsigned int textureUnit, GLuint id);
|
||||||
static void SetTextureUnit(unsigned int textureUnit);
|
static void SetTextureUnit(unsigned int textureUnit);
|
||||||
|
|
||||||
static bool TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType target);
|
static bool TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType target);
|
||||||
|
|
|
||||||
|
|
@ -66,19 +66,6 @@ m_parent(parent)
|
||||||
|
|
||||||
NzHardwareBuffer::~NzHardwareBuffer() = default;
|
NzHardwareBuffer::~NzHardwareBuffer() = default;
|
||||||
|
|
||||||
void NzHardwareBuffer::Bind()
|
|
||||||
{
|
|
||||||
#ifdef NAZARA_DEBUG
|
|
||||||
if (NzContext::GetCurrent() == nullptr)
|
|
||||||
{
|
|
||||||
NazaraError("No active context");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
glBindBuffer(NzOpenGL::BufferTarget[m_type], m_buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NzHardwareBuffer::Create(unsigned int size, nzBufferUsage usage)
|
bool NzHardwareBuffer::Create(unsigned int size, nzBufferUsage usage)
|
||||||
{
|
{
|
||||||
NzContext::EnsureContext();
|
NzContext::EnsureContext();
|
||||||
|
|
@ -178,3 +165,13 @@ bool NzHardwareBuffer::Unmap()
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NzHardwareBuffer::Bind() const
|
||||||
|
{
|
||||||
|
NzOpenGL::BindBuffer(m_type, m_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int NzHardwareBuffer::GetOpenGLID() const
|
||||||
|
{
|
||||||
|
return m_buffer;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,6 @@ class NzHardwareBuffer : public NzAbstractBuffer
|
||||||
NzHardwareBuffer(NzBuffer* parent, nzBufferType type);
|
NzHardwareBuffer(NzBuffer* parent, nzBufferType type);
|
||||||
~NzHardwareBuffer();
|
~NzHardwareBuffer();
|
||||||
|
|
||||||
void Bind();
|
|
||||||
|
|
||||||
bool Create(unsigned int size, nzBufferUsage usage = nzBufferUsage_Static);
|
bool Create(unsigned int size, nzBufferUsage usage = nzBufferUsage_Static);
|
||||||
void Destroy();
|
void Destroy();
|
||||||
|
|
||||||
|
|
@ -29,6 +27,10 @@ class NzHardwareBuffer : public NzAbstractBuffer
|
||||||
void* Map(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0);
|
void* Map(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0);
|
||||||
bool Unmap();
|
bool Unmap();
|
||||||
|
|
||||||
|
// Fonctions OpenGL
|
||||||
|
void Bind() const;
|
||||||
|
unsigned int GetOpenGLID() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLuint m_buffer;
|
GLuint m_buffer;
|
||||||
nzBufferType m_type;
|
nzBufferType m_type;
|
||||||
|
|
|
||||||
|
|
@ -342,13 +342,22 @@ void NzOpenGL::BindTexture(unsigned int textureUnit, nzImageType type, GLuint id
|
||||||
|
|
||||||
if (s_contextStates->texturesBinding[textureUnit] != id)
|
if (s_contextStates->texturesBinding[textureUnit] != id)
|
||||||
{
|
{
|
||||||
SetTextureUnit(textureUnit);
|
BindTextureUnit(textureUnit);
|
||||||
|
|
||||||
glBindTexture(TextureTarget[type], id);
|
glBindTexture(TextureTarget[type], id);
|
||||||
s_contextStates->texturesBinding[textureUnit] = id;
|
s_contextStates->texturesBinding[textureUnit] = id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NzOpenGL::BindTextureUnit(unsigned int textureUnit)
|
||||||
|
{
|
||||||
|
if (s_contextStates->textureUnit != textureUnit)
|
||||||
|
{
|
||||||
|
glActiveTexture(GL_TEXTURE0 + textureUnit);
|
||||||
|
s_contextStates->textureUnit = textureUnit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void NzOpenGL::DeleteBuffer(nzBufferType type, GLuint id)
|
void NzOpenGL::DeleteBuffer(nzBufferType type, GLuint id)
|
||||||
{
|
{
|
||||||
#ifdef NAZARA_DEBUG
|
#ifdef NAZARA_DEBUG
|
||||||
|
|
@ -424,6 +433,32 @@ GLuint NzOpenGL::GetCurrentProgram()
|
||||||
return s_contextStates->currentProgram;
|
return s_contextStates->currentProgram;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLuint NzOpenGL::GetCurrentTexture()
|
||||||
|
{
|
||||||
|
#ifdef NAZARA_DEBUG
|
||||||
|
if (!s_contextStates)
|
||||||
|
{
|
||||||
|
NazaraError("No context activated");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return s_contextStates->texturesBinding[s_contextStates->textureUnit];
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint NzOpenGL::GetCurrentTexture(unsigned int textureUnit)
|
||||||
|
{
|
||||||
|
#ifdef NAZARA_DEBUG
|
||||||
|
if (!s_contextStates)
|
||||||
|
{
|
||||||
|
NazaraError("No context activated");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return s_contextStates->texturesBinding[textureUnit];
|
||||||
|
}
|
||||||
|
|
||||||
NzOpenGLFunc NzOpenGL::GetEntry(const NzString& entryPoint)
|
NzOpenGLFunc NzOpenGL::GetEntry(const NzString& entryPoint)
|
||||||
{
|
{
|
||||||
return LoadEntry(entryPoint.GetConstBuffer(), false);
|
return LoadEntry(entryPoint.GetConstBuffer(), false);
|
||||||
|
|
@ -1046,13 +1081,69 @@ bool NzOpenGL::IsSupported(const NzString& string)
|
||||||
return s_openGLextensionSet.find(string) != s_openGLextensionSet.end();
|
return s_openGLextensionSet.find(string) != s_openGLextensionSet.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NzOpenGL::SetBuffer(nzBufferType type, GLuint id)
|
||||||
|
{
|
||||||
|
#ifdef NAZARA_DEBUG
|
||||||
|
if (!s_contextStates)
|
||||||
|
{
|
||||||
|
NazaraError("No context activated");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s_contextStates->buffersBinding[type] = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NzOpenGL::SetProgram(GLuint id)
|
||||||
|
{
|
||||||
|
#ifdef NAZARA_DEBUG
|
||||||
|
if (!s_contextStates)
|
||||||
|
{
|
||||||
|
NazaraError("No context activated");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s_contextStates->currentProgram = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NzOpenGL::SetTexture(GLuint id)
|
||||||
|
{
|
||||||
|
#ifdef NAZARA_DEBUG
|
||||||
|
if (!s_contextStates)
|
||||||
|
{
|
||||||
|
NazaraError("No context activated");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s_contextStates->texturesBinding[s_contextStates->textureUnit] = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NzOpenGL::SetTexture(unsigned int textureUnit, GLuint id)
|
||||||
|
{
|
||||||
|
#ifdef NAZARA_DEBUG
|
||||||
|
if (!s_contextStates)
|
||||||
|
{
|
||||||
|
NazaraError("No context activated");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s_contextStates->texturesBinding[textureUnit] = id;
|
||||||
|
}
|
||||||
|
|
||||||
void NzOpenGL::SetTextureUnit(unsigned int textureUnit)
|
void NzOpenGL::SetTextureUnit(unsigned int textureUnit)
|
||||||
{
|
{
|
||||||
if (s_contextStates->textureUnit != textureUnit)
|
#ifdef NAZARA_DEBUG
|
||||||
|
if (!s_contextStates)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE0 + textureUnit);
|
NazaraError("No context activated");
|
||||||
s_contextStates->textureUnit = textureUnit;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
s_contextStates->textureUnit = textureUnit;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType type)
|
bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType type)
|
||||||
|
|
|
||||||
|
|
@ -1258,7 +1258,7 @@ bool NzRenderer::EnsureStateUpdate()
|
||||||
|
|
||||||
if (!unit.textureUpdated)
|
if (!unit.textureUpdated)
|
||||||
{
|
{
|
||||||
NzOpenGL::SetTextureUnit(i);
|
NzOpenGL::BindTextureUnit(i);
|
||||||
unit.texture->Bind();
|
unit.texture->Bind();
|
||||||
|
|
||||||
unit.textureUpdated = true;
|
unit.textureUpdated = true;
|
||||||
|
|
@ -1277,7 +1277,7 @@ bool NzRenderer::EnsureStateUpdate()
|
||||||
{
|
{
|
||||||
TextureUnit& unit = s_textureUnits[i];
|
TextureUnit& unit = s_textureUnits[i];
|
||||||
|
|
||||||
NzOpenGL::SetTextureUnit(i);
|
NzOpenGL::BindTextureUnit(i);
|
||||||
|
|
||||||
unit.texture->Bind();
|
unit.texture->Bind();
|
||||||
unit.textureUpdated = true;
|
unit.textureUpdated = true;
|
||||||
|
|
@ -1361,7 +1361,7 @@ bool NzRenderer::EnsureStateUpdate()
|
||||||
unsigned int stride;
|
unsigned int stride;
|
||||||
|
|
||||||
NzHardwareBuffer* vertexBufferImpl = static_cast<NzHardwareBuffer*>(s_vertexBuffer->GetBuffer()->GetImpl());
|
NzHardwareBuffer* vertexBufferImpl = static_cast<NzHardwareBuffer*>(s_vertexBuffer->GetBuffer()->GetImpl());
|
||||||
vertexBufferImpl->Bind();
|
glBindBuffer(NzOpenGL::BufferTarget[nzBufferType_Vertex], vertexBufferImpl->GetOpenGLID());
|
||||||
|
|
||||||
bufferOffset = s_vertexBuffer->GetStartOffset();
|
bufferOffset = s_vertexBuffer->GetStartOffset();
|
||||||
vertexDeclaration = s_vertexBuffer->GetVertexDeclaration();
|
vertexDeclaration = s_vertexBuffer->GetVertexDeclaration();
|
||||||
|
|
@ -1390,7 +1390,7 @@ bool NzRenderer::EnsureStateUpdate()
|
||||||
if (s_instancing)
|
if (s_instancing)
|
||||||
{
|
{
|
||||||
NzHardwareBuffer* instanceBufferImpl = static_cast<NzHardwareBuffer*>(s_instanceBuffer.GetBuffer()->GetImpl());
|
NzHardwareBuffer* instanceBufferImpl = static_cast<NzHardwareBuffer*>(s_instanceBuffer.GetBuffer()->GetImpl());
|
||||||
instanceBufferImpl->Bind();
|
glBindBuffer(NzOpenGL::BufferTarget[nzBufferType_Vertex], instanceBufferImpl->GetOpenGLID());
|
||||||
|
|
||||||
bufferOffset = s_instanceBuffer.GetStartOffset();
|
bufferOffset = s_instanceBuffer.GetStartOffset();
|
||||||
vertexDeclaration = s_instanceBuffer.GetVertexDeclaration();
|
vertexDeclaration = s_instanceBuffer.GetVertexDeclaration();
|
||||||
|
|
@ -1427,7 +1427,7 @@ bool NzRenderer::EnsureStateUpdate()
|
||||||
if (s_indexBuffer)
|
if (s_indexBuffer)
|
||||||
{
|
{
|
||||||
NzHardwareBuffer* indexBufferImpl = static_cast<NzHardwareBuffer*>(s_indexBuffer->GetBuffer()->GetImpl());
|
NzHardwareBuffer* indexBufferImpl = static_cast<NzHardwareBuffer*>(s_indexBuffer->GetBuffer()->GetImpl());
|
||||||
indexBufferImpl->Bind();
|
glBindBuffer(NzOpenGL::BufferTarget[nzBufferType_Index], indexBufferImpl->GetOpenGLID());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
glBindBuffer(NzOpenGL::BufferTarget[nzBufferType_Index], 0);
|
glBindBuffer(NzOpenGL::BufferTarget[nzBufferType_Index], 0);
|
||||||
|
|
@ -1442,6 +1442,10 @@ bool NzRenderer::EnsureStateUpdate()
|
||||||
// En cas de non-support des VAOs, les attributs doivent être respécifiés à chaque frame
|
// En cas de non-support des VAOs, les attributs doivent être respécifiés à chaque frame
|
||||||
s_updateFlags &= ~Update_VAO;
|
s_updateFlags &= ~Update_VAO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// On invalide les bindings des buffers (pour éviter des bugs)
|
||||||
|
NzOpenGL::SetBuffer(nzBufferType_Index, 0);
|
||||||
|
NzOpenGL::SetBuffer(nzBufferType_Vertex, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NAZARA_DEBUG
|
#ifdef NAZARA_DEBUG
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue