Greatly improved Renderer
Separated Viewport from Scissor rect Improved performances Removed Lock/Unlock system from Shader/Texture class Former-commit-id: f54bca6de58fe9d495d9192dc0d761f92594ee86
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#include <Nazara/Renderer/OpenGL.hpp>
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <Nazara/Renderer/Context.hpp>
|
||||
#include <cstring>
|
||||
#include <set>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
@@ -58,11 +59,15 @@ namespace
|
||||
}
|
||||
|
||||
std::set<NzString> s_openGLextensionSet;
|
||||
GLuint s_buffersBinding[nzBufferType_Max+1];
|
||||
GLuint s_currentProgram;
|
||||
GLuint s_texturesBinding[32]; // 32 est pour l'instant la plus haute limite (GL_TEXTURE31)
|
||||
const char* s_rendererName = nullptr;
|
||||
const char* s_vendorName = nullptr;
|
||||
bool s_initialized = false;
|
||||
bool s_openGLextensions[nzOpenGLExtension_Max+1] = {false};
|
||||
unsigned int s_openglVersion = 0;
|
||||
unsigned int s_textureUnit = 0;
|
||||
|
||||
bool LoadExtensionsString(const NzString& extensionString)
|
||||
{
|
||||
@@ -109,6 +114,64 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
void NzOpenGL::BindBuffer(nzBufferType type, GLuint id)
|
||||
{
|
||||
if (s_buffersBinding[type] != id)
|
||||
{
|
||||
glBindBuffer(BufferTarget[type], id);
|
||||
s_buffersBinding[type] = id;
|
||||
}
|
||||
}
|
||||
|
||||
void NzOpenGL::BindProgram(GLuint id)
|
||||
{
|
||||
if (s_currentProgram != id)
|
||||
{
|
||||
glUseProgram(id);
|
||||
s_currentProgram = id;
|
||||
}
|
||||
}
|
||||
|
||||
void NzOpenGL::BindTexture(nzImageType type, GLuint id)
|
||||
{
|
||||
if (s_texturesBinding[s_textureUnit] != id)
|
||||
{
|
||||
glBindTexture(TextureTarget[type], id);
|
||||
s_texturesBinding[s_textureUnit] = id;
|
||||
}
|
||||
}
|
||||
|
||||
void NzOpenGL::DeleteBuffer(nzBufferType type, GLuint id)
|
||||
{
|
||||
glDeleteBuffers(1, &id);
|
||||
if (s_buffersBinding[type] == id)
|
||||
s_buffersBinding[type] = 0;
|
||||
}
|
||||
|
||||
void NzOpenGL::DeleteProgram(GLuint id)
|
||||
{
|
||||
glDeleteProgram(id);
|
||||
if (s_currentProgram == id)
|
||||
s_currentProgram = 0;
|
||||
}
|
||||
|
||||
void NzOpenGL::DeleteTexture(GLuint id)
|
||||
{
|
||||
glDeleteTextures(1, &id);
|
||||
if (s_texturesBinding[s_textureUnit] == id)
|
||||
s_texturesBinding[s_textureUnit] = 0;
|
||||
}
|
||||
|
||||
GLuint NzOpenGL::GetCurrentBuffer(nzBufferType type)
|
||||
{
|
||||
return s_buffersBinding[type];
|
||||
}
|
||||
|
||||
GLuint NzOpenGL::GetCurrentProgram()
|
||||
{
|
||||
return s_currentProgram;
|
||||
}
|
||||
|
||||
NzOpenGLFunc NzOpenGL::GetEntry(const NzString& entryPoint)
|
||||
{
|
||||
return LoadEntry(entryPoint.GetConstBuffer(), false);
|
||||
@@ -119,6 +182,11 @@ NzString NzOpenGL::GetRendererName()
|
||||
return s_rendererName;
|
||||
}
|
||||
|
||||
unsigned int NzOpenGL::GetTextureUnit()
|
||||
{
|
||||
return s_textureUnit;
|
||||
}
|
||||
|
||||
NzString NzOpenGL::GetVendorName()
|
||||
{
|
||||
return s_vendorName;
|
||||
@@ -629,7 +697,12 @@ bool NzOpenGL::Initialize()
|
||||
return false;
|
||||
}
|
||||
|
||||
std::memset(s_buffersBinding, 0, (nzBufferType_Max+1)*sizeof(GLuint));
|
||||
std::memset(s_texturesBinding, 0, 32*sizeof(GLuint));
|
||||
|
||||
s_currentProgram = 0;
|
||||
s_rendererName = reinterpret_cast<const char*>(glGetString(GL_RENDERER));
|
||||
s_textureUnit = 0;
|
||||
s_vendorName = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
|
||||
|
||||
return true;
|
||||
@@ -650,6 +723,15 @@ bool NzOpenGL::IsSupported(const NzString& string)
|
||||
return s_openGLextensionSet.find(string) != s_openGLextensionSet.end();
|
||||
}
|
||||
|
||||
void NzOpenGL::SetTextureUnit(unsigned int textureUnit)
|
||||
{
|
||||
if (s_textureUnit != textureUnit)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE0 + textureUnit);
|
||||
s_textureUnit = textureUnit;
|
||||
}
|
||||
}
|
||||
|
||||
bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType type)
|
||||
{
|
||||
switch (pixelFormat)
|
||||
@@ -936,12 +1018,13 @@ GLenum NzOpenGL::RendererComparison[nzRendererComparison_Max+1] =
|
||||
|
||||
GLenum NzOpenGL::RendererParameter[nzRendererParameter_Max+1] =
|
||||
{
|
||||
GL_BLEND, // nzRendererParameter_Blend
|
||||
GL_NONE, // nzRendererParameter_ColorWrite
|
||||
GL_DEPTH_TEST, // nzRendererParameter_DepthTest
|
||||
GL_NONE, // nzRendererParameter_DepthWrite
|
||||
GL_CULL_FACE, // nzRendererParameter_FaceCulling
|
||||
GL_STENCIL_TEST // nzRendererParameter_Stencil
|
||||
GL_BLEND, // nzRendererParameter_Blend
|
||||
GL_NONE, // nzRendererParameter_ColorWrite
|
||||
GL_DEPTH_TEST, // nzRendererParameter_DepthTest
|
||||
GL_NONE, // nzRendererParameter_DepthWrite
|
||||
GL_CULL_FACE, // nzRendererParameter_FaceCulling
|
||||
GL_SCISSOR_TEST, // nzRendererParameter_ScissorTest
|
||||
GL_STENCIL_TEST // nzRendererParameter_StencilTest
|
||||
};
|
||||
|
||||
GLenum NzOpenGL::SamplerWrapMode[nzSamplerWrap_Max+1] =
|
||||
|
||||
Reference in New Issue
Block a user