我正在用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上的笔记本电脑上。
答案 0 :(得分:0)
显示的链接崩溃基于显卡驱动程序中的错误。看来,实际问题与静态循环优化有关。
此问题的快速修补程序是将K
设置为输入统一变量,或根据另一个输入变量设置K
。当然,这不是一个好的解决方案,但它是一个,它可以在nvidia修复bug之前使用。