Permalink
Browse files

require GL_EXT_frag_depth on ES when writing into depth

  • Loading branch information...
aras-p committed Feb 24, 2013
1 parent c5537e6 commit 3d02748fac2fb6f8e6045ddf259df6145786dc42
@@ -85,6 +85,7 @@ static const char* varOutString[EAttrSemCount] = {
""
};
+
// String table that maps attribute semantics to built-in GLSL input varyings
static const char* varInString[EAttrSemCount] = {
"",
@@ -144,8 +145,12 @@ static const char* resultString[EAttrSemCount] = {
"",
"gl_FragDepth",
"",
+ "",
+ "",
+ "",
};
+
static const char* kUserVaryingPrefix = "xlv_";
static inline void AddToVaryings (std::stringstream& s, TPrecision prec, const std::string& type, const std::string& name)
@@ -154,7 +159,9 @@ static inline void AddToVaryings (std::stringstream& s, TPrecision prec, const s
s << "varying " << getGLSLPrecisiontring(prec) << type << " " << name << ";\n";
}
-HlslLinker::HlslLinker(TInfoSink& infoSink_) : infoSink(infoSink_)
+HlslLinker::HlslLinker(TInfoSink& infoSink_)
+: infoSink(infoSink_)
+, m_Target(ETargetVersionCount)
{
for ( int i = 0; i < EAttrSemCount; i++)
{
@@ -302,14 +309,19 @@ bool HlslLinker::getArgumentData2( const std::string &name, const std::string &s
case EClassRes:
outName = resultString[sem];
- if ( sem != EAttrSemDepth)
+ if (sem == EAttrSemDepth)
{
- pad = 4 - size;
- ctor = "vec4";
+ if (m_Target == ETargetGLSL_ES_100)
+ {
+ outName = "gl_FragDepthEXT";
+ m_Extensions.insert("GL_EXT_frag_depth");
+ }
+ ctor = "float";
}
else
{
- ctor = "float";
+ pad = 4 - size;
+ ctor = "vec4";
}
break;
@@ -514,11 +526,11 @@ static const char* GetEntryName (const char* entryFunc)
static const char* kShaderTypeNames[2] = { "Vertex", "Fragment" };
-void HlslLinker::addRequiredExtensions(EAttribSemantic sem, ExtensionSet &extensions)
+
+static void add_extension_from_semantic(EAttribSemantic sem, ExtensionSet& extensions)
{
if (sem == EAttrSemPrimitiveID || sem == EAttrSemVertexID)
extensions.insert("GL_EXT_gpu_shader4");
-
if (sem == EAttrSemInstanceID)
extensions.insert("GL_ARB_draw_instanced");
}
@@ -604,15 +616,15 @@ void HlslLinker::buildUniformsAndLibFunctions(const FunctionSet& calledFunctions
}
-void HlslLinker::emitLibraryFunctions(const std::set<TOperator>& libFunctions, ExtensionSet& extensions, EShLanguage lang, bool usePrecision)
+void HlslLinker::emitLibraryFunctions(const std::set<TOperator>& libFunctions, EShLanguage lang, bool usePrecision)
{
// library Functions & required extensions
std::string shaderLibFunctions;
if (!libFunctions.empty())
{
for (std::set<TOperator>::const_iterator it = libFunctions.begin(); it != libFunctions.end(); it++)
{
- const std::string &func = getHLSLSupportCode(*it, extensions, lang==EShLangVertex, usePrecision);
+ const std::string &func = getHLSLSupportCode(*it, m_Extensions, lang==EShLangVertex, usePrecision);
if (!func.empty())
{
shaderLibFunctions += func;
@@ -643,12 +655,12 @@ void HlslLinker::emitStructs(HlslCrossCompiler* comp)
}
-void HlslLinker::emitGlobals(const GlslFunction* globalFunction, const std::vector<GlslSymbol*>& constants, ExtensionSet& extensions, ETargetVersion version)
+void HlslLinker::emitGlobals(const GlslFunction* globalFunction, const std::vector<GlslSymbol*>& constants)
{
// write global scope declarations (represented as a fake function)
assert(globalFunction);
shader << globalFunction->getCode();
- globalFunction->addNeededExtensions (extensions, version);
+ globalFunction->addNeededExtensions (m_Extensions, m_Target);
// write mutable uniform declarations
const unsigned n_constants = constants.size();
@@ -764,7 +776,7 @@ void HlslLinker::emitInputNonStructParam(GlslSymbol* sym, EShLanguage lang, bool
}
-void HlslLinker::emitInputStructParam(GlslSymbol* sym, EShLanguage lang, ExtensionSet& extensions, std::stringstream& attrib, std::stringstream& varying, std::stringstream& preamble, std::stringstream& call)
+void HlslLinker::emitInputStructParam(GlslSymbol* sym, EShLanguage lang, std::stringstream& attrib, std::stringstream& varying, std::stringstream& preamble, std::stringstream& call)
{
GlslStruct* str = sym->getStruct();
assert(str);
@@ -782,7 +794,7 @@ void HlslLinker::emitInputStructParam(GlslSymbol* sym, EShLanguage lang, Extensi
const GlslStruct::StructMember &current = str->getMember(jj);
EAttribSemantic memberSem = parseAttributeSemantic (current.semantic);
- addRequiredExtensions(memberSem, extensions);
+ add_extension_from_semantic(memberSem, m_Extensions);
// if member of the struct is an array, we have to loop over all array elements
int arraySize = 1;
@@ -912,14 +924,14 @@ void HlslLinker::emitOutputStructParam(GlslSymbol* sym, EShLanguage lang, bool u
}
-void HlslLinker::emitMainStart(const HlslCrossCompiler* compiler, const EGlslSymbolType retType, GlslFunction* funcMain, ETargetVersion version, unsigned options, bool usePrecision, std::stringstream& preamble)
+void HlslLinker::emitMainStart(const HlslCrossCompiler* compiler, const EGlslSymbolType retType, GlslFunction* funcMain, unsigned options, bool usePrecision, std::stringstream& preamble)
{
preamble << "void main() {\n";
std::string arrayInit = compiler->m_DeferredArrayInit.str();
if (!arrayInit.empty())
{
- const bool emit_120_arrays = (version >= ETargetGLSL_120);
+ const bool emit_120_arrays = (m_Target >= ETargetGLSL_120);
const bool emit_old_arrays = !emit_120_arrays || (options & ETranslateOpEmitGLSL120ArrayInitWorkaround);
const bool emit_both = emit_120_arrays && emit_old_arrays;
@@ -1043,6 +1055,8 @@ bool HlslLinker::emitReturnValue(const EGlslSymbolType retType, GlslFunction* fu
bool HlslLinker::link(HlslCrossCompiler* compiler, const char* entryFunc, ETargetVersion targetVersion, unsigned options)
{
+ m_Target = targetVersion;
+ m_Extensions.clear();
if (!linkerSanityCheck(compiler, entryFunc))
return false;
@@ -1062,10 +1076,6 @@ bool HlslLinker::link(HlslCrossCompiler* compiler, const char* entryFunc, ETarge
assert(globalFunction);
assert(funcMain);
-
- ExtensionSet extensions;
-
-
// uniforms and used built-in functions
std::vector<GlslSymbol*> constants;
std::set<TOperator> libFunctions;
@@ -1075,9 +1085,9 @@ bool HlslLinker::link(HlslCrossCompiler* compiler, const char* entryFunc, ETarge
// print all the components collected above.
- emitLibraryFunctions (libFunctions, extensions, lang, usePrecision);
+ emitLibraryFunctions (libFunctions, lang, usePrecision);
emitStructs(compiler);
- emitGlobals (globalFunction, constants, extensions, targetVersion);
+ emitGlobals (globalFunction, constants);
EmitCalledFunctions (shader, calledFunctions);
@@ -1094,7 +1104,7 @@ bool HlslLinker::link(HlslCrossCompiler* compiler, const char* entryFunc, ETarge
// Declare return value
const EGlslSymbolType retType = funcMain->getReturnType();
- emitMainStart(compiler, retType, funcMain, targetVersion, options, usePrecision, preamble);
+ emitMainStart(compiler, retType, funcMain, options, usePrecision, preamble);
// Call the entry point
@@ -1111,7 +1121,7 @@ bool HlslLinker::link(HlslCrossCompiler* compiler, const char* entryFunc, ETarge
GlslSymbol *sym = funcMain->getParameter(ii);
EAttribSemantic attrSem = parseAttributeSemantic( sym->getSemantic());
- addRequiredExtensions(attrSem, extensions);
+ add_extension_from_semantic(attrSem, m_Extensions);
switch (sym->getQualifier())
{
@@ -1126,7 +1136,7 @@ bool HlslLinker::link(HlslCrossCompiler* compiler, const char* entryFunc, ETarge
}
else
{
- emitInputStructParam(sym, lang, extensions, attrib, varying, preamble, call);
+ emitInputStructParam(sym, lang, attrib, varying, preamble, call);
}
// NOTE: for "inout" parameters need to fallthrough to the next case
@@ -1179,7 +1189,7 @@ bool HlslLinker::link(HlslCrossCompiler* compiler, const char* entryFunc, ETarge
// Generate final code of the pieces above.
{
shaderPrefix << kTargetVersionStrings[targetVersion];
- ExtensionSet::const_iterator it = extensions.begin(), end = extensions.end();
+ ExtensionSet::const_iterator it = m_Extensions.begin(), end = m_Extensions.end();
for (; it != end; ++it)
shaderPrefix << "#extension " << *it << " : require" << std::endl;
}
@@ -61,22 +61,21 @@ class HlslLinker
EClassifier c, std::string &outName, std::string &ctor, int &pad, int semanticOffset);
bool getArgumentData( GlslSymbol* sym, EClassifier c, std::string &outName,
std::string &ctor, int &pad);
- void addRequiredExtensions(EAttribSemantic sem, ExtensionSet& extensions);
bool linkerSanityCheck(HlslCrossCompiler* compiler, const char* entryFunc);
bool buildFunctionLists(HlslCrossCompiler* comp, EShLanguage lang, const std::string& entryPoint, GlslFunction*& globalFunction, std::vector<GlslFunction*>& functionList, FunctionSet& calledFunctions, GlslFunction*& funcMain);
void buildUniformsAndLibFunctions(const FunctionSet& calledFunctions, std::vector<GlslSymbol*>& constants, std::set<TOperator>& libFunctions);
void buildUniformReflection(const std::vector<GlslSymbol*>& constants);
- void emitLibraryFunctions(const std::set<TOperator>& libFunctions, ExtensionSet& extensions, EShLanguage lang, bool usePrecision);
+ void emitLibraryFunctions(const std::set<TOperator>& libFunctions, EShLanguage lang, bool usePrecision);
void emitStructs(HlslCrossCompiler* comp);
- void emitGlobals(const GlslFunction* globalFunction, const std::vector<GlslSymbol*>& constants, ExtensionSet& extensions, ETargetVersion version);
+ void emitGlobals(const GlslFunction* globalFunction, const std::vector<GlslSymbol*>& constants);
void emitInputNonStructParam(GlslSymbol* sym, EShLanguage lang, bool usePrecision, EAttribSemantic attrSem, std::stringstream& attrib, std::stringstream& varying, std::stringstream& preamble, std::stringstream& call);
- void emitInputStructParam(GlslSymbol* sym, EShLanguage lang, ExtensionSet& extensions, std::stringstream& attrib, std::stringstream& varying, std::stringstream& preamble, std::stringstream& call);
+ void emitInputStructParam(GlslSymbol* sym, EShLanguage lang, std::stringstream& attrib, std::stringstream& varying, std::stringstream& preamble, std::stringstream& call);
void emitOutputNonStructParam(GlslSymbol* sym, EShLanguage lang, bool usePrecision, EAttribSemantic attrSem, std::stringstream& varying, std::stringstream& preamble, std::stringstream& postamble, std::stringstream& call);
void emitOutputStructParam(GlslSymbol* sym, EShLanguage lang, bool usePrecision, EAttribSemantic attrSem, std::stringstream& varying, std::stringstream& preamble, std::stringstream& postamble, std::stringstream& call);
- void emitMainStart(const HlslCrossCompiler* compiler, const EGlslSymbolType retType, GlslFunction* funcMain, ETargetVersion version, unsigned options, bool usePrecision, std::stringstream& preamble);
+ void emitMainStart(const HlslCrossCompiler* compiler, const EGlslSymbolType retType, GlslFunction* funcMain, unsigned options, bool usePrecision, std::stringstream& preamble);
bool emitReturnValue(const EGlslSymbolType retType, GlslFunction* funcMain, EShLanguage lang, std::stringstream& varying, std::stringstream& postamble);
private:
@@ -100,6 +99,9 @@ class HlslLinker
// For varyings, determines whether the linker attempts to use user or built-in varyings
bool bUserVaryings;
+
+ ExtensionSet m_Extensions;
+ ETargetVersion m_Target;
};
#endif //HLSL_LINKER_H
@@ -1,3 +1,4 @@
+#extension GL_EXT_frag_depth : require
void xlat_main( out lowp vec4 ocol, out mediump float oz );
#line 1
void xlat_main( out lowp vec4 ocol, out mediump float oz ) {
@@ -10,6 +11,6 @@ void main() {
mediump float xlt_oz;
xlat_main( xlt_ocol, xlt_oz);
gl_FragData[0] = vec4(xlt_ocol);
- gl_FragDepth = float(xlt_oz);
+ gl_FragDepthEXT = float(xlt_oz);
;
}
@@ -247,12 +247,14 @@ static bool CheckGLSL (bool vertex, ETargetVersion version, const std::string& s
newSrc += "#define texture2DLodEXT texture2DLod\n";
newSrc += "#define texture2DProjLodEXT texture2DProjLod\n";
newSrc += "#define texture2DGradEXT texture2DGradARB\n";
+ newSrc += "#define gl_FragDepthEXT gl_FragDepth\n";
newSrc += "float shadow2DEXT (sampler2DShadow s, vec3 p) { return shadow2D(s,p).r; }\n";
newSrc += "float shadow2DProjEXT (sampler2DShadow s, vec4 p) { return shadow2DProj(s,p).r; }\n";
newSrc += source;
replace_string (newSrc, "GL_EXT_shader_texture_lod", "GL_ARB_shader_texture_lod", 0);
replace_string (newSrc, "#extension GL_OES_standard_derivatives : require", "", 0);
replace_string (newSrc, "#extension GL_EXT_shadow_samplers : require", "", 0);
+ replace_string (newSrc, "#extension GL_EXT_frag_depth : require", "", 0);
sourcePtr = newSrc.c_str();
}

0 comments on commit 3d02748

Please sign in to comment.