@@ -1625,18 +1625,42 @@ void RB_FXAA()
16251625 GL_BindToTMU ( 0 , tr.currentRenderImage [backEnd.currentMainFBO ] )
16261626 );
16271627
1628- // The framebuffer should use GL_LINEAR for FXAA to work.
1629- glTexParameterf ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
1630- glTexParameterf ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
1628+ bool greaterThanGL33 = std::make_pair ( glConfig.glMajor , glConfig.glMinor ) >= std::make_pair ( 3 , 3 );
1629+
1630+ // FXAA expect GL_LINEAR for the sampling to work.
1631+ if ( greaterThanGL33 )
1632+ {
1633+ // Bind a sampler.
1634+ GLuint sampler = 0 ;
1635+ glGenSamplers ( 1 , &sampler );
1636+ glSamplerParameteri ( sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR) ;
1637+ glSamplerParameteri ( sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
1638+ glBindSampler ( 0 , sampler );
1639+ }
1640+ else
1641+ {
1642+ // Change the filter (requires a texture bind).
1643+ glTexParameterf ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
1644+ glTexParameterf ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
1645+ }
16311646
16321647 // This shader is run last, so let it render to screen.
16331648 R_BindNullFBO ();
16341649
16351650 Tess_InstantScreenSpaceQuad ();
16361651
1637- // Restore GL_NEAREST to not break other effects.
1638- glTexParameterf ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
1639- glTexParameterf ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
1652+ // Make sure we didn't break other effects expecting GL_NEAREST.
1653+ if ( greaterThanGL33 )
1654+ {
1655+ // Unbind the sampler.
1656+ glBindSampler ( 0 , 0 );
1657+ }
1658+ else
1659+ {
1660+ // Restore the filter (requires a texture bind).
1661+ glTexParameterf ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
1662+ glTexParameterf ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
1663+ }
16401664
16411665 GL_CheckErrors ();
16421666}
0 commit comments