Add function to check which pixel program profiles are available on a driver

This commit is contained in:
kaetemi 2013-06-19 05:03:47 +02:00
parent 9c5fabf615
commit 3865e6e56f
9 changed files with 53 additions and 18 deletions

View file

@ -142,6 +142,23 @@ public:
*/
enum TMatrixCount { MaxModelMatrix= 16 };
enum TPixelProgramProfile
{
// direct3d
ps_1_1 = 0xD3D00101,
ps_1_2 = 0xD3D00102,
ps_1_3 = 0xD3D00103,
ps_1_4 = 0xD3D00104,
ps_2_0 = 0xD3D00200,
ps_2_x = 0xD3D00201, // not sure...
ps_3_0 = 0xD3D00300,
// opengl
arbfp1 = 0x061A0100, // made up values
fp20 = 0x06100200,
fp30 = 0x06100300,
fp40 = 0x06100400,
};
protected:
@ -1016,6 +1033,7 @@ public:
* Does the driver supports pixel programs ?
*/
virtual bool isPixelProgramSupported() const =0;
virtual bool isPixelProgramSupported(TPixelProgramProfile profile) const =0;

View file

@ -33,7 +33,7 @@ namespace NL3D
{
// ***************************************************************************
const uint32 IDriver::InterfaceVersion = 0x6b; // added anisotropic filter
const uint32 IDriver::InterfaceVersion = 0x6c; // pixel program interface
// ***************************************************************************
IDriver::IDriver() : _SyncTexDrvInfos( "IDriver::_SyncTexDrvInfos" )

View file

@ -1551,14 +1551,15 @@ bool CDriverD3D::setDisplay(nlWindow wnd, const GfxMode& mode, bool show, bool r
#endif // NL_FORCE_TEXTURE_STAGE_COUNT
_VertexProgram = !_DisableHardwareVertexProgram && ((caps.VertexShaderVersion&0xffff) >= 0x0100);
_PixelProgram = !_DisableHardwarePixelProgram && (caps.PixelShaderVersion&0xffff) >= 0x0101;
_PixelShader = !_DisableHardwarePixelShader && (caps.PixelShaderVersion&0xffff) >= 0x0101;
_PixelProgramVersion = _DisableHardwareVertexProgram ? 0x0000 : caps.PixelShaderVersion & 0xffff;
nldebug("Pixel Program Version: %i.%i", (uint32)((_PixelProgramVersion & 0xFF00) >> 8), (uint32)(_PixelProgramVersion & 0xFF));
_PixelProgram = _PixelProgramVersion >= 0x0101;
_MaxVerticesByVertexBufferHard = caps.MaxVertexIndex;
_MaxLight = caps.MaxActiveLights;
if(_MaxLight > 0xFF) _MaxLight = 3;
if (_PixelShader)
if (_PixelProgram)
{
_MaxNumPerStageConstantLighted = _NbNeLTextureStages;
_MaxNumPerStageConstantUnlighted = _NbNeLTextureStages;
@ -3626,7 +3627,7 @@ void CDriverD3D::CVertexProgramPtrState::apply(CDriverD3D *driver)
void CDriverD3D::CPixelShaderPtrState::apply(CDriverD3D *driver)
{
H_AUTO_D3D(CDriverD3D_CPixelShaderPtrState);
if (!driver->supportPixelShaders()) return;
if (!driver->isPixelProgramSupported()) return;
driver->_DeviceInterface->SetPixelShader(PixelShader);
}

View file

@ -1008,6 +1008,7 @@ public:
// Vertex program
virtual bool isVertexProgramSupported () const;
virtual bool isPixelProgramSupported () const;
virtual bool isPixelProgramSupported (TPixelProgramProfile profile) const;
virtual bool isVertexProgramEmulated () const;
virtual bool activeVertexProgram (CVertexProgram *program);
virtual bool activePixelProgram (CPixelProgram *program);
@ -1065,8 +1066,6 @@ public:
uint32 getMaxVertexIndex() const { return _MaxVertexIndex; }
bool supportPixelShaders() const { return _PixelShader; }
// *** Inline info
uint inlGetNumTextStages() const { return _NbNeLTextureStages; }
@ -2232,7 +2231,7 @@ private:
bool _TextureCubeSupported;
bool _VertexProgram;
bool _PixelProgram;
bool _PixelShader;
uint16 _PixelProgramVersion;
bool _DisableHardwareVertexProgram;
bool _DisableHardwarePixelProgram;
bool _DisableHardwareVertexArrayAGP;

View file

@ -567,7 +567,7 @@ bool CDriverD3D::setupMaterial(CMaterial &mat)
normalShaderDesc.TexEnvMode[stage] = mat.getTexEnvMode(uint8(stage));
}
if (_PixelShader)
if (_PixelProgram)
{
#ifdef NL_DEBUG_D3D
// Check, should not occured
@ -933,7 +933,7 @@ bool CDriverD3D::setupMaterial(CMaterial &mat)
activeShader (NULL);
/* If unlighted trick is needed, set the shader later */
if (!pShader->NeedsConstantForDiffuse && _PixelShader)
if (!pShader->NeedsConstantForDiffuse && _PixelProgram)
setPixelShader (pShader->PixelShader);
}
break;
@ -2019,7 +2019,7 @@ void CDriverD3D::endMaterialMultiPass()
bool CDriverD3D::supportCloudRenderSinglePass () const
{
H_AUTO_D3D(CDriver3D_supportCloudRenderSinglePass);
return _PixelShader;
return _PixelProgram;
}
// ***************************************************************************

View file

@ -60,6 +60,13 @@ bool CDriverD3D::isPixelProgramSupported () const
return _PixelProgram;
}
bool CDriverD3D::isPixelProgramSupported (TPixelProgramProfile profile) const
{
H_AUTO_D3D(CDriverD3D_isPixelProgramSupported_profile)
return ((profile & 0xFFFF0000) == 0xD3D00000)
&& (_PixelProgramVersion >= (uint16)(profile & 0x0000FFFF));
}
// ***************************************************************************
bool CDriverD3D::activePixelProgram(CPixelProgram *program)

View file

@ -1305,6 +1305,7 @@ private:
bool isVertexProgramSupported () const;
bool isPixelProgramSupported () const;
bool isPixelProgramSupported (TPixelProgramProfile profile) const;
bool isVertexProgramEmulated () const;
bool activeVertexProgram (CVertexProgram *program);
bool activePixelProgram (CPixelProgram *program);

View file

@ -62,6 +62,11 @@ bool CDriverGL::isPixelProgramSupported () const
H_AUTO_OGL(CPixelProgamDrvInfosGL_isPixelProgramSupported)
return _Extensions.ARBFragmentProgram;
}
bool CDriverGL::isPixelProgramSupported(TPixelProgramProfile profile) const
{
H_AUTO_OGL(CPixelProgamDrvInfosGL_isPixelProgramSupported_profile)
return profile == arbfp1 && _Extensions.ARBFragmentProgram;
}
// ***************************************************************************
bool CDriverGL::activePixelProgram(CPixelProgram *program)

