fix blue flash, fix offscreen buffer leakage

This commit is contained in:
David Rose 2007-03-05 22:07:16 +00:00
parent fbeb4d6c3f
commit cbdb7e76b1
18 changed files with 112 additions and 32 deletions

View File

@ -117,6 +117,7 @@ GraphicsEngine(Pipeline *pipeline) :
_windows_sorted = true; _windows_sorted = true;
_window_sort_index = 0; _window_sort_index = 0;
_needs_open_windows = false;
set_threading_model(GraphicsThreadingModel(threading_model)); set_threading_model(GraphicsThreadingModel(threading_model));
if (!_threading_model.is_default()) { if (!_threading_model.is_default()) {
@ -568,6 +569,15 @@ render_frame() {
} }
#endif #endif
if (_needs_open_windows) {
// Make sure our buffers and windows are fully realized before we
// render a frame. We do this particularly to realize our
// offscreen buffers, so that we don't render a frame before the
// offscreen buffers are ready (which might result in a frame
// going by without some textures having been rendered).
open_windows();
}
ClockObject *global_clock = ClockObject::get_global_clock(); ClockObject *global_clock = ClockObject::get_global_clock();
if (display_cat.is_spam()) { if (display_cat.is_spam()) {
@ -800,6 +810,8 @@ open_windows() {
thread->_cv_mutex.release(); thread->_cv_mutex.release();
} }
} }
_needs_open_windows = false;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -1166,6 +1178,8 @@ cull_to_bins(GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void GraphicsEngine:: void GraphicsEngine::
draw_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) { draw_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) {
nassertv(wlist.verify_list());
Windows::const_iterator wi; Windows::const_iterator wi;
for (wi = wlist.begin(); wi != wlist.end(); ++wi) { for (wi = wlist.begin(); wi != wlist.end(); ++wi) {
GraphicsOutput *win = (*wi); GraphicsOutput *win = (*wi);
@ -1174,6 +1188,10 @@ draw_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) {
if (win->begin_frame(GraphicsOutput::FM_render, current_thread)) { if (win->begin_frame(GraphicsOutput::FM_render, current_thread)) {
win->clear(current_thread); win->clear(current_thread);
if (display_cat.is_spam()) {
display_cat.spam()
<< "Drawing window " << win->get_name() << "\n";
}
int num_display_regions = win->get_num_active_display_regions(); int num_display_regions = win->get_num_active_display_regions();
for (int i = 0; i < num_display_regions; ++i) { for (int i = 0; i < num_display_regions; ++i) {
DisplayRegion *dr = win->get_active_display_region(i); DisplayRegion *dr = win->get_active_display_region(i);
@ -1195,6 +1213,16 @@ draw_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) {
} }
} }
} }
} else {
if (display_cat.is_spam()) {
display_cat.spam()
<< "Not drawing window " << win->get_name() << "\n";
}
}
} else {
if (display_cat.is_spam()) {
display_cat.spam()
<< "Window " << win->get_name() << " is inactive\n";
} }
} }
} }
@ -1648,6 +1676,7 @@ do_add_window(GraphicsOutput *window,
} }
window->request_open(); window->request_open();
_needs_open_windows = true;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -1920,6 +1949,8 @@ remove_window(GraphicsOutput *window) {
PT(GraphicsOutput) ptwin = window; PT(GraphicsOutput) ptwin = window;
_cull.erase(ptwin); _cull.erase(ptwin);
_cdraw.erase(ptwin);
_draw.erase(ptwin);
Windows::iterator wi; Windows::iterator wi;
@ -1969,6 +2000,14 @@ resort_windows() {
} }
display_cat.debug(false) display_cat.debug(false)
<< "\n"; << "\n";
for (wi = _draw.begin(); wi != _draw.end(); ++wi) {
GraphicsOutput *win = (*wi);
display_cat.debug(false)
<< " " << win->get_name() << "(" << win->get_sort() << ")";
}
display_cat.debug(false)
<< "\n";
} }
} }
@ -2090,12 +2129,18 @@ do_pending(GraphicsEngine *engine, Thread *current_thread) {
ReMutexHolder holder(_wl_lock); ReMutexHolder holder(_wl_lock);
if (!_pending_close.empty()) { if (!_pending_close.empty()) {
if (display_cat.is_debug()) {
display_cat.debug()
<< "_pending_close.size() = " << _pending_close.size() << "\n";
}
// Close any windows that were pending closure. // Close any windows that were pending closure.
Windows::iterator wi; Windows::iterator wi;
for (wi = _pending_close.begin(); wi != _pending_close.end(); ++wi) { for (wi = _pending_close.begin(); wi != _pending_close.end(); ++wi) {
GraphicsOutput *win = (*wi); GraphicsOutput *win = (*wi);
win->set_close_now(); win->set_close_now();
} }
_pending_close.clear();
} }
} }

