mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-13 07:34:45 +00:00
Shader Gen to produce ShaderData
Shader gen now produces a shaderdata class - this should reduce full recompilation of shaders when a macro switch happens. FileStream can now also be setup to be async write, so it will write out the file on a separate thread hopefully freeing up the main thread to continue working.
This commit is contained in:
parent
8adf692da5
commit
4cf780e7b8
11 changed files with 337 additions and 126 deletions
|
|
@ -71,6 +71,8 @@ ShaderData::ShaderData()
|
|||
for( int i = 0; i < NumTextures; ++i)
|
||||
mRTParams[i] = false;
|
||||
|
||||
mInstancingFormat = NULL;
|
||||
|
||||
mDXVertexShaderName = StringTable->EmptyString();
|
||||
mDXPixelShaderName = StringTable->EmptyString();
|
||||
mDXGeometryShaderName = StringTable->EmptyString();
|
||||
|
|
@ -217,6 +219,8 @@ GFXShader* ShaderData::getShader( const Vector<GFXShaderMacro> ¯os )
|
|||
String cacheKey;
|
||||
GFXShaderMacro::stringize( macros, &cacheKey );
|
||||
|
||||
cacheKey = Torque::getStringHash64(cacheKey);
|
||||
|
||||
// Lookup the shader for this instance.
|
||||
ShaderCache::Iterator iter = mShaders.find( cacheKey );
|
||||
if ( iter != mShaders.end() )
|
||||
|
|
@ -257,30 +261,32 @@ GFXShader* ShaderData::_createShader( const Vector<GFXShaderMacro> ¯os )
|
|||
{
|
||||
case Direct3D11:
|
||||
{
|
||||
if (mDXVertexShaderName != String::EmptyString)
|
||||
if (mDXVertexShaderName != StringTable->EmptyString())
|
||||
shader->setShaderStageFile(GFXShaderStage::VERTEX_SHADER, mDXVertexShaderName);
|
||||
if (mDXPixelShaderName != String::EmptyString)
|
||||
if (mDXPixelShaderName != StringTable->EmptyString())
|
||||
shader->setShaderStageFile(GFXShaderStage::PIXEL_SHADER, mDXPixelShaderName);
|
||||
if (mDXGeometryShaderName != String::EmptyString)
|
||||
if (mDXGeometryShaderName != StringTable->EmptyString())
|
||||
shader->setShaderStageFile(GFXShaderStage::GEOMETRY_SHADER, mDXGeometryShaderName);
|
||||
success = shader->init( pixver,
|
||||
macros,
|
||||
samplers);
|
||||
samplers,
|
||||
mInstancingFormat);
|
||||
break;
|
||||
}
|
||||
|
||||
case OpenGL:
|
||||
{
|
||||
if(mOGLVertexShaderName != String::EmptyString)
|
||||
if(mOGLVertexShaderName != StringTable->EmptyString())
|
||||
shader->setShaderStageFile(GFXShaderStage::VERTEX_SHADER, mOGLVertexShaderName);
|
||||
if (mOGLPixelShaderName != String::EmptyString)
|
||||
if (mOGLPixelShaderName != StringTable->EmptyString())
|
||||
shader->setShaderStageFile(GFXShaderStage::PIXEL_SHADER, mOGLPixelShaderName);
|
||||
if (mOGLGeometryShaderName != String::EmptyString)
|
||||
if (mOGLGeometryShaderName != StringTable->EmptyString())
|
||||
shader->setShaderStageFile(GFXShaderStage::GEOMETRY_SHADER, mOGLGeometryShaderName);
|
||||
|
||||
success = shader->init( pixver,
|
||||
macros,
|
||||
samplers);
|
||||
samplers,
|
||||
mInstancingFormat);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -321,6 +327,33 @@ GFXShader* ShaderData::_createShader( const Vector<GFXShaderMacro> ¯os )
|
|||
return shader;
|
||||
}
|
||||
|
||||
void ShaderData::setShaderStageFile(GFXShaderStage stage, String fileName)
|
||||
{
|
||||
const bool isGL = GFX->getAdapterType() == GFXAdapterType::OpenGL;
|
||||
switch (stage)
|
||||
{
|
||||
case VERTEX_SHADER:
|
||||
isGL ? mOGLVertexShaderName = StringTable->insert(fileName) : mDXVertexShaderName = StringTable->insert(fileName);
|
||||
break;
|
||||
case PIXEL_SHADER:
|
||||
isGL ? mOGLPixelShaderName = StringTable->insert(fileName) : mDXPixelShaderName = StringTable->insert(fileName);
|
||||
break;
|
||||
case GEOMETRY_SHADER:
|
||||
isGL ? mOGLGeometryShaderName = StringTable->insert(fileName) : mDXGeometryShaderName = StringTable->insert(fileName);
|
||||
break;
|
||||
case DOMAIN_SHADER:
|
||||
break;
|
||||
case HULL_SHADER:
|
||||
break;
|
||||
case COMPUTE_SHADER:
|
||||
break;
|
||||
case ALL_STAGES:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ShaderData::reloadShaders()
|
||||
{
|
||||
ShaderCache::Iterator iter = mShaders.begin();
|
||||
|
|
|
|||
|
|
@ -80,11 +80,6 @@ protected:
|
|||
/// them if the content has changed.
|
||||
const Vector<GFXShaderMacro>& _getMacros();
|
||||
|
||||
/// Helper for converting an array of macros
|
||||
/// into a formatted string.
|
||||
void _stringizeMacros(const Vector<GFXShaderMacro>& macros,
|
||||
String* outString);
|
||||
|
||||
/// Creates a new shader returning NULL on error.
|
||||
GFXShader* _createShader(const Vector<GFXShaderMacro>& macros);
|
||||
|
||||
|
|
@ -98,6 +93,8 @@ protected:
|
|||
|
||||
String mSamplerNames[NumTextures];
|
||||
bool mRTParams[NumTextures];
|
||||
// the instancing format.
|
||||
GFXVertexFormat* mInstancingFormat;
|
||||
|
||||
bool _checkDefinition(GFXShader* shader);
|
||||
|
||||
|
|
@ -105,9 +102,11 @@ public:
|
|||
|
||||
void setSamplerName(const String& name, int idx) { mSamplerNames[idx] = name; }
|
||||
String getSamplerName(int idx) const { return mSamplerNames[idx]; }
|
||||
void setShaderStageFile(GFXShaderStage stage, String fileName);
|
||||
|
||||
bool hasSamplerDef(const String& samplerName, int& pos) const;
|
||||
bool hasRTParamsDef(const int pos) const { return mRTParams[pos]; }
|
||||
void setInstancingFormat(GFXVertexFormat* instancingFormat) { mInstancingFormat = instancingFormat; }
|
||||
|
||||
ShaderData();
|
||||
|
||||
|
|
@ -122,6 +121,7 @@ public:
|
|||
/// all loaded ShaderData objects in the system.
|
||||
static void reloadAllShaders();
|
||||
|
||||
void setPixVersion(F32 pixVersion) { mPixVersion = pixVersion; }
|
||||
/// Returns the required pixel shader version for this shader.
|
||||
F32 getPixVersion() const { return mPixVersion; }
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue