Fixed FBO extension not loading on old hardware
Former-commit-id: 5353ce64e5c2508f7cbc624139e4c823c86bf0fc
This commit is contained in:
parent
c67b0d709f
commit
efd0f5eaf6
|
|
@ -23,8 +23,7 @@ class NAZARA_API NzRenderTexture : public NzRenderTarget, NzResourceListener, Nz
|
||||||
~NzRenderTexture();
|
~NzRenderTexture();
|
||||||
|
|
||||||
bool AttachBuffer(nzAttachmentPoint attachmentPoint, nzUInt8 index, nzPixelFormat format);
|
bool AttachBuffer(nzAttachmentPoint attachmentPoint, nzUInt8 index, nzPixelFormat format);
|
||||||
bool AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture);
|
bool AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture, unsigned int z = 0);
|
||||||
bool AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture, unsigned int z);
|
|
||||||
|
|
||||||
bool Create(unsigned int width, unsigned int height, bool lock = false);
|
bool Create(unsigned int width, unsigned int height, bool lock = false);
|
||||||
void Destroy();
|
void Destroy();
|
||||||
|
|
|
||||||
|
|
@ -340,6 +340,7 @@ bool NzOpenGL::Initialize()
|
||||||
if (!glBindFragDataLocation)
|
if (!glBindFragDataLocation)
|
||||||
glBindFragDataLocation = reinterpret_cast<PFNGLBINDFRAGDATALOCATIONEXTPROC>(LoadEntry("glBindFragDataLocationEXT", false));
|
glBindFragDataLocation = reinterpret_cast<PFNGLBINDFRAGDATALOCATIONEXTPROC>(LoadEntry("glBindFragDataLocationEXT", false));
|
||||||
|
|
||||||
|
glFramebufferTexture = reinterpret_cast<PFNGLFRAMEBUFFERTEXTUREPROC>(LoadEntry("glFramebufferTexture", false));
|
||||||
glGetStringi = reinterpret_cast<PFNGLGETSTRINGIPROC>(LoadEntry("glGetStringi", false));
|
glGetStringi = reinterpret_cast<PFNGLGETSTRINGIPROC>(LoadEntry("glGetStringi", false));
|
||||||
glMapBufferRange = reinterpret_cast<PFNGLMAPBUFFERRANGEPROC>(LoadEntry("glMapBufferRange", false));
|
glMapBufferRange = reinterpret_cast<PFNGLMAPBUFFERRANGEPROC>(LoadEntry("glMapBufferRange", false));
|
||||||
glInvalidateBufferData = reinterpret_cast<PFNGLINVALIDATEBUFFERDATAPROC>(LoadEntry("glInvalidateBufferData", false));
|
glInvalidateBufferData = reinterpret_cast<PFNGLINVALIDATEBUFFERDATAPROC>(LoadEntry("glInvalidateBufferData", false));
|
||||||
|
|
@ -474,7 +475,6 @@ bool NzOpenGL::Initialize()
|
||||||
glDeleteFramebuffers = reinterpret_cast<PFNGLDELETEFRAMEBUFFERSPROC>(LoadEntry("glDeleteFramebuffers"));
|
glDeleteFramebuffers = reinterpret_cast<PFNGLDELETEFRAMEBUFFERSPROC>(LoadEntry("glDeleteFramebuffers"));
|
||||||
glDeleteRenderbuffers = reinterpret_cast<PFNGLDELETERENDERBUFFERSPROC>(LoadEntry("glDeleteRenderbuffers"));
|
glDeleteRenderbuffers = reinterpret_cast<PFNGLDELETERENDERBUFFERSPROC>(LoadEntry("glDeleteRenderbuffers"));
|
||||||
glFramebufferRenderbuffer = reinterpret_cast<PFNGLFRAMEBUFFERRENDERBUFFERPROC>(LoadEntry("glFramebufferRenderbuffer"));
|
glFramebufferRenderbuffer = reinterpret_cast<PFNGLFRAMEBUFFERRENDERBUFFERPROC>(LoadEntry("glFramebufferRenderbuffer"));
|
||||||
glFramebufferTexture = reinterpret_cast<PFNGLFRAMEBUFFERTEXTUREPROC>(LoadEntry("glFramebufferTexture"));
|
|
||||||
glFramebufferTexture1D = reinterpret_cast<PFNGLFRAMEBUFFERTEXTURE1DPROC>(LoadEntry("glFramebufferTexture1D"));
|
glFramebufferTexture1D = reinterpret_cast<PFNGLFRAMEBUFFERTEXTURE1DPROC>(LoadEntry("glFramebufferTexture1D"));
|
||||||
glFramebufferTexture2D = reinterpret_cast<PFNGLFRAMEBUFFERTEXTURE2DPROC>(LoadEntry("glFramebufferTexture2D"));
|
glFramebufferTexture2D = reinterpret_cast<PFNGLFRAMEBUFFERTEXTURE2DPROC>(LoadEntry("glFramebufferTexture2D"));
|
||||||
glFramebufferTexture3D = reinterpret_cast<PFNGLFRAMEBUFFERTEXTURE3DPROC>(LoadEntry("glFramebufferTexture3D"));
|
glFramebufferTexture3D = reinterpret_cast<PFNGLFRAMEBUFFERTEXTURE3DPROC>(LoadEntry("glFramebufferTexture3D"));
|
||||||
|
|
|
||||||
|
|
@ -144,84 +144,6 @@ bool NzRenderTexture::AttachBuffer(nzAttachmentPoint attachmentPoint, nzUInt8 in
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NzRenderTexture::AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture)
|
|
||||||
{
|
|
||||||
#if NAZARA_RENDERER_SAFE
|
|
||||||
if (!m_impl)
|
|
||||||
{
|
|
||||||
NazaraError("Render texture not created");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (attachmentPoint != nzAttachmentPoint_Color && index > 0)
|
|
||||||
{
|
|
||||||
NazaraError("Index must be 0 for non-color attachments");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int depthStencilIndex = attachmentIndex[nzAttachmentPoint_DepthStencil];
|
|
||||||
if (attachmentPoint == nzAttachmentPoint_Stencil && m_impl->attachements.size() > depthStencilIndex &&
|
|
||||||
m_impl->attachements[depthStencilIndex].isUsed)
|
|
||||||
{
|
|
||||||
NazaraError("Stencil target already attached by DepthStencil attachment");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!texture || !texture->IsValid())
|
|
||||||
{
|
|
||||||
NazaraError("Invalid texture");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texture->GetWidth() < m_impl->width || texture->GetHeight() < m_impl->height)
|
|
||||||
{
|
|
||||||
NazaraError("Texture cannot be smaller than render texture");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (texture->GetRenderTexture() != nullptr)
|
|
||||||
{
|
|
||||||
NazaraError("Texture already used by another render texture");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (formatTypeToAttachment[NzPixelFormat::GetType(texture->GetFormat())] != attachmentPoint)
|
|
||||||
{
|
|
||||||
NazaraError("Pixel format type does not match attachment point type");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!Lock())
|
|
||||||
{
|
|
||||||
NazaraError("Failed to lock render texture");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Détachement de l'attache précédente (Si il y a)
|
|
||||||
Detach(attachmentPoint, index);
|
|
||||||
|
|
||||||
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, texture->GetOpenGLID(), 0);
|
|
||||||
Unlock();
|
|
||||||
|
|
||||||
unsigned int minSize = attachmentIndex[attachmentPoint]+index+1;
|
|
||||||
if (m_impl->attachements.size() < minSize)
|
|
||||||
m_impl->attachements.resize(minSize);
|
|
||||||
|
|
||||||
Attachment& attachment = m_impl->attachements[minSize-1];
|
|
||||||
attachment.isBuffer = true;
|
|
||||||
attachment.isUsed = true;
|
|
||||||
attachment.texture = texture;
|
|
||||||
|
|
||||||
texture->AddResourceListener(this, minSize-1);
|
|
||||||
texture->SetRenderTexture(this);
|
|
||||||
|
|
||||||
m_impl->checked = false;
|
|
||||||
m_impl->drawBuffersUpdated = false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NzRenderTexture::AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture, unsigned int z)
|
bool NzRenderTexture::AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 index, NzTexture* texture, unsigned int z)
|
||||||
{
|
{
|
||||||
#if NAZARA_RENDERER_SAFE
|
#if NAZARA_RENDERER_SAFE
|
||||||
|
|
@ -315,6 +237,7 @@ bool NzRenderTexture::AttachTexture(nzAttachmentPoint attachmentPoint, nzUInt8 i
|
||||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, NzOpenGL::CubemapFace[z], texture->GetOpenGLID(), 0);
|
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, NzOpenGL::CubemapFace[z], texture->GetOpenGLID(), 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Unlock();
|
Unlock();
|
||||||
|
|
||||||
unsigned int minSize = attachmentIndex[attachmentPoint]+index+1;
|
unsigned int minSize = attachmentIndex[attachmentPoint]+index+1;
|
||||||
|
|
@ -471,7 +394,11 @@ void NzRenderTexture::Detach(nzAttachmentPoint attachmentPoint, nzUInt8 index)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, 0, 0);
|
if (glFramebufferTexture)
|
||||||
|
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, 0, 0);
|
||||||
|
else
|
||||||
|
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, NzOpenGL::Attachment[attachmentPoint]+index, 0, 0, 0);
|
||||||
|
|
||||||
attachement.texture->RemoveResourceListener(this);
|
attachement.texture->RemoveResourceListener(this);
|
||||||
attachement.texture->SetRenderTexture(nullptr);
|
attachement.texture->SetRenderTexture(nullptr);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue