| /* |
| * Copyright 2025 Rive |
| */ |
| |
| #include "offscreen_render_target.hpp" |
| |
| #ifdef RIVE_TOOLS_NO_GL |
| |
| namespace rive_tests |
| { |
| rive::rcp<OffscreenRenderTarget> OffscreenRenderTarget::MakeGL( |
| rive::gpu::RenderContextGLImpl*, |
| uint32_t width, |
| uint32_t height) |
| { |
| return nullptr; |
| } |
| } // namespace rive_tests |
| |
| #else |
| |
| #include "rive/renderer/rive_render_image.hpp" |
| #include "rive/renderer/gl/render_context_gl_impl.hpp" |
| #include "rive/renderer/gl/render_target_gl.hpp" |
| |
| namespace rive_tests |
| { |
| class OffscreenRenderTargetGL : public OffscreenRenderTarget |
| { |
| public: |
| OffscreenRenderTargetGL(rive::gpu::RenderContextGLImpl* renderContextImpl, |
| uint32_t width, |
| uint32_t height) : |
| m_textureTarget( |
| rive::make_rcp<TextureTarget>(renderContextImpl, width, height)) |
| {} |
| |
| rive::RenderImage* asRenderImage() override |
| { |
| return m_textureTarget->renderImage(); |
| } |
| |
| rive::gpu::RenderTarget* asRenderTarget() override |
| { |
| return m_textureTarget.get(); |
| } |
| |
| private: |
| class TextureTarget : public rive::gpu::TextureRenderTargetGL |
| { |
| public: |
| TextureTarget(rive::gpu::RenderContextGLImpl* renderContextImpl, |
| uint32_t width, |
| uint32_t height) : |
| TextureRenderTargetGL(width, height) |
| { |
| GLuint tex; |
| glGenTextures(1, &tex); |
| glActiveTexture(GL_TEXTURE0); |
| glBindTexture(GL_TEXTURE_2D, tex); |
| glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 256); |
| m_renderImage = rive::make_rcp<rive::RiveRenderImage>( |
| renderContextImpl->adoptImageTexture(width, height, tex)); |
| setTargetTexture(tex); |
| } |
| |
| rive::RiveRenderImage* renderImage() const |
| { |
| return m_renderImage.get(); |
| } |
| |
| private: |
| rive::rcp<rive::RiveRenderImage> m_renderImage; |
| }; |
| |
| rive::rcp<TextureTarget> m_textureTarget; |
| }; |
| |
| rive::rcp<OffscreenRenderTarget> OffscreenRenderTarget::MakeGL( |
| rive::gpu::RenderContextGLImpl* impl, |
| uint32_t width, |
| uint32_t height) |
| { |
| return rive::make_rcp<OffscreenRenderTargetGL>(impl, width, height); |
| } |
| }; // namespace rive_tests |
| |
| #endif |