Add support for fp40 with opengl

This commit is contained in:
kaetemi 2013-06-19 22:41:03 +02:00
parent c852e2ca94
commit aa3462b7bc
5 changed files with 43 additions and 9 deletions

View file

@ -155,9 +155,9 @@ public:
// opengl - 0x0610,bitfield // opengl - 0x0610,bitfield
arbfp1 = 0x06100001, // ARB_fragment_program arbfp1 = 0x06100001, // ARB_fragment_program
// fp20 = 0x061B0002, // fp20 = 0x061B0002, // very limited and outdated, unnecessary
fp30 = 0x06100004, // NV_fragment_program // fp30 = 0x06100004, // NV_fragment_program, now arbfp1, redundant
fp40 = 0x06100008, // NV_fragment_program2 fp40 = 0x06100008, // NV_fragment_program2, arbfp1 with "OPTION NV_fragment_program2;\n"
gp4fp = 0x06100010, // NV_gpu_program4 gp4fp = 0x06100010, // NV_gpu_program4
gp5fp = 0x06100020, // NV_gpu_program5 gp5fp = 0x06100020, // NV_gpu_program5
}; };

View file

@ -1225,6 +1225,15 @@ static bool setupARBFragmentProgram(const char *glext)
return true; return true;
} }
// *********************************
static bool setupNVFragmentProgram2(const char *glext)
{
H_AUTO_OGL(setupNVFragmentProgram2);
CHECK_EXT("GL_NV_fragment_program2");
return true;
}
// *************************************************************************** // ***************************************************************************
static bool setupARBVertexBufferObject(const char *glext) static bool setupARBVertexBufferObject(const char *glext)
{ {
@ -1563,13 +1572,15 @@ void registerGlExtensions(CGlExtensions &ext)
// Check pixel program // Check pixel program
// Disable feature ??? // Disable feature ???
if(!ext.DisableHardwarePixelProgram) if (!ext.DisableHardwarePixelProgram)
{ {
ext.ARBFragmentProgram= setupARBFragmentProgram(glext); ext.ARBFragmentProgram = setupARBFragmentProgram(glext);
ext.NVFragmentProgram2 = setupNVFragmentProgram2(glext);
} }
else else
{ {
ext.ARBFragmentProgram = false; ext.ARBFragmentProgram = false;
ext.NVFragmentProgram2 = false;
} }
ext.OESDrawTexture = setupOESDrawTexture(glext); ext.OESDrawTexture = setupOESDrawTexture(glext);
@ -1582,14 +1593,12 @@ void registerGlExtensions(CGlExtensions &ext)
ext.NVTextureShader = setupNVTextureShader(glext); ext.NVTextureShader = setupNVTextureShader(glext);
ext.ATIEnvMapBumpMap = setupATIEnvMapBumpMap(glext); ext.ATIEnvMapBumpMap = setupATIEnvMapBumpMap(glext);
ext.ATIFragmentShader = setupATIFragmentShader(glext); ext.ATIFragmentShader = setupATIFragmentShader(glext);
ext.ARBFragmentProgram = setupARBFragmentProgram(glext);
} }
else else
{ {
ext.ATIEnvMapBumpMap = false; ext.ATIEnvMapBumpMap = false;
ext.NVTextureShader = false; ext.NVTextureShader = false;
ext.ATIFragmentShader = false; ext.ATIFragmentShader = false;
ext.ARBFragmentProgram = false;
} }
// For now, the only way to know if emulation, is to test some extension which exist only on GeForce3. // For now, the only way to know if emulation, is to test some extension which exist only on GeForce3.

View file

