Commit 92b77f2f authored by hybrid's avatar hybrid

Prepare for support of more ASM shader models.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@2929 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 8e400212
......@@ -26,8 +26,11 @@ COpenGLExtensionHandler::COpenGLExtensionHandler() :
MaxTextureLODBias(0.f), Version(0), ShaderLanguageVersion(0)
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
,pGlActiveTextureARB(0), pGlClientActiveTextureARB(0),
pGlGenProgramsARB(0), pGlBindProgramARB(0), pGlProgramStringARB(0),
pGlDeleteProgramsARB(0), pGlProgramLocalParameter4fvARB(0),
pGlGenProgramsARB(0), pGlGenProgramsNV(0),
pGlBindProgramARB(0), pGlBindProgramNV(0),
pGlDeleteProgramsARB(0), pGlDeleteProgramsNV(0),
pGlProgramStringARB(0), pGlLoadProgramNV(0),
pGlProgramLocalParameter4fvARB(0),
pGlCreateShaderObjectARB(0), pGlShaderSourceARB(0),
pGlCompileShaderARB(0), pGlCreateProgramObjectARB(0), pGlAttachObjectARB(0),
pGlLinkProgramARB(0), pGlUseProgramObjectARB(0), pGlDeleteObjectARB(0),
......@@ -127,9 +130,13 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
// get fragment and vertex program function pointers
pGlGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) wglGetProcAddress("glGenProgramsARB");
pGlGenProgramsNV = (PFNGLGENPROGRAMSNVPROC) wglGetProcAddress("glGenProgramsNV");
pGlBindProgramARB = (PFNGLBINDPROGRAMARBPROC) wglGetProcAddress("glBindProgramARB");
pGlBindProgramNV = (PFNGLBINDPROGRAMNVPROC) wglGetProcAddress("glBindProgramNV");
pGlProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) wglGetProcAddress("glProgramStringARB");
pGlDeleteProgramsARB = (PFNGLDELETEPROGRAMSNVPROC) wglGetProcAddress("glDeleteProgramsARB");
pGlLoadProgramNV = (PFNGLLOADPROGRAMNVPROC) wglGetProcAddress("glLoadProgramNV");
pGlDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) wglGetProcAddress("glDeleteProgramsARB");
pGlDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) wglGetProcAddress("glDeleteProgramsNV");
pGlProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) wglGetProcAddress("glProgramLocalParameter4fvARB");
pGlCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) wglGetProcAddress("glCreateShaderObjectARB");
pGlShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) wglGetProcAddress("glShaderSourceARB");
......@@ -243,14 +250,26 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer)
pGlGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGenProgramsARB"));
pGlGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glGenProgramsNV"));
pGlBindProgramARB = (PFNGLBINDPROGRAMARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glBindProgramARB"));
pGlBindProgramNV = (PFNGLBINDPROGRAMNVPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glBindProgramNV"));
pGlDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glDeleteProgramsARB"));
pGlDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glDeleteProgramsNV"));
pGlProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glProgramStringARB"));
pGlDeleteProgramsARB = (PFNGLDELETEPROGRAMSNVPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glDeleteProgramsARB"));
pGlLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glLoadProgramNV"));
pGlProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)
IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glProgramLocalParameter4fvARB"));
......@@ -550,10 +569,15 @@ bool COpenGLExtensionHandler::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
return FeatureAvailable[IRR_SGIS_generate_mipmap];
case EVDF_STENCIL_BUFFER:
return StencilBuffer;
case EVDF_VERTEX_SHADER_1_1:
case EVDF_ARB_VERTEX_PROGRAM_1:
return FeatureAvailable[IRR_ARB_vertex_program];
return FeatureAvailable[IRR_ARB_vertex_program] || FeatureAvailable[IRR_NV_vertex_program];
case EVDF_PIXEL_SHADER_1_1:
case EVDF_PIXEL_SHADER_1_2:
case EVDF_ARB_FRAGMENT_PROGRAM_1:
return FeatureAvailable[IRR_ARB_fragment_program];
return FeatureAvailable[IRR_ARB_fragment_program] || FeatureAvailable[IRR_NV_fragment_program];
case EVDF_PIXEL_SHADER_2_0:
case EVDF_VERTEX_SHADER_2_0:
case EVDF_ARB_GLSL:
return (FeatureAvailable[IRR_ARB_shading_language_100]||Version>=200);
case EVDF_TEXTURE_NSQUARE:
......
......@@ -852,6 +852,7 @@ class COpenGLExtensionHandler
void extGlGenPrograms(GLsizei n, GLuint *programs);
void extGlBindProgram(GLenum target, GLuint program);
void extGlProgramString(GLenum target, GLenum format, GLsizei len, const GLvoid *string);
void extGlLoadProgram(GLenum target, GLuint id, GLsizei len, const GLubyte *string);
void extGlDeletePrograms(GLsizei n, const GLuint *programs);
void extGlProgramLocalParameter4fv(GLenum, GLuint, const GLfloat *);
GLhandleARB extGlCreateShaderObject(GLenum shaderType);
......@@ -917,9 +918,13 @@ class COpenGLExtensionHandler
PFNGLACTIVETEXTUREARBPROC pGlActiveTextureARB;
PFNGLCLIENTACTIVETEXTUREARBPROC pGlClientActiveTextureARB;
PFNGLGENPROGRAMSARBPROC pGlGenProgramsARB;
PFNGLGENPROGRAMSNVPROC pGlGenProgramsNV;
PFNGLBINDPROGRAMARBPROC pGlBindProgramARB;
PFNGLBINDPROGRAMNVPROC pGlBindProgramNV;
PFNGLDELETEPROGRAMSARBPROC pGlDeleteProgramsARB;
PFNGLDELETEPROGRAMSNVPROC pGlDeleteProgramsNV;
PFNGLPROGRAMSTRINGARBPROC pGlProgramStringARB;
PFNGLDELETEPROGRAMSNVPROC pGlDeleteProgramsARB;
PFNGLLOADPROGRAMNVPROC pGlLoadProgramNV;
PFNGLPROGRAMLOCALPARAMETER4FVARBPROC pGlProgramLocalParameter4fvARB;
PFNGLCREATESHADEROBJECTARBPROC pGlCreateShaderObjectARB;
PFNGLSHADERSOURCEARBPROC pGlShaderSourceARB;
......@@ -1018,8 +1023,12 @@ inline void COpenGLExtensionHandler::extGlGenPrograms(GLsizei n, GLuint *program
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlGenProgramsARB)
pGlGenProgramsARB(n, programs);
#elif defined(GL_ARB_vertex_program)
else if (pGlGenProgramsNV)
pGlGenProgramsNV(n, programs);
#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
glGenProgramsARB(n,programs);
#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
glGenProgramsNV(n,programs);
#else
os::Printer::log("glGenPrograms not supported", ELL_ERROR);
#endif
......@@ -1030,8 +1039,12 @@ inline void COpenGLExtensionHandler::extGlBindProgram(GLenum target, GLuint prog
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlBindProgramARB)
pGlBindProgramARB(target, program);
#elif defined(GL_ARB_vertex_program)
else if (pGlBindProgramNV)
pGlBindProgramNV(target, program);
#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
glBindProgramARB(target, program);
#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
glBindProgramNV(target, program);
#else
os::Printer::log("glBindProgram not supported", ELL_ERROR);
#endif
......@@ -1042,20 +1055,36 @@ inline void COpenGLExtensionHandler::extGlProgramString(GLenum target, GLenum fo
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlProgramStringARB)
pGlProgramStringARB(target, format, len, string);
#elif defined(GL_ARB_vertex_program)
#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
glProgramStringARB(target,format,len,string);
#else
os::Printer::log("glProgramString not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlLoadProgram(GLenum target, GLuint id, GLsizei len, const GLubyte *string)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlLoadProgramNV)
pGlLoadProgramNV(target, id, len, string);
#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
glLoadProgramNV(target,id,len,string);
#else
os::Printer::log("glLoadProgram not supported", ELL_ERROR);
#endif
}
inline void COpenGLExtensionHandler::extGlDeletePrograms(GLsizei n, const GLuint *programs)
{
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlDeleteProgramsARB)
pGlDeleteProgramsARB(n, programs);
#elif defined(GL_ARB_vertex_program)
else if (pGlDeleteProgramsNV)
pGlDeleteProgramsNV(n, programs);
#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
glDeleteProgramsARB(n,programs);
#elif defined(GL_NV_vertex_program) || defined(GL_NV_fragment_program)
glDeleteProgramsNV(n,programs);
#else
os::Printer::log("glDeletePrograms not supported", ELL_ERROR);
#endif
......@@ -1066,7 +1095,7 @@ inline void COpenGLExtensionHandler::extGlProgramLocalParameter4fv(GLenum n, GLu
#ifdef _IRR_OPENGL_USE_EXTPOINTER_
if (pGlProgramLocalParameter4fvARB)
pGlProgramLocalParameter4fvARB(n,i,f);
#elif defined(GL_ARB_vertex_program)
#elif defined(GL_ARB_vertex_program) || defined(GL_ARB_fragment_program)
glProgramLocalParameter4fvARB(n,i,f);
#else
os::Printer::log("glProgramLocalParameter4fv not supported", ELL_ERROR);
......
......@@ -85,8 +85,9 @@ COpenGLShaderMaterialRenderer::~COpenGLShaderMaterialRenderer()
}
void COpenGLShaderMaterialRenderer::init(s32& outMaterialTypeNr, const c8* vertexShaderProgram,
const c8* pixelShaderProgram, E_VERTEX_TYPE type)
void COpenGLShaderMaterialRenderer::init(s32& outMaterialTypeNr,
const c8* vertexShaderProgram, const c8* pixelShaderProgram,
E_VERTEX_TYPE type)
{
outMaterialTypeNr = -1;
......@@ -119,41 +120,43 @@ void COpenGLShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& materi
{
if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates)
{
#ifdef GL_ARB_vertex_program
if (VertexShader)
{
// set new vertex shader
#ifdef GL_ARB_vertex_program
Driver->extGlBindProgram(GL_VERTEX_PROGRAM_ARB, VertexShader);
glEnable(GL_VERTEX_PROGRAM_ARB);
}
#elif defined(GL_NV_vertex_program)
Driver->extGlBindProgram(GL_VERTEX_PROGRAM_NV, VertexShader);
glEnable(GL_VERTEX_PROGRAM_NV);
#endif
}
// set new pixel shader
#ifdef GL_ARB_fragment_program
if (PixelShader[0])
{
if (!material.FogEnable)
{
Driver->extGlBindProgram(GL_FRAGMENT_PROGRAM_ARB, PixelShader[0]);
}
else
GLuint nextShader=PixelShader[0];
if (material.FogEnable)
{
GLint curFogMode;
glGetIntegerv(GL_FOG_MODE, &curFogMode);
// if (Driver->LinearFog && PixelShader[1])
if (curFogMode==GL_LINEAR && PixelShader[1])
Driver->extGlBindProgram(GL_FRAGMENT_PROGRAM_ARB, PixelShader[1]);
nextShader=PixelShader[1];
// else if (!Driver->LinearFog && PixelShader[2])
else if (curFogMode==GL_EXP && PixelShader[2])
Driver->extGlBindProgram(GL_FRAGMENT_PROGRAM_ARB, PixelShader[2]);
nextShader=PixelShader[2];
else if (curFogMode==GL_EXP2 && PixelShader[3])
Driver->extGlBindProgram(GL_FRAGMENT_PROGRAM_ARB, PixelShader[3]);
else
Driver->extGlBindProgram(GL_FRAGMENT_PROGRAM_ARB, PixelShader[0]);
nextShader=PixelShader[3];
}
#ifdef GL_ARB_fragment_program
Driver->extGlBindProgram(GL_FRAGMENT_PROGRAM_ARB, nextShader);
glEnable(GL_FRAGMENT_PROGRAM_ARB);
}
#elif defined(GL_NV_vertex_program)
Driver->extGlBindProgram(GL_FRAGMENT_PROGRAM_NV, nextShader);
glEnable(GL_FRAGMENT_PROGRAM_NV);
#endif
}
if (BaseMaterial)
BaseMaterial->OnSetMaterial(material, material, true, services);
......@@ -175,11 +178,17 @@ void COpenGLShaderMaterialRenderer::OnUnsetMaterial()
#ifdef GL_ARB_vertex_program
if (VertexShader)
glDisable(GL_VERTEX_PROGRAM_ARB);
#elif defined(GL_NV_vertex_program)
if (VertexShader)
glDisable(GL_VERTEX_PROGRAM_NV);
#endif
#ifdef GL_ARB_fragment_program
if (PixelShader[0])
glDisable(GL_FRAGMENT_PROGRAM_ARB);
#elif defined(GL_NV_vertex_program)
if (PixelShader[0])
glDisable(GL_FRAGMENT_PROGRAM_NV);
#endif
if (BaseMaterial)
......@@ -197,24 +206,27 @@ bool COpenGLShaderMaterialRenderer::isTransparent() const
// This method needs a properly cleaned error state before the checked instruction is called
bool COpenGLShaderMaterialRenderer::checkError(const irr::c8* type)
{
#ifdef GL_ARB_vertex_program
#if defined(GL_ARB_vertex_program) || defined(GL_NV_vertex_program)
GLenum g = glGetError();
if (g != GL_NO_ERROR)
{
GLint errPos;
glGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &errPos );
if (g == GL_NO_ERROR)
return false;
core::stringc errString = type;
errString += " compilation failed at position ";
errString += " compilation failed";
#if defined(GL_ARB_vertex_program)
errString += " at position ";
GLint errPos;
glGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &errPos );
errString += core::stringc(s32(errPos));
errString += ":\n";
errString += reinterpret_cast<const char*>(glGetString(GL_PROGRAM_ERROR_STRING_ARB));
#endif
#else
core::stringc errString("Shaders not supported.");
#endif
os::Printer::log(errString.c_str(), ELL_ERROR);
return true;
}
#endif
return false;
}
......@@ -244,17 +256,25 @@ bool COpenGLShaderMaterialRenderer::createPixelShader(const c8* pxsh)
}
shdr += inshdr.subString(pos+16, inshdr.size()-pos-16);
}
#ifdef GL_ARB_fragment_program
Driver->extGlGenPrograms(1, &PixelShader[i]);
#ifdef GL_ARB_fragment_program
Driver->extGlBindProgram(GL_FRAGMENT_PROGRAM_ARB, PixelShader[i]);
#elif defined GL_NV_vertex_program
Driver->extGlBindProgram(GL_FRAGMENT_PROGRAM_NV, PixelShader[i]);
#endif
// clear error buffer
while(glGetError() != GL_NO_ERROR)
{}
#ifdef GL_ARB_fragment_program
// compile
Driver->extGlProgramString(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
shdr.size(), shdr.c_str());
#elif defined GL_NV_vertex_program
Driver->extGlLoadProgram(GL_FRAGMENT_PROGRAM_NV, PixelShader[i],
shdr.size(), shdr.c_str());
#endif
if (checkError("Pixel shader"))
{
......@@ -263,9 +283,6 @@ bool COpenGLShaderMaterialRenderer::createPixelShader(const c8* pxsh)
return false;
}
#else
return false;
#endif
}
return true;
......@@ -277,17 +294,25 @@ bool COpenGLShaderMaterialRenderer::createVertexShader(const c8* vtxsh)
if (!vtxsh)
return true;
#ifdef GL_ARB_vertex_program
Driver->extGlGenPrograms(1, &VertexShader);
#ifdef GL_ARB_vertex_program
Driver->extGlBindProgram(GL_VERTEX_PROGRAM_ARB, VertexShader);
#elif defined GL_NV_vertex_program
Driver->extGlBindProgram(GL_VERTEX_PROGRAM_NV, VertexShader);
#endif
// clear error buffer
while(glGetError() != GL_NO_ERROR)
{}
// compile
#ifdef GL_ARB_vertex_program
Driver->extGlProgramString(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
(GLsizei)strlen(vtxsh), vtxsh);
#elif defined GL_NV_vertex_program
Driver->extGlLoadProgram(GL_VERTEX_PROGRAM_NV, VertexShader,
(GLsizei)strlen(vtxsh), vtxsh);
#endif
if (checkError("Vertex shader"))
{
......@@ -296,9 +321,6 @@ bool COpenGLShaderMaterialRenderer::createVertexShader(const c8* vtxsh)
return false;
}
#else
return false;
#endif
return true;
}
......@@ -307,5 +329,5 @@ bool COpenGLShaderMaterialRenderer::createVertexShader(const c8* vtxsh)
} // end namespace video
} // end namespace irr
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment