/*
 * Copyright 2025 Rive
 */

#pragma once

#include "rive/refcnt.hpp"

namespace rive
{
class RenderImage;
};

namespace rive::gpu
{
class RenderTarget;
class RenderContextGLImpl;
class RenderContextD3DImpl;
class RenderContextD3D12Impl;
class RenderContextWebGPUImpl;
class VulkanContext;
}; // namespace rive::gpu

namespace rive_tests
{
// Offscreen render target interface that can be accessed as a RenderImage or a
// RenderTarget.
// The backend handles barriers automatically.
class OffscreenRenderTarget : public rive::RefCnt<OffscreenRenderTarget>
{
public:
    virtual rive::RenderImage* asRenderImage() = 0;
    virtual rive::gpu::RenderTarget* asRenderTarget() = 0;
    virtual ~OffscreenRenderTarget() {}

    static rive::rcp<OffscreenRenderTarget> MakeD3D(
        rive::gpu::RenderContextD3DImpl*,
        uint32_t width,
        uint32_t height,
        bool riveRenderable);

    static rive::rcp<OffscreenRenderTarget> MakeD3D12(
        rive::gpu::RenderContextD3D12Impl*,
        uint32_t width,
        uint32_t height,
        bool riveRenderable);

    static rive::rcp<OffscreenRenderTarget> MakeGL(
        rive::gpu::RenderContextGLImpl*,
        uint32_t width,
        uint32_t height);

    static rive::rcp<OffscreenRenderTarget> MakeVulkan(
        rive::gpu::VulkanContext*,
        uint32_t width,
        uint32_t height,
        bool riveRenderable);

    static rive::rcp<OffscreenRenderTarget> MakeWebGPU(
        rive::gpu::RenderContextWebGPUImpl*,
        uint32_t width,
        uint32_t height);
};
}; // namespace rive_tests
