* fix: FBO creation was random

* disable MSAA with samples = 0, even if more is forced via driver
This commit is contained in:
Garux 2018-03-05 13:48:48 +03:00
parent 552d0ac083
commit 0bf509dc1a
6 changed files with 46 additions and 37 deletions

View File

@ -120,9 +120,6 @@ public:
glVertex2f( rectangle.x, rectangle.y ); glVertex2f( rectangle.x, rectangle.y );
glEnd(); glEnd();
if( GlobalOpenGL().GL_1_3() ) {
glEnable( GL_MULTISAMPLE );
}
GlobalOpenGL_debugAssertNoErrors(); GlobalOpenGL_debugAssertNoErrors();
} }
} }

View File

@ -1278,12 +1278,10 @@ public:
_constructed = false; _constructed = false;
} }
virtual void start(){ virtual void start(){
// if ( GlobalOpenGL().GL_1_3() ) {
// glDisable( GL_MULTISAMPLE );
// }
if( !_constructed ){ if( !_constructed ){
construct(); construct();
} }
setMultisample();
glBindFramebuffer( GL_FRAMEBUFFER, _fbo ); glBindFramebuffer( GL_FRAMEBUFFER, _fbo );
} }
virtual void save(){ virtual void save(){
@ -1306,6 +1304,14 @@ protected:
GLuint _tex; GLuint _tex;
GLuint _depth; GLuint _depth;
GLuint _color; GLuint _color;
void setMultisample(){
if( GlobalOpenGL().GL_1_3() ) {
if( _samples )
glEnable( GL_MULTISAMPLE );
else
glDisable( GL_MULTISAMPLE );
}
}
virtual void construct() { virtual void construct() {
int curSamples; int curSamples;
glGetIntegerv( GL_SAMPLES, &curSamples ); glGetIntegerv( GL_SAMPLES, &curSamples );
@ -1319,6 +1325,8 @@ protected:
_samples = maxSamples; _samples = maxSamples;
} }
} }
// globalErrorStream() << _samples << " samples\n";
setMultisample();
glGenFramebuffers( 1, &_fbo ); glGenFramebuffers( 1, &_fbo );
glBindFramebuffer( GL_FRAMEBUFFER, _fbo ); glBindFramebuffer( GL_FRAMEBUFFER, _fbo );
@ -1381,7 +1389,7 @@ public:
glMatrixMode( GL_PROJECTION ); glMatrixMode( GL_PROJECTION );
glLoadIdentity(); glLoadIdentity();
glOrtho( 0, _width, 0, _height, -100, 100 ); glOrtho( 0, 1, 0, 1, -100, 100 );
glMatrixMode( GL_MODELVIEW ); glMatrixMode( GL_MODELVIEW );
glLoadIdentity(); glLoadIdentity();
@ -1405,17 +1413,17 @@ public:
glBindTexture( GL_TEXTURE_2D, _tex ); glBindTexture( GL_TEXTURE_2D, _tex );
glColor4f( 1.0, 1.0, 1.0, 1.0 ); glColor4f( 1.f, 1.f, 1.f, 1.f );
glBegin( GL_QUADS ); glBegin( GL_QUADS );
glTexCoord2f( 0, 0 ); glTexCoord2i( 0, 0 );
glVertex3f( 0, 0, 0 ); glVertex2i( 0, 0 );
glTexCoord2f( 0, 1 ); glTexCoord2i( 0, 1 );
glVertex3f( 0, _height, 0 ); glVertex2i( 0, 1 );
glTexCoord2f( 1, 1 ); glTexCoord2i( 1, 1 );
glVertex3f( _width, _height, 0 ); glVertex2i( 1, 1 );
glTexCoord2f( 1, 0 ); glTexCoord2i( 1, 0 );
glVertex3f( _width, 0, 0 ); glVertex2i( 1, 0 );
glEnd(); glEnd();
glBindTexture( GL_TEXTURE_2D, 0 ); glBindTexture( GL_TEXTURE_2D, 0 );
} }

View File

