32#include <glsl_smaa_base.h>
33#include <glsl_smaa_pass_1_frag_color.h>
34#include <glsl_smaa_pass_1_frag_luma.h>
35#include <glsl_smaa_pass_1_vert.h>
36#include <glsl_smaa_pass_2_frag.h>
37#include <glsl_smaa_pass_2_vert.h>
38#include <glsl_smaa_pass_3_frag.h>
39#include <glsl_smaa_pass_3_vert.h>
50 compositor( aCompositor )
100void draw_fullscreen_primitive()
102 glMatrixMode( GL_MODELVIEW );
105 glMatrixMode( GL_PROJECTION );
110 glBegin( GL_TRIANGLES );
111 glTexCoord2f( 0.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, 1.0f );
116 glVertex2f( 1.0f, 1.0f );
118 glTexCoord2f( 1.0f, 1.0f );
119 glVertex2f( 1.0f, 1.0f );
120 glTexCoord2f( 0.0f, 0.0f );
121 glVertex2f( -1.0f, -1.0f );
122 glTexCoord2f( 1.0f, 0.0f );
123 glVertex2f( 1.0f, -1.0f );
127 glMatrixMode( GL_MODELVIEW );
138 compositor( aCompositor ),
139 ssaaMainBuffer( 0 ), areBuffersCreated( false ), areShadersCreated( false )
151 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
152 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
182 glDisable( GL_BLEND );
183 glDisable( GL_DEPTH_TEST );
184 glActiveTexture( GL_TEXTURE0 );
188 draw_fullscreen_primitive();
208 areBuffersInitialized( false ),
209 shadersLoaded( false ),
210 compositor( aCompositor )
233 glEnable( GL_TEXTURE_2D );
234 glActiveTexture( GL_TEXTURE0 );
238 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
239 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
240 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
241 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
244 checkGlError(
"loading smaa area tex", __FILE__, __LINE__ );
248 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
249 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
250 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
251 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
254 checkGlError(
"loading smaa search tex", __FILE__, __LINE__ );
268 std::string quality_string;
269 std::string edge_detect_shader;
273 quality_string =
"#define SMAA_THRESHOLD 0.005\n"
274 "#define SMAA_MAX_SEARCH_STEPS 1\n"
275 "#define SMAA_MAX_SEARCH_STEPS_DIAG 2\n"
276 "#define SMAA_LOCAL_CONTRAST_ADAPTATION_FACTOR 1.5\n"
277 "#define SMAA_CORNER_ROUNDING 0\n";
278 edge_detect_shader = BUILTIN_SHADERS::glsl_smaa_pass_1_frag_luma;
281 std::string vert_preamble( R
"SHADER(
284#define SMAA_INCLUDE_VS 1
285#define SMAA_INCLUDE_PS 0
286uniform vec4 SMAA_RT_METRICS;
289 std::string frag_preamble( R"SHADER(
292#define SMAA_INCLUDE_VS 0
293#define SMAA_INCLUDE_PS 1
294uniform vec4 SMAA_RT_METRICS;
302 BUILTIN_SHADERS::glsl_smaa_base,
303 BUILTIN_SHADERS::glsl_smaa_pass_1_vert );
305 quality_string, BUILTIN_SHADERS::glsl_smaa_base, edge_detect_shader );
307 checkGlError(
"linking pass 1 shader", __FILE__, __LINE__ );
309 GLint smaaColorTexParameter =
pass_1_shader->AddParameter(
"colorTex" );
310 checkGlError(
"pass1: getting colorTex uniform", __FILE__, __LINE__ );
312 checkGlError(
"pass1: getting metrics uniform", __FILE__, __LINE__ );
315 checkGlError(
"pass1: using shader", __FILE__, __LINE__ );
317 checkGlError(
"pass1: setting colorTex uniform", __FILE__, __LINE__ );
319 checkGlError(
"pass1: deactivating shader", __FILE__, __LINE__ );
326 BUILTIN_SHADERS::glsl_smaa_base,
327 BUILTIN_SHADERS::glsl_smaa_pass_2_vert );
329 quality_string, BUILTIN_SHADERS::glsl_smaa_base,
330 BUILTIN_SHADERS::glsl_smaa_pass_2_frag );
332 checkGlError(
"linking pass 2 shader", __FILE__, __LINE__ );
334 GLint smaaEdgesTexParameter =
pass_2_shader->AddParameter(
"edgesTex" );
335 checkGlError(
"pass2: getting colorTex uniform", __FILE__, __LINE__ );
336 GLint smaaAreaTexParameter =
pass_2_shader->AddParameter(
"areaTex" );
337 checkGlError(
"pass2: getting areaTex uniform", __FILE__, __LINE__ );
338 GLint smaaSearchTexParameter =
pass_2_shader->AddParameter(
"searchTex" );
339 checkGlError(
"pass2: getting searchTex uniform", __FILE__, __LINE__ );
341 checkGlError(
"pass2: getting metrics uniform", __FILE__, __LINE__ );
344 checkGlError(
"pass2: using shader", __FILE__, __LINE__ );
346 checkGlError(
"pass2: setting colorTex uniform", __FILE__, __LINE__ );
348 checkGlError(
"pass2: setting areaTex uniform", __FILE__, __LINE__ );
350 checkGlError(
"pass2: setting searchTex uniform", __FILE__, __LINE__ );
352 checkGlError(
"pass2: deactivating shader", __FILE__, __LINE__ );
359 BUILTIN_SHADERS::glsl_smaa_base,
360 BUILTIN_SHADERS::glsl_smaa_pass_3_vert );
362 quality_string, BUILTIN_SHADERS::glsl_smaa_base,
363 BUILTIN_SHADERS::glsl_smaa_pass_3_frag );
366 GLint smaaP3ColorTexParameter =
pass_3_shader->AddParameter(
"colorTex" );
367 checkGlError(
"pass3: getting colorTex uniform", __FILE__, __LINE__ );
368 GLint smaaBlendTexParameter =
pass_3_shader->AddParameter(
"blendTex" );
369 checkGlError(
"pass3: getting blendTex uniform", __FILE__, __LINE__ );
371 checkGlError(
"pass3: getting metrics uniform", __FILE__, __LINE__ );
374 checkGlError(
"pass3: using shader", __FILE__, __LINE__ );
376 checkGlError(
"pass3: setting colorTex uniform", __FILE__, __LINE__ );
378 checkGlError(
"pass3: setting blendTex uniform", __FILE__, __LINE__ );
380 checkGlError(
"pass3: deactivating shader", __FILE__, __LINE__ );
391 checkGlError(
"pass1: using shader", __FILE__, __LINE__ );
393 float( dims.x ),
float( dims.y ) );
394 checkGlError(
"pass1: setting metrics uniform", __FILE__, __LINE__ );
396 checkGlError(
"pass1: deactivating shader", __FILE__, __LINE__ );
399 checkGlError(
"pass2: using shader", __FILE__, __LINE__ );
401 float( dims.x ),
float( dims.y ) );
402 checkGlError(
"pass2: setting metrics uniform", __FILE__, __LINE__ );
404 checkGlError(
"pass2: deactivating shader", __FILE__, __LINE__ );
407 checkGlError(
"pass3: using shader", __FILE__, __LINE__ );
409 float( dims.x ),
float( dims.y ) );
410 checkGlError(
"pass3: setting metrics uniform", __FILE__, __LINE__ );
412 checkGlError(
"pass3: deactivating shader", __FILE__, __LINE__ );
424 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
425 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
428 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
429 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
432 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
433 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
472void draw_fullscreen_triangle()
474 glMatrixMode( GL_MODELVIEW );
477 glMatrixMode( GL_PROJECTION );
481 glBegin( GL_TRIANGLES );
482 glTexCoord2f( 0.0f, 1.0f );
483 glVertex2f( -1.0f, 1.0f );
484 glTexCoord2f( 0.0f, -1.0f );
485 glVertex2f( -1.0f, -3.0f );
486 glTexCoord2f( 2.0f, 1.0f );
487 glVertex2f( 3.0f, 1.0f );
491 glMatrixMode( GL_MODELVIEW );
501 glDisable( GL_BLEND );
502 glDisable( GL_DEPTH_TEST );
503 glEnable( GL_TEXTURE_2D );
511 glActiveTexture( GL_TEXTURE0 );
512 glBindTexture( GL_TEXTURE_2D, sourceTexture );
515 checkGlError(
"using smaa pass 1 shader", __FILE__, __LINE__ );
516 draw_fullscreen_triangle();
527 glActiveTexture( GL_TEXTURE0 );
528 glBindTexture( GL_TEXTURE_2D, edgesTex );
529 glActiveTexture( GL_TEXTURE1 );
531 glActiveTexture( GL_TEXTURE3 );
535 draw_fullscreen_triangle();
545 glActiveTexture( GL_TEXTURE0 );
546 glBindTexture( GL_TEXTURE_2D, sourceTexture );
547 glActiveTexture( GL_TEXTURE1 );
548 glBindTexture( GL_TEXTURE_2D, blendTex );
551 draw_fullscreen_triangle();
const unsigned char areaTexBytes[]
Stored in R8G8 format.
static const unsigned char searchTexBytes[]
Stored in R8 format.
void DrawBuffer(GLuint aBuffer) override
unsigned int CreateBuffer() override
VECTOR2I GetInternalBufferSize() override
ANTIALIASING_NONE(OPENGL_COMPOSITOR *aCompositor)
OPENGL_COMPOSITOR * compositor
void OnLostBuffers() override
ANTIALIASING_SMAA(OPENGL_COMPOSITOR *aCompositor)
OPENGL_COMPOSITOR * compositor
unsigned int smaaEdgesBuffer
unsigned int smaaBaseBuffer
unsigned int smaaBlendBuffer
unsigned int smaaSearchTex
void DrawBuffer(GLuint buffer) override
VECTOR2I GetInternalBufferSize() override
bool areBuffersInitialized
std::unique_ptr< SHADER > pass_1_shader
void OnLostBuffers() override
std::unique_ptr< SHADER > pass_3_shader
std::unique_ptr< SHADER > pass_2_shader
unsigned int CreateBuffer() override
VECTOR2I GetInternalBufferSize() override
unsigned int CreateBuffer() override
void OnLostBuffers() override
void DrawBuffer(GLuint) override
OPENGL_COMPOSITOR * compositor
unsigned int ssaaMainBuffer
ANTIALIASING_SUPERSAMPLING(OPENGL_COMPOSITOR *aCompositor)
static const COLOR4D BLACK
static const unsigned int DIRECT_RENDERING
VECTOR2I GetScreenSize() const
virtual void ClearBuffer(const COLOR4D &aColor) override
Clear the selected buffer (set by the SetBuffer() function).
virtual void DrawBuffer(unsigned int aBufferHandle) override
Draw the selected buffer to the output buffer.
GLenum GetBufferTexture(unsigned int aBufferHandle)
virtual void SetBuffer(unsigned int aBufferHandle) override
Set the selected buffer as the rendering target.
virtual unsigned int CreateBuffer() override
Prepare a new buffer that may be used as a rendering target.
The Cairo implementation of the graphics abstraction layer.
@ SHADER_TYPE_VERTEX
Vertex shader.
@ SHADER_TYPE_FRAGMENT
Fragment shader.
Handle multitarget rendering (ie.
int checkGlError(const std::string &aInfo, const char *aFile, int aLine, bool aThrow)
Check if a recent OpenGL operation has failed.