36 using namespace KIGFX;
43 compositor( aCompositor )
93 void draw_fullscreen_primitive()
95 glMatrixMode( GL_MODELVIEW );
98 glMatrixMode( GL_PROJECTION );
103 glBegin( GL_TRIANGLES );
104 glTexCoord2f( 0.0f, 1.0f );
105 glVertex2f( -1.0f, 1.0f );
106 glTexCoord2f( 0.0f, 0.0f );
107 glVertex2f( -1.0f, -1.0f );
108 glTexCoord2f( 1.0f, 1.0f );
109 glVertex2f( 1.0f, 1.0f );
111 glTexCoord2f( 1.0f, 1.0f );
112 glVertex2f( 1.0f, 1.0f );
113 glTexCoord2f( 0.0f, 0.0f );
114 glVertex2f( -1.0f, -1.0f );
115 glTexCoord2f( 1.0f, 0.0f );
116 glVertex2f( 1.0f, -1.0f );
120 glMatrixMode( GL_MODELVIEW );
131 compositor( aCompositor ),
132 ssaaMainBuffer( 0 ), areBuffersCreated( false ), areShadersCreated( false )
144 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
145 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
175 glDisable( GL_BLEND );
176 glDisable( GL_DEPTH_TEST );
177 glActiveTexture( GL_TEXTURE0 );
181 draw_fullscreen_primitive();
201 areBuffersInitialized( false ),
202 shadersLoaded( false ),
203 compositor( aCompositor )
226 glEnable( GL_TEXTURE_2D );
227 glActiveTexture( GL_TEXTURE0 );
231 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
232 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
233 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
234 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
237 checkGlError(
"loading smaa area tex", __FILE__, __LINE__ );
241 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
242 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
243 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
244 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
247 checkGlError(
"loading smaa search tex", __FILE__, __LINE__ );
261 std::string quality_string;
262 const char* edge_detect_shader;
266 quality_string =
"#define SMAA_THRESHOLD 0.005\n" 267 "#define SMAA_MAX_SEARCH_STEPS 1\n" 268 "#define SMAA_MAX_SEARCH_STEPS_DIAG 2\n" 269 "#define SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR 1.5\n" 270 "#define SMAA_CORNER_ROUNDING 0\n";
274 std::string vert_preamble( R
"SHADER( 276 #define SMAA_GLSL_2_1 277 #define SMAA_INCLUDE_VS 1 278 #define SMAA_INCLUDE_PS 0 279 uniform vec4 SMAA_RT_METRICS; 282 std::string frag_preamble( R"SHADER( 284 #define SMAA_GLSL_2_1 285 #define SMAA_INCLUDE_VS 0 286 #define SMAA_INCLUDE_PS 1 287 uniform vec4 SMAA_RT_METRICS; 302 quality_string, smaa_source, edge_detect_shader );
304 checkGlError(
"linking pass 1 shader", __FILE__, __LINE__ );
306 GLint smaaColorTexParameter =
pass_1_shader->AddParameter(
"colorTex" );
307 checkGlError(
"pass1: getting colorTex uniform", __FILE__, __LINE__ );
309 checkGlError(
"pass1: getting metrics uniform", __FILE__, __LINE__ );
312 checkGlError(
"pass1: using shader", __FILE__, __LINE__ );
314 checkGlError(
"pass1: setting colorTex uniform", __FILE__, __LINE__ );
316 checkGlError(
"pass1: deactivating shader", __FILE__, __LINE__ );
325 quality_string, smaa_source,
328 checkGlError(
"linking pass 2 shader", __FILE__, __LINE__ );
330 GLint smaaEdgesTexParameter =
pass_2_shader->AddParameter(
"edgesTex" );
331 checkGlError(
"pass2: getting colorTex uniform", __FILE__, __LINE__ );
332 GLint smaaAreaTexParameter =
pass_2_shader->AddParameter(
"areaTex" );
333 checkGlError(
"pass2: getting areaTex uniform", __FILE__, __LINE__ );
334 GLint smaaSearchTexParameter =
pass_2_shader->AddParameter(
"searchTex" );
335 checkGlError(
"pass2: getting searchTex uniform", __FILE__, __LINE__ );
337 checkGlError(
"pass2: getting metrics uniform", __FILE__, __LINE__ );
340 checkGlError(
"pass2: using shader", __FILE__, __LINE__ );
342 checkGlError(
"pass2: setting colorTex uniform", __FILE__, __LINE__ );
344 checkGlError(
"pass2: setting areaTex uniform", __FILE__, __LINE__ );
346 checkGlError(
"pass2: setting searchTex uniform", __FILE__, __LINE__ );
348 checkGlError(
"pass2: deactivating shader", __FILE__, __LINE__ );
357 quality_string, smaa_source,
361 GLint smaaP3ColorTexParameter =
pass_3_shader->AddParameter(
"colorTex" );
362 checkGlError(
"pass3: getting colorTex uniform", __FILE__, __LINE__ );
363 GLint smaaBlendTexParameter =
pass_3_shader->AddParameter(
"blendTex" );
364 checkGlError(
"pass3: getting blendTex uniform", __FILE__, __LINE__ );
366 checkGlError(
"pass3: getting metrics uniform", __FILE__, __LINE__ );
369 checkGlError(
"pass3: using shader", __FILE__, __LINE__ );
371 checkGlError(
"pass3: setting colorTex uniform", __FILE__, __LINE__ );
373 checkGlError(
"pass3: setting blendTex uniform", __FILE__, __LINE__ );
375 checkGlError(
"pass3: deactivating shader", __FILE__, __LINE__ );
386 checkGlError(
"pass1: using shader", __FILE__, __LINE__ );
388 float( dims.x ),
float( dims.y ) );
389 checkGlError(
"pass1: setting metrics uniform", __FILE__, __LINE__ );
391 checkGlError(
"pass1: deactivating shader", __FILE__, __LINE__ );
394 checkGlError(
"pass2: using shader", __FILE__, __LINE__ );
396 float( dims.x ),
float( dims.y ) );
397 checkGlError(
"pass2: setting metrics uniform", __FILE__, __LINE__ );
399 checkGlError(
"pass2: deactivating shader", __FILE__, __LINE__ );
402 checkGlError(
"pass3: using shader", __FILE__, __LINE__ );
404 float( dims.x ),
float( dims.y ) );
405 checkGlError(
"pass3: setting metrics uniform", __FILE__, __LINE__ );
407 checkGlError(
"pass3: deactivating shader", __FILE__, __LINE__ );
419 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
420 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
423 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
424 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
427 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
428 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
467 void draw_fullscreen_triangle()
469 glMatrixMode( GL_MODELVIEW );
472 glMatrixMode( GL_PROJECTION );
476 glBegin( GL_TRIANGLES );
477 glTexCoord2f( 0.0f, 1.0f );
478 glVertex2f( -1.0f, 1.0f );
479 glTexCoord2f( 0.0f, -1.0f );
480 glVertex2f( -1.0f, -3.0f );
481 glTexCoord2f( 2.0f, 1.0f );
482 glVertex2f( 3.0f, 1.0f );
486 glMatrixMode( GL_MODELVIEW );
496 glDisable( GL_BLEND );
497 glDisable( GL_DEPTH_TEST );
498 glEnable( GL_TEXTURE_2D );
506 glActiveTexture( GL_TEXTURE0 );
507 glBindTexture( GL_TEXTURE_2D, sourceTexture );
510 checkGlError(
"using smaa pass 1 shader", __FILE__, __LINE__ );
511 draw_fullscreen_triangle();
522 glActiveTexture( GL_TEXTURE0 );
523 glBindTexture( GL_TEXTURE_2D, edgesTex );
524 glActiveTexture( GL_TEXTURE1 );
526 glActiveTexture( GL_TEXTURE3 );
530 draw_fullscreen_triangle();
540 glActiveTexture( GL_TEXTURE0 );
541 glBindTexture( GL_TEXTURE_2D, sourceTexture );
542 glActiveTexture( GL_TEXTURE1 );
543 glBindTexture( GL_TEXTURE_2D, blendTex );
546 draw_fullscreen_triangle();
VECTOR2U GetInternalBufferSize() override
VECTOR2U GetScreenSize() const
virtual void DrawBuffer(unsigned int aBufferHandle) override
Draw the selected buffer to the output buffer.
The Cairo implementation of the graphics abstraction layer.
ANTIALIASING_SUPERSAMPLING(OPENGL_COMPOSITOR *aCompositor)
ANTIALIASING_NONE(OPENGL_COMPOSITOR *aCompositor)
static const COLOR4D BLACK
const char smaa_pass_3_fragment_shader[]
unsigned int smaaEdgesBuffer
int checkGlError(const std::string &aInfo, const char *aFile, int aLine, bool aThrow)
Check if a recent OpenGL operation has failed.
VECTOR2U GetInternalBufferSize() override
unsigned int smaaSearchTex
void DrawBuffer(GLuint aBuffer) override
static const unsigned int DIRECT_RENDERING
const char smaa_base_shader_p1[]
Handle multitarget rendering (ie.
ANTIALIASING_SMAA(OPENGL_COMPOSITOR *aCompositor)
OPENGL_COMPOSITOR * compositor
VECTOR2U GetInternalBufferSize() override
void DrawBuffer(GLuint buffer) override
static const unsigned char searchTexBytes[]
Stored in R8 format.
const char smaa_base_shader_p4[]
void DrawBuffer(GLuint) override
virtual void ClearBuffer(const COLOR4D &aColor) override
Clear the selected buffer (set by the SetBuffer() function).
const unsigned char areaTexBytes[]
Stored in R8G8 format.
bool areBuffersInitialized
const char smaa_base_shader_p2[]
const char smaa_pass_2_fragment_shader[]
unsigned int smaaBlendBuffer
virtual void SetBuffer(unsigned int aBufferHandle) override
Set the selected buffer as the rendering target.
OPENGL_COMPOSITOR * compositor
std::unique_ptr< SHADER > pass_2_shader
const char smaa_pass_1_vertex_shader[]
const char smaa_pass_2_vertex_shader[]
std::unique_ptr< SHADER > pass_3_shader
GLenum GetBufferTexture(unsigned int aBufferHandle)
unsigned int ssaaMainBuffer
const char smaa_base_shader_p3[]
unsigned int CreateBuffer() override
virtual unsigned int CreateBuffer() override
Prepare a new buffer that may be used as a rendering target.
void OnLostBuffers() override
std::unique_ptr< SHADER > pass_1_shader
OPENGL_COMPOSITOR * compositor
unsigned int CreateBuffer() override
unsigned int CreateBuffer() override
const char smaa_pass_1_fragment_shader_luma[]
const char smaa_pass_3_vertex_shader[]
void OnLostBuffers() override
void OnLostBuffers() override
unsigned int smaaBaseBuffer