@ -717,6 +717,9 @@ FreezePointer m_freezePointer;
public: public:
FBO* m_fbo; FBO* m_fbo;
FBO* fbo_get(){
return m_fbo = m_fbo? m_fbo : GlobalOpenGL().support_ARB_framebuffer_object? new FBO : new FBO_fallback;
}
GtkWidget* m_gl_widget; GtkWidget* m_gl_widget;
GtkWindow* m_parent; GtkWindow* m_parent;
@ -952,7 +955,7 @@ void camwnd_update_xor_rectangle( CamWnd& self, rect_t area ){
GlobalOpenGL_debugAssertNoErrors(); GlobalOpenGL_debugAssertNoErrors();
glDrawBuffer( GL_FRONT ); glDrawBuffer( GL_FRONT );
self.m_fbo->blit(); self.fbo_get()->blit();
self.m_XORRectangle.set( rectangle_from_area( area.min, area.max, self.getCamera().width, self.getCamera().height ), self.getCamera().width, self.getCamera().height ); self.m_XORRectangle.set( rectangle_from_area( area.min, area.max, self.getCamera().width, self.getCamera().height ), self.getCamera().width, self.getCamera().height );
@ -1070,7 +1073,7 @@ gboolean wheelmove_scroll( GtkWidget* widget, GdkEventScroll* event, CamWnd* cam
} }
gboolean camera_size_allocate( GtkWidget* widget, GtkAllocation* allocation, CamWnd* camwnd ){ gboolean camera_size_allocate( GtkWidget* widget, GtkAllocation* allocation, CamWnd* camwnd ){
camwnd->m_fbo->reset( allocation->width, allocation->height, g_camwindow_globals_private.m_MSAA, true ); camwnd->fbo_get()->reset( allocation->width, allocation->height, g_camwindow_globals_private.m_MSAA, true );
camwnd->getCamera().width = allocation->width; camwnd->getCamera().width = allocation->width;
camwnd->getCamera().height = allocation->height; camwnd->getCamera().height = allocation->height;
Camera_updateProjection( camwnd->getCamera() ); Camera_updateProjection( camwnd->getCamera() );
@ -1378,9 +1381,9 @@ CamWnd::CamWnd() :
m_selection_motion_handler( 0 ), m_selection_motion_handler( 0 ),
m_freelook_button_press_handler( 0 ), m_freelook_button_press_handler( 0 ),
m_freelook_button_release_handler( 0 ), m_freelook_button_release_handler( 0 ),
m_drawing( false ){ m_drawing( false ),
m_fbo = GlobalOpenGL().support_ARB_framebuffer_object? new FBO : new FBO_fallback; m_fbo( 0 )
{
m_bFreeMove = false; m_bFreeMove = false;
GlobalWindowObservers_add( m_window_observer ); GlobalWindowObservers_add( m_window_observer );
@ -1663,7 +1666,7 @@ void ShowStatsToggle(){
void CamWnd::Cam_Draw(){ void CamWnd::Cam_Draw(){
// globalOutputStream() << "Cam_Draw()\n"; // globalOutputStream() << "Cam_Draw()\n";
m_fbo->start(); fbo_get()->start();
glViewport( 0, 0, m_Camera.width, m_Camera.height ); glViewport( 0, 0, m_Camera.width, m_Camera.height );
#if 0 #if 0
@ -1831,7 +1834,7 @@ void CamWnd::Cam_Draw(){
// elsewhere using/modifying texture maps between contexts // elsewhere using/modifying texture maps between contexts
glBindTexture( GL_TEXTURE_2D, 0 ); glBindTexture( GL_TEXTURE_2D, 0 );
m_fbo->save(); fbo_get()->save();
} }
void CamWnd::draw(){ void CamWnd::draw(){
@ -2123,7 +2126,7 @@ typedef FreeCaller1<const IntImportCallback&, RenderModeExport> RenderModeExport
void CamMSAAImport( int value ){ void CamMSAAImport( int value ){
g_camwindow_globals_private.m_MSAA = value ? 1 << value : value; g_camwindow_globals_private.m_MSAA = value ? 1 << value : value;
if ( g_camwnd != 0 ) { if ( g_camwnd != 0 ) {
g_camwnd->m_fbo->reset( g_camwnd->getCamera().width, g_camwnd->getCamera().height, g_camwindow_globals_private.m_MSAA, true ); g_camwnd->fbo_get()->reset( g_camwnd->getCamera().width, g_camwnd->getCamera().height, g_camwindow_globals_private.m_MSAA, true );
} }
} }
typedef FreeCaller1<int, CamMSAAImport> MSAAImportCaller; typedef FreeCaller1<int, CamMSAAImport> MSAAImportCaller;

View File

@ -1269,9 +1269,6 @@ void Texture_Draw( TextureBrowser& textureBrowser ){
// reset the current texture // reset the current texture
glBindTexture( GL_TEXTURE_2D, 0 ); glBindTexture( GL_TEXTURE_2D, 0 );
if( GlobalOpenGL().GL_1_3() ) {
glEnable( GL_MULTISAMPLE );
}
glDisable( GL_BLEND ); glDisable( GL_BLEND );
//qglFinish(); //qglFinish();
} }

View File

@ -768,7 +768,7 @@ bool XYWnd::XY_Draw_Overlay_start(){
if ( Map_Valid( g_map ) && ScreenUpdates_Enabled() ) { if ( Map_Valid( g_map ) && ScreenUpdates_Enabled() ) {
GlobalOpenGL_debugAssertNoErrors(); GlobalOpenGL_debugAssertNoErrors();
glDrawBuffer( GL_FRONT ); glDrawBuffer( GL_FRONT );
m_fbo->blit(); fbo_get()->blit();
return true; return true;
} }
} }
@ -852,7 +852,7 @@ gboolean xywnd_wheel_scroll( GtkWidget* widget, GdkEventScroll* event, XYWnd* xy
} }
gboolean xywnd_size_allocate( GtkWidget* widget, GtkAllocation* allocation, XYWnd* xywnd ){ gboolean xywnd_size_allocate( GtkWidget* widget, GtkAllocation* allocation, XYWnd* xywnd ){
xywnd->m_fbo->reset( allocation->width, allocation->height, g_xywindow_globals_private.m_MSAA, false ); xywnd->fbo_get()->reset( allocation->width, allocation->height, g_xywindow_globals_private.m_MSAA, false );
xywnd->m_nWidth = allocation->width; xywnd->m_nWidth = allocation->width;
xywnd->m_nHeight = allocation->height; xywnd->m_nHeight = allocation->height;
xywnd->updateProjection(); xywnd->updateProjection();
@ -888,10 +888,9 @@ XYWnd::XYWnd() :
m_deferred_motion( xywnd_motion, this ), m_deferred_motion( xywnd_motion, this ),
m_parent( 0 ), m_parent( 0 ),
m_window_observer( NewWindowObserver() ), m_window_observer( NewWindowObserver() ),
m_chasemouse_handler( 0 ) m_chasemouse_handler( 0 ),
m_fbo( 0 )
{ {
m_fbo = GlobalOpenGL().support_ARB_framebuffer_object? new FBO : new FBO_fallback;
m_cursorCurrent = 0; m_cursorCurrent = 0;
m_bActive = false; m_bActive = false;
@ -999,6 +998,10 @@ void XYWnd::Scroll( int x, int y ){
queueDraw(); queueDraw();
} }
FBO* XYWnd::fbo_get(){
return m_fbo = m_fbo? m_fbo : GlobalOpenGL().support_ARB_framebuffer_object? new FBO : new FBO_fallback;
}
unsigned int Clipper_buttons(){ unsigned int Clipper_buttons(){
return RAD_LBUTTON; return RAD_LBUTTON;
} }
@ -2702,7 +2705,7 @@ void XYWnd::XY_Draw(){
glGetIntegerv(GL_SAMPLES,&curSamples); glGetIntegerv(GL_SAMPLES,&curSamples);
globalOutputStream() << curSamples << " GL_SAMPLES\n"; globalOutputStream() << curSamples << " GL_SAMPLES\n";
*/ */
m_fbo->start(); fbo_get()->start();
// //
// clear // clear
// //
@ -2903,7 +2906,7 @@ void XYWnd::XY_Draw(){
m_render_time.start(); m_render_time.start();
} }
m_fbo->save(); fbo_get()->save();
{ {
// reset modelview // reset modelview
@ -3302,13 +3305,13 @@ void ToggleShowGrid(){
void MSAAImport( int value ){ void MSAAImport( int value ){
g_xywindow_globals_private.m_MSAA = value ? 1 << value : value; g_xywindow_globals_private.m_MSAA = value ? 1 << value : value;
if ( g_pParentWnd->GetXYWnd() ) { if ( g_pParentWnd->GetXYWnd() ) {
g_pParentWnd->GetXYWnd()->m_fbo->reset( g_pParentWnd->GetXYWnd()->Width(), g_pParentWnd->GetXYWnd()->Height(), g_xywindow_globals_private.m_MSAA, false ); g_pParentWnd->GetXYWnd()->fbo_get()->reset( g_pParentWnd->GetXYWnd()->Width(), g_pParentWnd->GetXYWnd()->Height(), g_xywindow_globals_private.m_MSAA, false );
} }
if ( g_pParentWnd->GetXZWnd() ) { if ( g_pParentWnd->GetXZWnd() ) {
g_pParentWnd->GetXZWnd()->m_fbo->reset( g_pParentWnd->GetXZWnd()->Width(), g_pParentWnd->GetXZWnd()->Height(), g_xywindow_globals_private.m_MSAA, false ); g_pParentWnd->GetXZWnd()->fbo_get()->reset( g_pParentWnd->GetXZWnd()->Width(), g_pParentWnd->GetXZWnd()->Height(), g_xywindow_globals_private.m_MSAA, false );
} }
if ( g_pParentWnd->GetYZWnd() ) { if ( g_pParentWnd->GetYZWnd() ) {
g_pParentWnd->GetYZWnd()->m_fbo->reset( g_pParentWnd->GetYZWnd()->Width(), g_pParentWnd->GetYZWnd()->Height(), g_xywindow_globals_private.m_MSAA, false ); g_pParentWnd->GetYZWnd()->fbo_get()->reset( g_pParentWnd->GetYZWnd()->Width(), g_pParentWnd->GetYZWnd()->Height(), g_xywindow_globals_private.m_MSAA, false );
} }
} }
typedef FreeCaller1<int, MSAAImport> MSAAImportCaller; typedef FreeCaller1<int, MSAAImport> MSAAImportCaller;

View File

@ -78,6 +78,7 @@ DeferredDraw m_deferredDraw;
DeferredMotion m_deferred_motion; DeferredMotion m_deferred_motion;
public: public:
FBO* m_fbo; FBO* m_fbo;
FBO* fbo_get();
GtkWindow* m_parent; GtkWindow* m_parent;
XYWnd(); XYWnd();
~XYWnd(); ~XYWnd();