@ -103,6 +103,9 @@ struct CGlExtensions
bool ARBTextureNonPowerOfTwo; bool ARBTextureNonPowerOfTwo;
bool ARBMultisample; bool ARBMultisample;
// NV Pixel Programs
bool NVFragmentProgram2;
bool OESDrawTexture; bool OESDrawTexture;
bool OESMapBuffer; bool OESMapBuffer;
@ -208,6 +211,7 @@ public:
result += NVTextureShader ? "NVTextureShader " : ""; result += NVTextureShader ? "NVTextureShader " : "";
result += ATIFragmentShader ? "ATIFragmentShader " : ""; result += ATIFragmentShader ? "ATIFragmentShader " : "";
result += ARBFragmentProgram ? "ARBFragmentProgram " : ""; result += ARBFragmentProgram ? "ARBFragmentProgram " : "";
result += NVFragmentProgram2 ? "NVFragmentProgram2 " : "";
result += ARBVertexProgram ? "ARBVertexProgram " : ""; result += ARBVertexProgram ? "ARBVertexProgram " : "";
result += NVVertexProgram ? "NVVertexProgram " : ""; result += NVVertexProgram ? "NVVertexProgram " : "";
result += EXTVertexShader ? "EXTVertexShader " : ""; result += EXTVertexShader ? "EXTVertexShader " : "";

View file

@ -71,7 +71,13 @@ bool CDriverGL::isPixelProgramSupported() const
bool CDriverGL::isPixelProgramSupported(TPixelProgramProfile profile) const bool CDriverGL::isPixelProgramSupported(TPixelProgramProfile profile) const
{ {
H_AUTO_OGL(CPixelProgamDrvInfosGL_isPixelProgramSupported_profile) H_AUTO_OGL(CPixelProgamDrvInfosGL_isPixelProgramSupported_profile)
return profile == arbfp1 && _Extensions.ARBFragmentProgram; switch (profile)
{
case arbfp1:
return _Extensions.ARBFragmentProgram;
case fp40:
return _Extensions.NVFragmentProgram2;
}
} }
// *************************************************************************** // ***************************************************************************

View file

@ -304,6 +304,16 @@ void initCommands()
"MOV result.color.xzw, c[0].xyyx;\n" "MOV result.color.xzw, c[0].xyyx;\n"
"TEX result.color.y, fragment.texcoord[0], texture[0], 2D;\n" "TEX result.color.y, fragment.texcoord[0], texture[0], 2D;\n"
"END\n"; "END\n";
static const char *program_fp40 =
"!!ARBfp1.0\n"
"OPTION NV_fragment_program2;\n"
"PARAM c[1] = { { 1, 0 } };\n"
"TEMP RC;\n"
"TEMP HC;\n"
"OUTPUT oCol = result.color;\n"
"MOVR oCol.xzw, c[0].xyyx;\n"
"TEX oCol.y, fragment.texcoord[0], texture[0], 2D;\n"
"END\n";
static const char *program_ps_1_1 = static const char *program_ps_1_1 =
"ps.1.1\n" "ps.1.1\n"
"def c0, 0.000000, 0.000000, 1.000000, 0.000000\n" "def c0, 0.000000, 0.000000, 1.000000, 0.000000\n"
@ -329,7 +339,12 @@ void initCommands()
"mov oC0.xzw, c0.xyyx\n" "mov oC0.xzw, c0.xyyx\n"
"texld oC0.y, v0, s0\n"; "texld oC0.y, v0, s0\n";
NL3D::IDriver *d = dynamic_cast<NL3D::CDriverUser *>(Driver)->getDriver(); NL3D::IDriver *d = dynamic_cast<NL3D::CDriverUser *>(Driver)->getDriver();
if (d->isPixelProgramSupported(IDriver::arbfp1)) if (d->isPixelProgramSupported(IDriver::fp40))
{
nldebug("fp40");
a_DevPixelProgram = new CPixelProgram(program_fp40);
}
else if (d->isPixelProgramSupported(IDriver::arbfp1))
{ {
nldebug("arbfp1"); nldebug("arbfp1");
a_DevPixelProgram = new CPixelProgram(program_arbfp1); a_DevPixelProgram = new CPixelProgram(program_arbfp1);