为什么GLSL着色器的链接会崩溃我的程序?

时间:2015-12-18 15:14:19

标签: opengl segmentation-fault glsl shader

我正在用GLSL编写一个计算着色器,它确实运行良好,直到我在这个着色器中使用了一些实现的函数。它仍然编译但现在它在链接时崩溃我的程序导致分段错误。编译完成没有任何错误(或者不打印)。编译和链接也适用于其他计算着色器。

我试图在着色器中找到一些有问题的代码行,我确实发现了一些,但我不知道它们为什么会导致这种崩溃。所以我提供了部分代码:

#version 430 core

//Input point cloud
struct pc_point_t{
  vec4 vertex;
  vec4 normal;
};

layout (std430, binding = 0) buffer pointCloudBuffer
{
  pc_point_t pointCloud[];
};

//global nearest neighbor stuff
int idxNN[15];
float distNN[15];
vec3 vertNN[15];
vec3 normNN[15];
#define K 4

void initNeighbors()
{
  float curDist, maxDist; //maxDist gets initalized

  for(int i = 1; i < K ; i++)
  {
    curDist = distance(currentCubePosition,pointCloud[i].vertex.xyz);
    if(curDist > maxDist)
    {
      //maxDist = curDist; //This line causes the crash.
    }
  }

  for(int i = 0; i < K; i++)
  {
    //idxNN[i] = idxMaxNeighbor;  //This line causes the crash.
    distNN[i] = maxDist;
    //vertNN[i] = pointCloud[idxMaxNeighbor].vertex.xyz;  //This line causes the crash.
  }
}

void neighborSearch()
{
  initNeighbors();

  //do the neighbor search
  //...

  for(int i = 0; i < K; i++)
  {
    //normNN[i] = pointCloud[idxNN[i]].normal.xyz; //This line causes the crash.
  }
}

main()
{
  //do some stuff
  //...

  neighborSearch();

  //do some more stuff
  //...
}

有人知道为什么会这样吗? 请询问您是否需要更多信息。

上周没有更新图形驱动程序,导致崩溃的所有行都标有注释。

以下是编译和链接着色器的代码:

std::shared_ptr<QOpenGLShaderProgram> cGLSLShaderHandler::createComputeShaderProgram(const QString &computeShaderPath)
{
  auto shaderProgram = std::make_shared<QOpenGLShaderProgram>();
  bool result = true;
  //! Load and compile the compute shader
  if (!computeShaderPath.isEmpty()) {
    result = shaderProgram->addShaderFromSourceFile(QOpenGLShader::Compute,
                                                    computeShaderPath);
    if (!result) {
        qWarning() << computeShaderPath;
        qWarning() << shaderProgram->log();
    }
  }
  //! ...and finally link it to resolve any references.
  result = shaderProgram->link();

  if (!result)
    qWarning() << "Could not link shader program:" << shaderProgram->log();
  return shaderProgram;
}

并且调试器的回溯如下:

0  ??
1  ??
...
14  ??
15  QOpenGLShaderProgram::link()
16  DeviceHandler::QtOpenGL::cGLSLShaderHandler::createComputeShaderProgram
... -> The rest should be irrelevant

地址清理程序的输出显示实际崩溃是在libnvidia中。所以这应该是显卡驱动程序错误。

问题出现在使用optirun和PC上的笔记本电脑上。

1 个答案:

答案 0 :(得分:0)

显示的链接崩溃基于显卡驱动程序中的错误。看来,实际问题与静态循环优化有关。

此问题的快速修补程序是将K设置为输入统一变量,或根据另一个输入变量设置K。当然,这不是一个好的解决方案,但它是一个,它可以在nvidia修复bug之前使用。