View File

@ -316,6 +316,7 @@ private:
Windows _windows; Windows _windows;
bool _windows_sorted; bool _windows_sorted;
unsigned int _window_sort_index; unsigned int _window_sort_index;
bool _needs_open_windows;
WindowRenderer _app; WindowRenderer _app;
typedef pmap<string, PT(RenderThread) > Threads; typedef pmap<string, PT(RenderThread) > Threads;

View File

@ -554,10 +554,10 @@ get_draw_window_pcollector() {
// Description: Display the spam message associated with begin_frame // Description: Display the spam message associated with begin_frame
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE void GraphicsOutput:: INLINE void GraphicsOutput::
begin_frame_spam() { begin_frame_spam(FrameMode mode) {
if (display_cat.is_spam()) { if (display_cat.is_spam()) {
display_cat.spam() display_cat.spam()
<< "begin_frame(): " << get_type() << " " << "begin_frame(" << mode << "): " << get_type() << " "
<< get_name() << " " << (void *)this << "\n"; << get_name() << " " << (void *)this << "\n";
} }
} }
@ -568,10 +568,10 @@ begin_frame_spam() {
// Description: Display the spam message associated with end_frame // Description: Display the spam message associated with end_frame
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE void GraphicsOutput:: INLINE void GraphicsOutput::
end_frame_spam() { end_frame_spam(FrameMode mode) {
if (display_cat.is_spam()) { if (display_cat.is_spam()) {
display_cat.spam() display_cat.spam()
<< "end_frame(): " << get_type() << " " << "end_frame(" << mode << "): " << get_type() << " "
<< get_name() << " " << (void *)this << "\n"; << get_name() << " " << (void *)this << "\n";
} }
} }

View File

@ -1189,3 +1189,21 @@ do_determine_display_regions() {
stable_sort(_active_display_regions.begin(), _active_display_regions.end(), IndirectLess<DisplayRegion>()); stable_sort(_active_display_regions.begin(), _active_display_regions.end(), IndirectLess<DisplayRegion>());
} }
////////////////////////////////////////////////////////////////////
// Function: GraphicsOutput::FrameMode output operator
// Description:
////////////////////////////////////////////////////////////////////
ostream &
operator << (ostream &out, GraphicsOutput::FrameMode fm) {
switch (fm) {
case GraphicsOutput::FM_render:
return out << "render";
case GraphicsOutput::FM_parasite:
return out << "parasite";
case GraphicsOutput::FM_refresh:
return out << "refresh";
}
return out << "(**invalid GraphicsOutput::FrameMode(" << (int)fm << ")**)";
}

View File

@ -242,8 +242,8 @@ protected:
void prepare_for_deletion(); void prepare_for_deletion();
void copy_to_textures(); void copy_to_textures();
INLINE void begin_frame_spam(); INLINE void begin_frame_spam(FrameMode mode);
INLINE void end_frame_spam(); INLINE void end_frame_spam(FrameMode mode);
INLINE void clear_cube_map_selection(); INLINE void clear_cube_map_selection();
INLINE void trigger_flip(); INLINE void trigger_flip();
@ -342,6 +342,8 @@ private:
friend class DisplayRegion; friend class DisplayRegion;
}; };
EXPCL_PANDA ostream &operator << (ostream &out, GraphicsOutput::FrameMode mode);
#include "graphicsOutput.I" #include "graphicsOutput.I"
#endif /* GRAPHICSOUTPUT_H */ #endif /* GRAPHICSOUTPUT_H */

