diff --git a/Test/pointCoord.frag b/Test/pointCoord.frag new file mode 100644 index 0000000000000000000000000000000000000000..9455246a2ca37efedaed1dedd0f8b53457958337 --- /dev/null +++ b/Test/pointCoord.frag @@ -0,0 +1,15 @@ +precision mediump float; + +uniform sampler2D sampler; + +void main() +{ + vec4 color; + + if (length(gl_PointCoord) < 0.3) + color = texture2D(sampler, gl_PointCoord); + else + color = vec4(0.0); + + gl_FragColor = color; +} diff --git a/Test/testlist b/Test/testlist index b1ce6c4fe180ae58a91c7388d0561916d9e4d814..6e8805858d6801c858725f2e1eec8ddbbaba4d93 100644 --- a/Test/testlist +++ b/Test/testlist @@ -16,3 +16,4 @@ cppSimple.vert cppIndent.vert cppNest.vert cppComplexExpr.vert +pointCoord.frag diff --git a/glslang/Include/BaseTypes.h b/glslang/Include/BaseTypes.h index 6c4ebb04e350d5580bd8edbb201c31c636218d31..ef3f910171500ef6136f395f454568e25cfea77d 100644 --- a/glslang/Include/BaseTypes.h +++ b/glslang/Include/BaseTypes.h @@ -94,6 +94,7 @@ enum TStorageQualifier { // built-ins read by fragment shader EvqFace, EvqFragCoord, + EvqPointCoord, // built-ins written by fragment shader EvqFragColor, @@ -123,8 +124,9 @@ __inline const char* getStorageQualifierString(TStorageQualifier q) case EvqPosition: return "Position"; break; case EvqPointSize: return "PointSize"; break; case EvqClipVertex: return "ClipVertex"; break; - case EvqFace: return "Face"; break; + case EvqFace: return "FrontFacing"; break; case EvqFragCoord: return "FragCoord"; break; + case EvqPointCoord: return "PointCoord"; break; case EvqFragColor: return "FragColor"; break; case EvqFragDepth: return "FragDepth"; break; default: return "unknown qualifier"; diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp index 60795f65f91662cac65b8ad9a49c700c1f4b6b9f..a02f0a30c1e73f7b180420d1968b1d2516bcabc5 100644 --- a/glslang/MachineIndependent/Initialize.cpp +++ b/glslang/MachineIndependent/Initialize.cpp @@ -831,14 +831,13 @@ void IdentifyBuiltIns(EShLanguage language, TSymbolTable& symbolTable) // the built-in header files. // switch(language) { + case EShLangFragment: + symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool, EvqFace, 1))); + symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"), TType(EbtFloat, EvqFragCoord, 4))); + symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"), TType(EbtFloat, EvqPointCoord, 2))); - case EShLangFragment: { - symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool, EvqFace, 1))); - symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"), TType(EbtFloat, EvqFragCoord, 4))); - symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"), TType(EbtFloat, EvqFragColor, 4))); - symbolTable.insert(*new TVariable(NewPoolTString("gl_FragDepth"), TType(EbtFloat, EvqFragDepth, 1))); - - } + symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"), TType(EbtFloat, EvqFragColor, 4))); + symbolTable.insert(*new TVariable(NewPoolTString("gl_FragDepth"), TType(EbtFloat, EvqFragDepth, 1))); break; case EShLangVertex: @@ -846,7 +845,12 @@ void IdentifyBuiltIns(EShLanguage language, TSymbolTable& symbolTable) symbolTable.insert(*new TVariable(NewPoolTString("gl_PointSize"), TType(EbtFloat, EvqPointSize, 1))); symbolTable.insert(*new TVariable(NewPoolTString("gl_ClipVertex"), TType(EbtFloat, EvqClipVertex, 4))); break; - default: break; + + case EShLangTessControl: + case EShLangTessEvaluation: + case EShLangGeometry: + // TODO: support these stages + break; } // diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index c968b75744bc09a7a55908de93eea08fdcbbcaee..189d197268acf13ed60ef76065a492514b257ad9 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -76,6 +76,7 @@ void TParseContext::setVersion(int newVersion) defaultPrecision[EbtInt] = EpqMedium; defaultPrecision[EbtSampler2D] = EpqLow; defaultPrecision[EbtSamplerCube] = EpqLow; + // TODO: give error when using float in frag shader without default precision } } else { for (int type = 0; type < EbtNumTypes; ++type) @@ -294,7 +295,10 @@ void TParseContext::binaryOpError(int line, char* op, TString left, TString righ void TParseContext::variableErrorCheck(TIntermTyped*& nodePtr) { TIntermSymbol* symbol = nodePtr->getAsSymbolNode(); - if (symbol && symbol->getType().getBasicType() == EbtVoid) { + if (! symbol) + return; + + if (symbol->getType().getBasicType() == EbtVoid) { error(symbol->getLine(), "undeclared identifier", symbol->getSymbol().c_str(), ""); recover(); @@ -307,6 +311,12 @@ void TParseContext::variableErrorCheck(TIntermTyped*& nodePtr) nodePtr = intermediate.addSymbol(fakeVariable->getUniqueId(), fakeVariable->getName(), fakeVariable->getType(), symbol->getLine()); + } else { + switch (symbol->getQualifier().storage) { + case EvqPointCoord: + profileRequires(symbol->getLine(), ENoProfile, 120, 0, "gl_PointCoord"); + break; + } } } @@ -372,6 +382,7 @@ bool TParseContext::lValueErrorCheck(int line, char* op, TIntermTyped* node) case EvqVaryingIn: message = "can't modify a varying"; break; case EvqFace: message = "can't modify gl_FrontFace"; break; case EvqFragCoord: message = "can't modify gl_FragCoord"; break; + case EvqPointCoord: message = "can't modify gl_PointCoord"; break; default: // diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp index f95445d95ee2ee6928c65af6a50cfdc4c2ec9097..4c1d909f59054f6084a9fdecf116b35ee9fbe471 100644 --- a/glslang/MachineIndependent/ShaderLang.cpp +++ b/glslang/MachineIndependent/ShaderLang.cpp @@ -217,8 +217,7 @@ bool InitializeSymbolTable(TBuiltInStrings* BuiltInStrings, EShLanguage language } for (TBuiltInStrings::iterator i = BuiltInStrings[parseContext.language].begin(); - i != BuiltInStrings[parseContext.language].end(); - ++i) { + i != BuiltInStrings[parseContext.language].end(); ++i) { const char* builtInShaders[1]; int builtInLengths[1];