View file

@ -246,7 +246,7 @@ void cbUpdateCommands (CConfigFile::CVar &var)
#if SBCLIENT_DEV_PIXEL_PROGRAM
namespace {
CPixelProgram *a_DevPixelProgram;
CPixelProgram *a_DevPixelProgram = NULL;
}
#endif
@ -294,16 +294,20 @@ void initCommands()
#if SBCLIENT_DEV_PIXEL_PROGRAM
CommandsMaterial.getObjectPtr()->setShader(NL3D::CMaterial::PostProcessing);
static const char *program_arbfp10 =
static const char *program_arbfp1 =
"!!ARBfp1.0\n"
"PARAM red = {1.0, 0.0, 0.0, 1.0};\n"
"MOV result.color, red;\n"
"END\n";
static const char *program_ps10 =
static const char *program_ps_1_1 =
"ps.1.1\n"
"def c0, 1.0, 0.0, 0.0, 1.0\n"
"mov r0, c0\n";
a_DevPixelProgram = new CPixelProgram(program_ps10);
NL3D::IDriver *d = dynamic_cast<NL3D::CDriverUser *>(Driver)->getDriver();
if (d->isPixelProgramSupported(IDriver::arbfp1))
a_DevPixelProgram = new CPixelProgram(program_arbfp1);
if (d->isPixelProgramSupported(IDriver::ps_1_1))
a_DevPixelProgram = new CPixelProgram(program_ps_1_1);
#endif
}