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