2013-04-10 79 views
4

我正在研究一个十多年前的跨平台应用程序。用户界面是由Qt和后端渲染是用OpenGL完成的。 OpenGL上下文在后端进行管理,而不是由Qt进行管理。如何检测Mac OS X中的“无效drawable”?

我最近添加了错误检查和报告在我们的应用程序中的所有OpenGL代码。偶尔会出现这样一种情况,即由Qt启动的第一个呈现会在终端中导致“无效可绘制”错误消息,并且所有后续的OpenGl调用均会失败并报告“无效帧缓冲区”错误。这些无效的可绘制错误消息在过去被视为无害,因为在用户看到它之前,drawable最终变为有效并且场景被正确渲染。但是,由于报告了大量错误,因此使用新的OpenGL错误检查/报告是不可能的。

我想测试drawable是否有效。如果不是,它应该在渲染开始之前返回。我如何确认drawable是有效的?

的MacBook Pro,OS X山狮(10.8.3),ATI显卡

回答

4

我不知道在什么API级别你的工作。事实之后,我不确定是否有可能检测到问题。也就是说,如果你拥有的只是一个上下文(可能隐含为线程的当前上下文),那么它无法连接到它的drawable。

我认为Qt是在引擎盖下使用可可。我进一步假设它已经创建了一个NSOpenGLContext并且正在调用-setView:。如果在那次调用时,视图的窗口没有窗口设备,那么会出现“无效可绘制”错误。

一种常见的技术是推迟设置上下文的视图,直到视图调用-drawRect:为止,因为此时您确定该视图具有窗口并且该窗口具有设备。 (虽然忽略强制绘图正常的窗口显示机制之外的可能性。例如,-cacheDisplayInRect:toBitmapImageRep:。)

如果你只是想知道在调用点到-setView:是否安全与否,我认为你可以依靠检查[[view window] windowNumber]的值。为-windowNumber文档说:

如果该窗口没有窗户装置,返回的值将等于或小于0

另一种方法是,以防止这个问题,而不是检测它。对此的策略基本上是为了确保窗口在呼叫-setView:之前已被显示和绘制。您可以通过在屏幕上订购并在其上调用-display来强制执行此操作。

+0

我们正在使用可可而不是qt使用它。是的,我想找到一种方法来测试无效的上下文。 [[view window] windowNumber]在某些时候有效,但不是全部时间。 – user2267882 2013-04-12 18:40:57

+0

它以哪种方式失败,误报或误报? – 2013-04-13 09:07:51

0

Ken Thomases发给我我需要的基本信息以找到可行的解决方案。需要额外的条件。这是什么工作

//---------------------------------------------------------------------------- 
bool vtkCocoaRenderWindow::IsDrawable()                                                                             
{ 
    // you must initialize it first 
    // else it always evaluates false 
    this->Initialize(); 

    // first check that window is valid 
    NSView *theView = (NSView*)this->GetWindowId(); 
    bool win =[[theView window] windowNumber]>0; 

    // then check that the drawable is valid 
    NSOpenGLContext *context = (NSOpenGLContext *)this->GetContextId(); 
    bool ok = [context view] != nil; 
    return win && ok; 
}