if (!aShader->Create (myGlContext))
{
- const TCollection_ExtendedString aMessage = "Error: Failed to create shader object";
-
+ const TCollection_ExtendedString aMessage = TCollection_ExtendedString ("Error: Failed to create ") +
+ (theType == GL_VERTEX_SHADER ? "vertex" : "fragment") + " shader object";
+
myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
GL_DEBUG_TYPE_ERROR_ARB, 0, GL_DEBUG_SEVERITY_HIGH_ARB, aMessage);
if (!aShader->LoadSource (myGlContext, theSource.Source()))
{
- const TCollection_ExtendedString aMessage = "Error: Failed to set shader source";
-
+ const TCollection_ExtendedString aMessage = TCollection_ExtendedString ("Error: Failed to set ") +
+ (theType == GL_VERTEX_SHADER ? "vertex" : "fragment") + " shader source";
+
myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
GL_DEBUG_TYPE_ERROR_ARB, 0, GL_DEBUG_SEVERITY_HIGH_ARB, aMessage);
if (!aShader->Compile (myGlContext))
{
- if (aShader->FetchInfoLog (myGlContext, aBuildLog))
- {
- const TCollection_ExtendedString aMessage =
- TCollection_ExtendedString ("Error: Failed to compile shader object:\n") + aBuildLog;
+ aShader->FetchInfoLog (myGlContext, aBuildLog);
-#ifdef RAY_TRACE_PRINT_INFO
- std::cout << aBuildLog << std::endl;
-#endif
+ const TCollection_ExtendedString aMessage = TCollection_ExtendedString ("Error: Failed to compile ") +
+ (theType == GL_VERTEX_SHADER ? "vertex" : "fragment") + " shader object:\n" + aBuildLog;
+
+ myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
+ GL_DEBUG_TYPE_ERROR_ARB, 0, GL_DEBUG_SEVERITY_HIGH_ARB, aMessage);
- myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
- GL_DEBUG_TYPE_ERROR_ARB, 0, GL_DEBUG_SEVERITY_HIGH_ARB, aMessage);
- }
-
aShader->Release (myGlContext.operator->());
return Handle(OpenGl_ShaderObject)();
}
-
-#ifdef RAY_TRACE_PRINT_INFO
- if (aShader->FetchInfoLog (myGlContext, aBuildLog))
+ else if (myGlContext->caps->glslWarnings)
{
- if (!aBuildLog.IsEmpty())
- {
- std::cout << aBuildLog << std::endl;
- }
- else
+ aShader->FetchInfoLog (myGlContext, aBuildLog);
+
+ if (!aBuildLog.IsEmpty() && !aBuildLog.IsEqual ("No errors.\n"))
{
- std::cout << "Info: shader build log is empty" << std::endl;
+ const TCollection_ExtendedString aMessage = TCollection_ExtendedString (theType == GL_VERTEX_SHADER ?
+ "Vertex" : "Fragment") + " shader was compiled with following warnings:\n" + aBuildLog;
+
+ myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
+ GL_DEBUG_TYPE_PORTABILITY_ARB, 0, GL_DEBUG_SEVERITY_LOW_ARB, aMessage);
}
- }
-#endif
+ }
return aShader;
}
myComputeInitStatus = OpenGl_RT_FAIL;
ReleaseRaytraceResources();
-
+
return Standard_False;
}
// =======================================================================
Standard_Boolean OpenGl_Workspace::InitRaytraceResources (const Graphic3d_CView& theCView)
{
+ if (myComputeInitStatus == OpenGl_RT_FAIL)
+ {
+ return Standard_False;
+ }
+
Standard_Boolean aToRebuildShaders = Standard_False;
if (myComputeInitStatus == OpenGl_RT_INIT)
if (!myRaytraceShader->LoadSource (myGlContext, myRaytraceShaderSource.Source())
|| !myPostFSAAShader->LoadSource (myGlContext, myPostFSAAShaderSource.Source()))
{
- return Standard_False;
+ return SafeFailBack ("Failed to load source into ray-tracing fragment shaders");
}
if (!myRaytraceShader->Compile (myGlContext)
|| !myPostFSAAShader->Compile (myGlContext))
{
- return Standard_False;
+ return SafeFailBack ("Failed to compile ray-tracing fragment shaders");
}
myRaytraceProgram->SetAttributeName (myGlContext, Graphic3d_TOA_POS, "occVertex");
if (!myRaytraceProgram->Link (myGlContext)
|| !myPostFSAAProgram->Link (myGlContext))
{
- return Standard_False;
+ return SafeFailBack ("Failed to initialize vertex attributes for ray-tracing program");
}
}
}
{
if (!myGlContext->IsGlGreaterEqual (3, 1))
{
- myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
- GL_DEBUG_TYPE_ERROR_ARB, 0, GL_DEBUG_SEVERITY_HIGH_ARB,
- "Ray-tracing requires OpenGL 3.1 and higher");
- return Standard_False;
+ return SafeFailBack ("Ray-tracing requires OpenGL 3.1 and higher");
}
else if (!myGlContext->arbTboRGB32)
{
- myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
- GL_DEBUG_TYPE_ERROR_ARB, 0, GL_DEBUG_SEVERITY_HIGH_ARB,
- "Ray-tracing requires OpenGL 4.0+ or GL_ARB_texture_buffer_object_rgb32 extension");
- return Standard_False;
+ return SafeFailBack ("Ray-tracing requires OpenGL 4.0+ or GL_ARB_texture_buffer_object_rgb32 extension");
}
myRaytraceParameters.NbBounces = theCView.RenderParams.RaytracingDepth;
if (aFolder.IsEmpty())
{
- const TCollection_ExtendedString aMessage = "Failed to locate shaders directory";
-
- myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
- GL_DEBUG_TYPE_ERROR_ARB, 0, GL_DEBUG_SEVERITY_HIGH_ARB, aMessage);
-
- return Standard_False;
+ return SafeFailBack ("Failed to locate shaders directory");
}
if (myIsRaytraceDataValid)
if (aBasicVertShader.IsNull())
{
- return SafeFailBack ("Failed to set vertex shader source");
+ return SafeFailBack ("Failed to initialize ray-trace vertex shader");
}
- TCollection_AsciiString aFiles[] = { aFolder + "/RaytraceBase.fs", aFolder + "/RaytraceRender.fs" };
+ TCollection_AsciiString aFiles[] = { aFolder + "/RaytraceBase.fs",
+ aFolder + "/RaytraceRender.fs" };
myRaytraceShaderSource.Load (aFiles, 2);
{
aBasicVertShader->Release (myGlContext.operator->());
- return SafeFailBack ("Failed to set ray-trace fragment shader source");
+ return SafeFailBack ("Failed to initialize ray-trace fragment shader");
}
myRaytraceProgram = new OpenGl_ShaderProgram;
}
myRaytraceProgram->SetAttributeName (myGlContext, Graphic3d_TOA_POS, "occVertex");
+
+ TCollection_AsciiString aLinkLog;
+
if (!myRaytraceProgram->Link (myGlContext))
{
- TCollection_AsciiString aLinkLog;
+ myRaytraceProgram->FetchInfoLog (myGlContext, aLinkLog);
+
+ return SafeFailBack (TCollection_ExtendedString (
+ "Failed to link ray-trace shader program:\n") + aLinkLog);
+ }
+ else if (myGlContext->caps->glslWarnings)
+ {
+ myRaytraceProgram->FetchInfoLog (myGlContext, aLinkLog);
- if (myRaytraceProgram->FetchInfoLog (myGlContext, aLinkLog))
+ if (!aLinkLog.IsEmpty() && !aLinkLog.IsEqual ("No errors.\n"))
{
- #ifdef RAY_TRACE_PRINT_INFO
- std::cout << aLinkLog << std::endl;
- #endif
- }
+ const TCollection_ExtendedString aMessage = TCollection_ExtendedString (
+ "Ray-trace shader program was linked with following warnings:\n") + aLinkLog;
- return SafeFailBack ("Failed to link ray-trace shader program");
+ myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
+ GL_DEBUG_TYPE_PORTABILITY_ARB, 0, GL_DEBUG_SEVERITY_LOW_ARB, aMessage);
+ }
}
}
if (aBasicVertShader.IsNull())
{
- return SafeFailBack ("Failed to set vertex shader source");
+ return SafeFailBack ("Failed to initialize FSAA vertex shader");
}
- TCollection_AsciiString aFiles[] = { aFolder + "/RaytraceBase.fs", aFolder + "/RaytraceSmooth.fs" };
+ TCollection_AsciiString aFiles[] = { aFolder + "/RaytraceBase.fs",
+ aFolder + "/RaytraceSmooth.fs" };
myPostFSAAShaderSource.Load (aFiles, 2);
{
aBasicVertShader->Release (myGlContext.operator->());
- return SafeFailBack ("Failed to set FSAA fragment shader source");
+ return SafeFailBack ("Failed to initialize FSAA fragment shader");
}
myPostFSAAProgram = new OpenGl_ShaderProgram;
}
myPostFSAAProgram->SetAttributeName (myGlContext, Graphic3d_TOA_POS, "occVertex");
+
+ TCollection_AsciiString aLinkLog;
+
if (!myPostFSAAProgram->Link (myGlContext))
{
- TCollection_AsciiString aLinkLog;
+ myPostFSAAProgram->FetchInfoLog (myGlContext, aLinkLog);
+
+ return SafeFailBack (TCollection_ExtendedString (
+ "Failed to link FSAA shader program:\n") + aLinkLog);
+ }
+ else if (myGlContext->caps->glslWarnings)
+ {
+ myPostFSAAProgram->FetchInfoLog (myGlContext, aLinkLog);
- if (myPostFSAAProgram->FetchInfoLog (myGlContext, aLinkLog))
+ if (!aLinkLog.IsEmpty() && !aLinkLog.IsEqual ("No errors.\n"))
{
- #ifdef RAY_TRACE_PRINT_INFO
- std::cout << aLinkLog << std::endl;
- #endif
+ const TCollection_ExtendedString aMessage = TCollection_ExtendedString (
+ "FSAA shader program was linked with following warnings:\n") + aLinkLog;
+
+ myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
+ GL_DEBUG_TYPE_PORTABILITY_ARB, 0, GL_DEBUG_SEVERITY_LOW_ARB, aMessage);
}
-
- return SafeFailBack ("Failed to link FSAA shader program");
}
}
}
const Aspect_CLayer2d& theCUnderLayer,
OpenGl_FrameBuffer* theFrameBuffer)
{
- if (!InitRaytraceResources (theCView))
- return Standard_False;
-
if (!ResizeRaytraceBuffers (theSizeX, theSizeY))
return Standard_False;