<div dir="ltr"><div dir="ltr">Hi James, <div><br></div><div>Its not direct answer to your questions but a code snippet overloading Program which I used to change shader variant depending on compilation/link result (from most advanced to more basic fallbacks).  This approach was quite simple I tested Program compilation result including compilation/link log obtained from PCP(PerContextProgram ?) by simply checking if my Program was really applied after Program::apply() and if not adopted fallback to less demanding shaders. Not sure if this will solve your problem but perhaps will be a step forward to proper solution.</div><div><br></div><div>class MyProgram: public osg::Program<br>{<br>public:<br>    MyProgram( ): _shaderVariant( DefaultShaderVariant )<br>    {<br>        osg::Shader * vertShader = osgDB::readShaderFile( osg::Shader::VERTEX, "MyVertexShader.glsl" );<br>        osg::Shader * fragShader = osgDB::readShaderFile( osg::Shader::FRAGMENT, "MyFragmentShader.glsl" );<br><br>        addShader( vertShader );<br>        addShader( fragShader );        <br><br>        notified.resize( DefaultShaderVariant + 1 );<br>    }<br><br>    void setDigitDefine( std::string MACRO, int DIGIT ) const<br>    {</div><div>          //  For brevity code removed but</div><div>          //  this function simply checks shader sources and </div><div>          //   finds all ocurences of </div><div>          // #define MACRO DEFAULT_DIGIT </div><div>          //  and replaces them  to </div><div>          // #define MACRO DIGIT </div><div>          // to select shader codepath dependant on macro value</div><div>    }<br><br>    void apply( osg::State& state ) const<br>    {        <br>        while( _shaderVariant > 0 )<br>        {            <br>            osg::Program::apply( state );<br><br>            // Break if program was applied ie its not null<br>            if( state.getLastAppliedProgramObject() != NULL )<br>            {<br>                if( !notified[0] )<br>                {<br>                    std::cout<< "INFO: MyProgram - GLSL Compilation Succeeded." << std::endl;<br>                    std::cout<< "  Shader variant: " << _shaderVariant << std::endl;<br>                    std::cout<< "  GL Vendor:      " << glGetString(GL_VENDOR) << std::endl;<br>                    std::cout<< "  GL Renderer:    " << glGetString(GL_RENDERER) << std::endl;            <br>                    std::cout<< "  GL Version:     " << glGetString(GL_VERSION) << std::endl;<br>                    notified[0] = true;<br>                }<br>                break;<br>            }<br><br>            if( !notified[_shaderVariant] )<br>            {<br>                std::string infoLog;<br>                getPCP( state )->getInfoLog( infoLog );<br>                std::cout<< "ERROR: MyProgram - GLSL Compilation Failed." << std::endl;<br>                std::cout<< "  Shader variant: " << _shaderVariant << std::endl;<br>                std::cout<< "  GL Vendor: " << glGetString(GL_VENDOR) << std::endl;<br>                std::cout<< "  GL Renderer: " << glGetString(GL_RENDERER) << std::endl;            <br>                std::cout<< "  GL Version: " << glGetString(GL_VERSION) << std::endl;<br>                std::cout<< infoLog << std::endl;<br><br>                notified[_shaderVariant] = true;<br>            }<br><br>            // Switch to fallback variants if program link failed<br>            setDigitDefine( "SHADER_VARIANT", --_shaderVariant );<br>        }<br>    }<br><br>protected:<br>    mutable int _shaderVariant;<br>    static const int DefaultShaderVariant = 2;<br>    mutable std::vector< bool > notified;<br>};<br><br></div><div>Cheers,<br></div><div>Wojtek Lewandowski</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">śr., 24 lut 2021 o 10:30 James Turner <<a href="mailto:zakalawe@mac.com">zakalawe@mac.com</a>> napisał(a):<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
I’m trying to extract shader compile and link info logs at runtime, so I can log+report them.<br>
<br>
I note osg::Program::getGlProgramInfoLog exists, obviously it takes a context ID since the PerContextProgram is what has the actual errors.<br>
<br>
Two things I need help with:<br>
<br>
1) does the program log also contain shader compile errors, or is this only the link log? I don’t see a corresponding APi on osg::Shader, is why I ask<br>
<br>
2) *when* can I call the log functions and expect to get valid results? Given the OSg drawing model, obviously the log won’t be available immediately. Do I need to use a DrawCallback to check the log after the first time the Program has been used?<br>
<br>
I looked for examples of using getGlProgramInfoLog but unfortunately couldn't find any, maybe pointing me at one would answer both of these points.<br>
<br>
Kind regards,<br>
James Turner<br>
<br>
_______________________________________________<br>
osg-users mailing list<br>
<a href="mailto:osg-users@lists.openscenegraph.org" target="_blank">osg-users@lists.openscenegraph.org</a><br>
<a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" rel="noreferrer" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
</blockquote></div>