blob: 1176a2045c735bf9694223477de13ee39262f0dd [file]
/*
* 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