TexImage2D在子线程OpenGL上下文随机触发栈溢出异常求助
子线程OpenGL上下文加载纹理时随机触发栈缓冲区溢出崩溃
开发了一款以网格形式展示图片的程序,用户向下滚动时会加载进入视野的图片。程序运行基本正常,但会出现无规律的随机崩溃,且崩溃均发生在图片加载阶段,和加载的特定图片、加载数量无关。
奇怪的是,崩溃发生时Visual Studio不会抛出异常。用procdump生成转储文件后分析发现,程序因异常码0xC0000409(对应Status Stack Buffer Overrun,栈缓冲区溢出)退出,触发点是nvoglv64.dll调用TexImage2D的过程中。
关键特征:仅在子线程使用次级OpenGL上下文加载纹理时才会出现此问题,主线程使用主上下文加载时完全稳定,且两种加载逻辑几乎没有差异。
谷歌搜索仅找到3条相关结果,其中1条为英文内容,完全不知道该从何处入手调试,恳请提供帮助。
纹理加载代码(每个待加载纹理都会被尽可能快地调用此方法)
public static void Load( int FileIndex ) { BindlessTexture Texture = new(); Texture.Handle = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, Texture.Handle); Image<Rgba32> ImageData = Image.Load<Rgba32>(Library.Paths[FileIndex]); ImageData.Mutate(X => X.Flip(FlipMode.Vertical)); byte[] PixelData = new byte[4 * ImageData.Width * ImageData.Height]; ImageData.CopyPixelDataTo(PixelData); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorderArb); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToBorderArb); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, new float[4]); GL.TexImage2D( TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, ImageData.Width, ImageData.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, PixelData ); PixelData = null; ImageData.Dispose(); GL.BindTexture(TextureTarget.Texture2D, 0); Texture.BindlessHandle = GL.Arb.GetTextureHandle(Texture.Handle); lock ( Library.BindlessTextures ) //I don't think either thread will collide but just in case? lock ( Library.BindlessTextureHandles ) { Library.BindlessTextures[FileIndex] = Texture; Library.BindlessTextureHandles[FileIndex] = Texture.BindlessHandle; } TexturesToFinalize.Enqueue(FileIndex); }
主线程纹理最终处理代码(加载完成后将纹理句柄常驻并编组到映射的SSBO)
public void FinalizeLoadingTextures() { while ( TextureLoader.TexturesToFinalize.Count != 0 ) { int FileIndex = TextureLoader.TexturesToFinalize.Dequeue(); BindlessTexture Texture = Library.BindlessTextures[FileIndex]; if ( Texture is not null ) { GL.Arb.MakeTextureHandleResident(Texture.BindlessHandle); Marshal.WriteInt64(Library.BindlessTextureHandleBufferPointer, FileIndex * 8, Texture.BindlessHandle); } } }
内容的提问来源于stack exchange,提问作者BBonless
相关产品推荐
相关产品推荐

