blob: b38e2405fec3cf248fa3868a8d87865dbadaaaee [file] [log] [blame]
/*
* 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