// // Created by Marc Rousavy on 29.08.23. // #pragma once #include "PassThroughShader.h" #include #include #include #include #include "OpenGLContext.h" #include "OpenGLTexture.h" namespace vision { class OpenGLRenderer { public: /** * Create a new instance of the OpenGLRenderer that draws to an on-screen window surface. * This will not perform any OpenGL operations yet, and is therefore safe to call from any Thread. * * Note: The `surface` is considered moved, and the OpenGL context will release it when it is * being deleted. */ static std::unique_ptr CreateWithWindowSurface(std::shared_ptr context, ANativeWindow* surface); /** * Destroy the OpenGL Context. This needs to be called on the same thread that `use()` was called. */ ~OpenGLRenderer(); /** * Renders the given Texture to the Surface */ void renderTextureToSurface(const OpenGLTexture& texture, float* transformMatrix); /** * Destroys the OpenGL context. This needs to be called on the same thread that `use()` was * called. After calling `destroy()`, it is legal to call `use()` again, which will re-construct * everything. */ void destroy(); private: explicit OpenGLRenderer(std::shared_ptr context, ANativeWindow* surface); private: int _width = 0, _height = 0; std::shared_ptr _context; ANativeWindow* _outputSurface; EGLSurface _surface = EGL_NO_SURFACE; private: PassThroughShader _passThroughShader; private: static constexpr auto TAG = "OpenGLRenderer"; }; } // namespace vision