mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-04-10 03:44:26 +00:00
ShaderGen: Optimize out most function calls for uid generation.
This commit is contained in:
parent
fe2ca814c5
commit
c05aa0141d
@ -243,17 +243,19 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T
|
|||||||
? out.template GetUidData<pixel_shader_uid_data>() : dummy_data;
|
? out.template GetUidData<pixel_shader_uid_data>() : dummy_data;
|
||||||
|
|
||||||
out.SetBuffer(text);
|
out.SetBuffer(text);
|
||||||
|
const bool is_writing_shadercode = (out.GetBuffer() != NULL);
|
||||||
#ifndef ANDROID
|
#ifndef ANDROID
|
||||||
locale_t locale;
|
locale_t locale;
|
||||||
locale_t old_locale;
|
locale_t old_locale;
|
||||||
if (out.GetBuffer() != NULL)
|
if (is_writing_shadercode)
|
||||||
{
|
{
|
||||||
locale = newlocale(LC_NUMERIC_MASK, "C", NULL); // New locale for compilation
|
locale = newlocale(LC_NUMERIC_MASK, "C", NULL); // New locale for compilation
|
||||||
old_locale = uselocale(locale); // Apply the locale for this thread
|
old_locale = uselocale(locale); // Apply the locale for this thread
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
text[sizeof(text) - 1] = 0x7C; // canary
|
if (is_writing_shadercode)
|
||||||
|
text[sizeof(text) - 1] = 0x7C; // canary
|
||||||
|
|
||||||
unsigned int numStages = bpmem.genMode.numtevstages + 1;
|
unsigned int numStages = bpmem.genMode.numtevstages + 1;
|
||||||
unsigned int numTexgen = bpmem.genMode.numtexgens;
|
unsigned int numTexgen = bpmem.genMode.numtexgens;
|
||||||
@ -372,7 +374,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T
|
|||||||
// It just allows it, but it seems that all drivers do.
|
// It just allows it, but it seems that all drivers do.
|
||||||
out.Write("layout(early_fragment_tests) in;\n");
|
out.Write("layout(early_fragment_tests) in;\n");
|
||||||
}
|
}
|
||||||
else if (bpmem.UseEarlyDepthTest() && (g_ActiveConfig.bFastDepthCalc || bpmem.alpha_test.TestResult() == AlphaTest::UNDETERMINED))
|
else if (bpmem.UseEarlyDepthTest() && (g_ActiveConfig.bFastDepthCalc || bpmem.alpha_test.TestResult() == AlphaTest::UNDETERMINED) && is_writing_shadercode)
|
||||||
{
|
{
|
||||||
static bool warn_once = true;
|
static bool warn_once = true;
|
||||||
if (warn_once)
|
if (warn_once)
|
||||||
@ -388,7 +390,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T
|
|||||||
{
|
{
|
||||||
out.Write("[earlydepthstencil]\n");
|
out.Write("[earlydepthstencil]\n");
|
||||||
}
|
}
|
||||||
else if (bpmem.UseEarlyDepthTest() && (g_ActiveConfig.bFastDepthCalc || bpmem.alpha_test.TestResult() == AlphaTest::UNDETERMINED))
|
else if (bpmem.UseEarlyDepthTest() && (g_ActiveConfig.bFastDepthCalc || bpmem.alpha_test.TestResult() == AlphaTest::UNDETERMINED) && is_writing_shadercode)
|
||||||
{
|
{
|
||||||
static bool warn_once = true;
|
static bool warn_once = true;
|
||||||
if (warn_once)
|
if (warn_once)
|
||||||
@ -705,16 +707,16 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T
|
|||||||
|
|
||||||
out.Write("}\n");
|
out.Write("}\n");
|
||||||
|
|
||||||
if (text[sizeof(text) - 1] != 0x7C)
|
if (is_writing_shadercode)
|
||||||
PanicAlert("PixelShader generator - buffer too small, canary has been eaten!");
|
{
|
||||||
|
if (text[sizeof(text) - 1] != 0x7C)
|
||||||
|
PanicAlert("PixelShader generator - buffer too small, canary has been eaten!");
|
||||||
|
|
||||||
#ifndef ANDROID
|
#ifndef ANDROID
|
||||||
if (out.GetBuffer() != NULL)
|
|
||||||
{
|
|
||||||
uselocale(old_locale); // restore locale
|
uselocale(old_locale); // restore locale
|
||||||
freelocale(locale);
|
freelocale(locale);
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -905,7 +907,7 @@ static inline void WriteStage(T& out, pixel_shader_uid_data& uid_data, int n, AP
|
|||||||
char *texswap = swapModeTable[bpmem.combiners[n].alphaC.tswap];
|
char *texswap = swapModeTable[bpmem.combiners[n].alphaC.tswap];
|
||||||
int texmap = bpmem.tevorders[n/2].getTexMap(n&1);
|
int texmap = bpmem.tevorders[n/2].getTexMap(n&1);
|
||||||
uid_data.SetTevindrefTexmap(i, texmap);
|
uid_data.SetTevindrefTexmap(i, texmap);
|
||||||
|
|
||||||
out.Write("textemp = ");
|
out.Write("textemp = ");
|
||||||
SampleTexture<T>(out, "tevcoord", texswap, texmap, ApiType);
|
SampleTexture<T>(out, "tevcoord", texswap, texmap, ApiType);
|
||||||
}
|
}
|
||||||
@ -1132,7 +1134,7 @@ template<class T>
|
|||||||
void SampleTexture(T& out, const char *texcoords, const char *texswap, int texmap, API_TYPE ApiType)
|
void SampleTexture(T& out, const char *texcoords, const char *texswap, int texmap, API_TYPE ApiType)
|
||||||
{
|
{
|
||||||
out.SetConstantsUsed(C_TEXDIMS+texmap,C_TEXDIMS+texmap);
|
out.SetConstantsUsed(C_TEXDIMS+texmap,C_TEXDIMS+texmap);
|
||||||
|
|
||||||
if (ApiType == API_D3D11)
|
if (ApiType == API_D3D11)
|
||||||
out.Write("Tex%d.Sample(samp%d,%s.xy * " I_TEXDIMS"[%d].xy).%s;\n", texmap,texmap, texcoords, texmap, texswap);
|
out.Write("Tex%d.Sample(samp%d,%s.xy * " I_TEXDIMS"[%d].xy).%s;\n", texmap,texmap, texcoords, texmap, texswap);
|
||||||
else
|
else
|
||||||
@ -1273,7 +1275,7 @@ static inline void WriteFog(T& out, pixel_shader_uid_data& uid_data)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (bpmem.fog.c_proj_fsel.fsel != 2)
|
if (bpmem.fog.c_proj_fsel.fsel != 2 && out.GetBuffer() != NULL)
|
||||||
WARN_LOG(VIDEO, "Unknown Fog Type! %08x", bpmem.fog.c_proj_fsel.fsel);
|
WARN_LOG(VIDEO, "Unknown Fog Type! %08x", bpmem.fog.c_proj_fsel.fsel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
static char text[16768];
|
static char text[16768];
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
static inline void DefineVSOutputStructMember(T& object, API_TYPE api_type, const char* type, const char* name, int var_index, const char* semantic, int semantic_index = -1)
|
static void DefineVSOutputStructMember(T& object, API_TYPE api_type, const char* type, const char* name, int var_index, const char* semantic, int semantic_index = -1)
|
||||||
{
|
{
|
||||||
object.Write(" %s %s", type, name);
|
object.Write(" %s %s", type, name);
|
||||||
if (var_index != -1)
|
if (var_index != -1)
|
||||||
@ -75,16 +75,19 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ
|
|||||||
? out.template GetUidData<vertex_shader_uid_data>() : dummy_data;
|
? out.template GetUidData<vertex_shader_uid_data>() : dummy_data;
|
||||||
|
|
||||||
out.SetBuffer(text);
|
out.SetBuffer(text);
|
||||||
|
const bool is_writing_shadercode = (out.GetBuffer() != NULL);
|
||||||
#ifndef ANDROID
|
#ifndef ANDROID
|
||||||
locale_t locale;
|
locale_t locale;
|
||||||
locale_t old_locale;
|
locale_t old_locale;
|
||||||
if (out.GetBuffer() != NULL)
|
if (is_writing_shadercode)
|
||||||
{
|
{
|
||||||
locale = newlocale(LC_NUMERIC_MASK, "C", NULL); // New locale for compilation
|
locale = newlocale(LC_NUMERIC_MASK, "C", NULL); // New locale for compilation
|
||||||
old_locale = uselocale(locale); // Apply the locale for this thread
|
old_locale = uselocale(locale); // Apply the locale for this thread
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
text[sizeof(text) - 1] = 0x7C; // canary
|
|
||||||
|
if (is_writing_shadercode)
|
||||||
|
text[sizeof(text) - 1] = 0x7C; // canary
|
||||||
|
|
||||||
_assert_(bpmem.genMode.numtexgens == xfregs.numTexGen.numTexGens);
|
_assert_(bpmem.genMode.numtexgens == xfregs.numTexGen.numTexGens);
|
||||||
_assert_(bpmem.genMode.numcolchans == xfregs.numChan.numColorChans);
|
_assert_(bpmem.genMode.numcolchans == xfregs.numChan.numColorChans);
|
||||||
@ -225,7 +228,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ
|
|||||||
out.Write("int posmtx = int(fposmtx);\n");
|
out.Write("int posmtx = int(fposmtx);\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DriverDetails::HasBug(DriverDetails::BUG_NODYNUBOACCESS))
|
if (is_writing_shadercode && DriverDetails::HasBug(DriverDetails::BUG_NODYNUBOACCESS))
|
||||||
{
|
{
|
||||||
// This'll cause issues, but it can't be helped
|
// This'll cause issues, but it can't be helped
|
||||||
out.Write("float4 pos = float4(dot(" I_TRANSFORMMATRICES"[0], rawpos), dot(" I_TRANSFORMMATRICES"[1], rawpos), dot(" I_TRANSFORMMATRICES"[2], rawpos), 1);\n");
|
out.Write("float4 pos = float4(dot(" I_TRANSFORMMATRICES"[0], rawpos), dot(" I_TRANSFORMMATRICES"[1], rawpos), dot(" I_TRANSFORMMATRICES"[2], rawpos), 1);\n");
|
||||||
@ -547,16 +550,16 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ
|
|||||||
out.Write("return o;\n}\n");
|
out.Write("return o;\n}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (text[sizeof(text) - 1] != 0x7C)
|
if (is_writing_shadercode)
|
||||||
PanicAlert("VertexShader generator - buffer too small, canary has been eaten!");
|
{
|
||||||
|
if (text[sizeof(text) - 1] != 0x7C)
|
||||||
|
PanicAlert("VertexShader generator - buffer too small, canary has been eaten!");
|
||||||
|
|
||||||
#ifndef ANDROID
|
#ifndef ANDROID
|
||||||
if (out.GetBuffer() != NULL)
|
|
||||||
{
|
|
||||||
uselocale(old_locale); // restore locale
|
uselocale(old_locale); // restore locale
|
||||||
freelocale(locale);
|
freelocale(locale);
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetVertexShaderUid(VertexShaderUid& object, u32 components, API_TYPE api_type)
|
void GetVertexShaderUid(VertexShaderUid& object, u32 components, API_TYPE api_type)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user