我发生了一次非常随机的崩溃,在10次左右的时间里我会在nvoglv32.dll
中崩溃。它并不总是发生在完全相同的地方,但确实发生在同一地方的10行左右。
我添加了使用glTexSubImage2D()
更新纹理的功能,现在我有这些间歇性的崩溃。
void UpdateTexture(const GLuint textureID, const CaffApp::Dev::Format format, const CaffApp::Dev::TextureD dimention, const uint32_t offsetX, const uint32_t offsetY, const uint32_t width, const uint32_t height, void *data)
{
using namespace CaffApp::Dev;
const auto externalFormat = format == Format::DEV ? GL_RGBA32F : GL_RGBA ;
const auto internalFormat = GL_RGBA;
const auto formatType = format == Format::R8G8B8 ? GL_UNSIGNED_BYTE : GL_FLOAT;
const auto glDimention = GetDimentionTarget(dimention);
assert(CaffMath::IsPOW2(texWidth));
assert(CaffMath::IsPOW2(texHeight));
glBindTexture(glDimention, textureID);
switch(glDimention)
{
case(GL_TEXTURE_1D):
{
glTexSubImage1D(GL_TEXTURE_1D, offsetX, 0, texWidth, internalFormat, formatType, data);
break;
}
case(GL_TEXTURE_2D):
{
glTexSubImage2D(GL_TEXTURE_2D, 0, offsetX, offsetY, texWidth, texHeight, internalFormat, formatType, data);
break;
}
};
glBindTexture(glDimention, 0);
GL_ERROR("Updating texture.")
}
void Texture::updateSubset(const std::vector<float> &data, const uint32_t offsetX, const uint32_t offsetY)
{
assert(m_textureID);
uint32_t sizeX = m_width;
uint32_t sizeY = m_height;
if(sizeX == 0 || sizeY == 0)
{
SetTextureDimentionFromDataSize(m_dimention, data.size(), sizeX, sizeY);
}
UpdateTexture(m_textureID, m_format, m_dimention, offsetX, offsetY, sizeX, sizeY, (void*)data.data());
GL_ERROR("Updating texture.")
}
如果崩溃发生,它只在第一次调用glTexSubImage ...时发生。否则罚款。
我确实看到了一些关于顶点属性未正确设置的内容,但是我无法在那里看到任何错误,并且该代码在2年左右的时间内没有被更改过,所以我在思考它在这附近。
有什么想法吗?
答案 0 :(得分:0)
无论data
点是什么,你都可能访问越界。如果未正确设置对齐和步幅,则会发生这种情况。如果将数据分配为short,也会发生这种情况;当第一个东西写出越界时,它不会崩溃,它可以污染地址空间并在其他地方触发崩溃。