@@ -17,20 +17,31 @@ static CGEConstString s_cshWaveform = "#version 310 es\n" CGE_SHADER_STRING(
1717 imageStore (outputImage, newLoc, uvec4 (255 , 255 , 255 , 255 ));
1818 });
1919
20+ static CGEConstString s_cshClearImage = " #version 310 es\n " CGE_SHADER_STRING(
21+ precision highp float ;
22+ precision highp int ;
23+ layout (local_size_x = 1 , local_size_y = 1 , local_size_z = 1 ) in;
24+ layout (rgba8ui, binding = 1 ) uniform writeonly highp uimage2D outputImage;
25+
26+ void main () {
27+ ivec2 texCoord = ivec2 (gl_GlobalInvocationID);
28+ imageStore (outputImage, texCoord, uvec4 (0 , 0 , 0 , 255 ));
29+ });
30+
2031namespace CGE
2132{
2233CGEWaveformFilter::~CGEWaveformFilter () = default ;
2334
2435bool CGEWaveformFilter::init ()
2536{
26- if (m_program.initWithComputeShader (s_cshWaveform))
37+ if (m_program.initWithComputeShader (s_cshWaveform) && m_clearImageProgram. initWithComputeShader (s_cshClearImage) )
2738 {
2839 m_program.bind ();
2940 setFormPosition (0 .1f , 0 .1f );
3041 setFormSize (0 .3f , 0 .3f );
3142 m_drawer.reset (TextureDrawer::create ());
3243 m_drawer->setFlipScale (1 .0f , -1 .0f ); // flip upside down, meet the gl coord.
33- m_renderTarget = std::make_unique<FrameBufferWithTexture >();
44+ m_diagramTexture = std::make_unique<TextureObject >();
3445 return true ;
3546 }
3647
@@ -45,21 +56,26 @@ bool CGEWaveformFilter::init()
4556void CGEWaveformFilter::render2Texture (CGEImageHandlerInterface* handler, GLuint srcTexture, GLuint vertexBufferID)
4657{
4758 auto && sz = handler->getOutputFBOSize ();
48- if (sz.width != m_renderTarget ->width () || m_renderTarget ->texture () == 0 )
59+ if (sz.width != m_diagramTexture ->width () || m_diagramTexture ->texture () == 0 )
4960 {
50- m_renderTarget-> bindTexture2D (sz.width , 256 );
61+ m_diagramTexture-> resize (sz.width , 256 );
5162 }
5263
53- m_renderTarget->bind ();
54- glClearColor (0 , 0 , 0 , 1 );
55- glClear (GL_COLOR_BUFFER_BIT);
64+ glBindImageTexture (0 , handler->getTargetTextureID (), 0 , GL_FALSE, 0 , GL_READ_ONLY, GL_RGBA8UI);
65+ glBindImageTexture (1 , m_diagramTexture->texture (), 0 , GL_FALSE, 0 , GL_WRITE_ONLY, GL_RGBA8UI);
5666
57- glMemoryBarrier (GL_TEXTURE_FETCH_BARRIER_BIT);
67+ // Clear diagram texture before frame.
68+ // You can also use glClear(GL_COLOR_BUFFER_BIT) on some devices.
69+ {
70+ // @attention: glClear does not work on some devices. e.g. Mali-G76
71+ // Perform clear with a compute shader.
72+ m_clearImageProgram.bind ();
73+ glDispatchCompute (sz.width , sz.height , 1 );
74+ }
5875
59- m_program. bind ( );
76+ // glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT );
6077
61- glBindImageTexture (0 , handler->getTargetTextureID (), 0 , GL_FALSE, 0 , GL_READ_ONLY, GL_RGBA8UI);
62- glBindImageTexture (1 , m_renderTarget->texture (), 0 , GL_FALSE, 0 , GL_WRITE_ONLY, GL_RGBA8UI);
78+ m_program.bind ();
6379
6480 glDispatchCompute (sz.width , sz.height , 1 );
6581
@@ -73,7 +89,7 @@ void CGEWaveformFilter::render2Texture(CGEImageHandlerInterface* handler, GLuint
7389
7490 handler->setAsTarget ();
7591 glViewport (m_position[0 ] * sz.width , m_position[1 ] * sz.height , m_size[0 ] * sz.width , m_size[1 ] * sz.height );
76- m_drawer->drawTexture (m_renderTarget ->texture ());
92+ m_drawer->drawTexture (m_diagramTexture ->texture ());
7793
7894#if USING_ALPHA
7995 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
0 commit comments