View File

@ -109,7 +109,7 @@ get_host() {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
bool ParasiteBuffer:: bool ParasiteBuffer::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
begin_frame_spam(); begin_frame_spam(mode);
if (!_host->begin_frame(FM_parasite, current_thread)) { if (!_host->begin_frame(FM_parasite, current_thread)) {
return false; return false;
@ -136,7 +136,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void ParasiteBuffer:: void ParasiteBuffer::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);

View File

@ -101,7 +101,7 @@ wdxGraphicsBuffer8::
bool wdxGraphicsBuffer8:: bool wdxGraphicsBuffer8::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL) { if (_gsg == (GraphicsStateGuardian *)NULL) {
return false; return false;
} }
@ -134,7 +134,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
void wdxGraphicsBuffer8:: void wdxGraphicsBuffer8::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);
if (mode == FM_render) { if (mode == FM_render) {

View File

@ -78,7 +78,7 @@ wdxGraphicsWindow8::
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
bool wdxGraphicsWindow8:: bool wdxGraphicsWindow8::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL) { if (_gsg == (GraphicsStateGuardian *)NULL) {
return false; return false;
} }
@ -116,7 +116,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
void wdxGraphicsWindow8:: void wdxGraphicsWindow8::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);
if (mode == FM_render) { if (mode == FM_render) {

View File

@ -94,7 +94,7 @@ wdxGraphicsBuffer9::
bool wdxGraphicsBuffer9:: bool wdxGraphicsBuffer9::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL) { if (_gsg == (GraphicsStateGuardian *)NULL) {
return false; return false;
} }
@ -127,7 +127,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
void wdxGraphicsBuffer9:: void wdxGraphicsBuffer9::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);
if (mode == FM_render) { if (mode == FM_render) {

View File

@ -96,7 +96,7 @@ make_current() {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
bool wdxGraphicsWindow9:: bool wdxGraphicsWindow9::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL) { if (_gsg == (GraphicsStateGuardian *)NULL) {
return false; return false;
} }
@ -134,7 +134,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
void wdxGraphicsWindow9:: void wdxGraphicsWindow9::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);
if (mode == FM_render) { if (mode == FM_render) {

View File

@ -68,11 +68,21 @@ CLP(GraphicsBuffer)::
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
bool CLP(GraphicsBuffer):: bool CLP(GraphicsBuffer)::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
begin_frame_spam(mode);
if (!_is_valid) { if (!_is_valid) {
if (GLCAT.is_debug()) {
GLCAT.debug()
<< get_name() << " is not valid\n";
}
return false; return false;
} }
if (!_host->begin_frame(FM_parasite, current_thread)) { if (!_host->begin_frame(FM_parasite, current_thread)) {
if (GLCAT.is_debug()) {
GLCAT.debug()
<< get_name() << "'s host is not ready\n";
}
return false; return false;
} }
@ -81,6 +91,10 @@ begin_frame(FrameMode mode, Thread *current_thread) {
rebuild_bitplanes(); rebuild_bitplanes();
clear_cube_map_selection(); clear_cube_map_selection();
if (!check_fbo()) { if (!check_fbo()) {
if (GLCAT.is_debug()) {
GLCAT.debug()
<< get_name() << " check_fbo() returns false\n";
}
return false; return false;
} }
} }
@ -401,7 +415,7 @@ generate_mipmaps() {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void CLP(GraphicsBuffer):: void CLP(GraphicsBuffer)::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);
if (mode == FM_render) { if (mode == FM_render) {

View File

@ -79,7 +79,7 @@ bool glxGraphicsBuffer::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
PStatTimer timer(_make_current_pcollector, current_thread); PStatTimer timer(_make_current_pcollector, current_thread);
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL) { if (_gsg == (GraphicsStateGuardian *)NULL) {
return false; return false;
} }
@ -112,7 +112,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void glxGraphicsBuffer:: void glxGraphicsBuffer::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);
if (mode == FM_render) { if (mode == FM_render) {

View File

@ -127,7 +127,7 @@ bool glxGraphicsWindow::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
PStatTimer timer(_make_current_pcollector, current_thread); PStatTimer timer(_make_current_pcollector, current_thread);
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL) { if (_gsg == (GraphicsStateGuardian *)NULL) {
return false; return false;
} }
@ -168,7 +168,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void glxGraphicsWindow:: void glxGraphicsWindow::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);
if (mode == FM_render) { if (mode == FM_render) {

View File

@ -62,7 +62,7 @@ OsMesaGraphicsBuffer::
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
bool OsMesaGraphicsBuffer:: bool OsMesaGraphicsBuffer::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL) { if (_gsg == (GraphicsStateGuardian *)NULL) {
return false; return false;
} }
@ -91,7 +91,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void OsMesaGraphicsBuffer:: void OsMesaGraphicsBuffer::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);
if (mode == FM_render) { if (mode == FM_render) {

View File

@ -67,7 +67,7 @@ bool osxGraphicsBuffer::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
PStatTimer timer(_make_current_pcollector); PStatTimer timer(_make_current_pcollector);
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL) { if (_gsg == (GraphicsStateGuardian *)NULL) {
return false; return false;
} }
@ -96,7 +96,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void osxGraphicsBuffer:: void osxGraphicsBuffer::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);
if (mode == FM_render) if (mode == FM_render)

View File

@ -687,7 +687,7 @@ bool osxGraphicsWindow::begin_frame(FrameMode mode, Thread *current_thread)
{ {
PStatTimer timer(_make_current_pcollector); PStatTimer timer(_make_current_pcollector);
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL || if (_gsg == (GraphicsStateGuardian *)NULL ||
(_osx_window == NULL && _is_fullscreen != true)) { (_osx_window == NULL && _is_fullscreen != true)) {
// not powered up .. just abort.. // not powered up .. just abort..
@ -749,7 +749,7 @@ bool osxGraphicsWindow::begin_frame(FrameMode mode, Thread *current_thread)
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void osxGraphicsWindow::end_frame(FrameMode mode, Thread *current_thread) void osxGraphicsWindow::end_frame(FrameMode mode, Thread *current_thread)
{ {
end_frame_spam(); end_frame_spam(mode);
if(mode == FM_render ) { if(mode == FM_render ) {
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);

View File

@ -72,7 +72,7 @@ wglGraphicsBuffer::
bool wglGraphicsBuffer:: bool wglGraphicsBuffer::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL) { if (_gsg == (GraphicsStateGuardian *)NULL) {
return false; return false;
} }
@ -111,7 +111,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void wglGraphicsBuffer:: void wglGraphicsBuffer::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);
if (mode == FM_render) { if (mode == FM_render) {

View File

@ -66,7 +66,7 @@ wglGraphicsWindow::
bool wglGraphicsWindow:: bool wglGraphicsWindow::
begin_frame(FrameMode mode, Thread *current_thread) { begin_frame(FrameMode mode, Thread *current_thread) {
begin_frame_spam(); begin_frame_spam(mode);
if (_gsg == (GraphicsStateGuardian *)NULL) { if (_gsg == (GraphicsStateGuardian *)NULL) {
return false; return false;
} }
@ -98,7 +98,7 @@ begin_frame(FrameMode mode, Thread *current_thread) {
void wglGraphicsWindow:: void wglGraphicsWindow::
end_frame(FrameMode mode, Thread *current_thread) { end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(); end_frame_spam(mode);
nassertv(_gsg != (GraphicsStateGuardian *)NULL); nassertv(_gsg != (GraphicsStateGuardian *)NULL);