/*
 * Copyright 2025 Rive
 */

// GM test for Ore MRT (Multiple Render Targets). Renders a fullscreen quad
// with a shader that outputs different colors to 3 render targets, then
// composites all 3 side-by-side. Verifies: MRT render passes, multiple
// ColorAttachment, makeTexture with renderTarget, makeTextureView,
// and independent per-target output.

#include "gm.hpp"
#include "gmutils.hpp"
#include "ore_gm_helper.hpp"

#if defined(ORE_BACKEND_METAL) || defined(ORE_BACKEND_D3D11) ||                \
    defined(ORE_BACKEND_D3D12) || defined(ORE_BACKEND_GL) ||                   \
    defined(ORE_BACKEND_WGPU) || defined(ORE_BACKEND_VK) ||                    \
    defined(ORE_BACKEND_RHI)
#include "rive/renderer/render_canvas.hpp"
#include "rive/renderer/ore/ore_bind_group.hpp"
#include "rive/renderer/ore/ore_buffer.hpp"
#include "rive/renderer/ore/ore_texture.hpp"
#include "rive/renderer/ore/ore_sampler.hpp"
#include "rive/renderer/ore/ore_pipeline.hpp"
#include "rive/renderer/ore/ore_render_pass.hpp"
#endif

using namespace rivegm;
using namespace rive;
using namespace rive::gpu;

#if defined(ORE_BACKEND_METAL) || defined(ORE_BACKEND_D3D11) ||                \
    defined(ORE_BACKEND_D3D12) || defined(ORE_BACKEND_GL) ||                   \
    defined(ORE_BACKEND_WGPU) || defined(ORE_BACKEND_VK) ||                    \
    defined(ORE_BACKEND_RHI)
using namespace rive::ore;
#endif

class OreMrtGM : public GM
{
public:
  // 3 targets side-by-side, each 128x128 = 384x128 total.
  OreMrtGM() : GM(384, 128) {}

  ColorInt clearColor() const override { return 0xff000000; }

  void onDraw(rive::Renderer* originalRenderer) override
  {
    auto renderContext = TestingWindow::Get()->renderContext();
    if (!renderContext || !m_ore.ensureContext(renderContext))
      return;

#if defined(ORE_BACKEND_METAL) || defined(ORE_BACKEND_D3D11) ||                \
    defined(ORE_BACKEND_D3D12) || defined(ORE_BACKEND_GL) ||                   \
    defined(ORE_BACKEND_WGPU) || defined(ORE_BACKEND_VK) ||                    \
    defined(ORE_BACKEND_RHI)
    auto& ctx = *renderContext->getOreContext();
    constexpr uint32_t kSize = 128;

    // Create 3 render target textures.
    rcp<ore::Texture> targets[3];
    rcp<ore::TextureView> targetViews[3];
    for (int i = 0; i < 3; ++i)
    {
      TextureDesc td{};
      td.width = kSize;
      td.height = kSize;
      td.format = TextureFormat::rgba8unorm;
      td.renderTarget = true;
      td.label = "mrt_target";
      targets[i] = ctx.makeTexture(td);

      TextureViewDesc tvd{};
      tvd.texture = targets[i].get();
      targetViews[i] = ctx.makeTextureView(tvd);
    }

    // Load MRT shader from the pre-compiled RSTB.
    auto mrtShader = ore_gm::loadShader(ctx, ore_gm::kMrt);
    if (!mrtShader.vsModule)
      return;

    PipelineDesc pipeDesc{};
    pipeDesc.vertexModule = mrtShader.vsModule.get();
    pipeDesc.fragmentModule = mrtShader.psModule.get();
    pipeDesc.vertexEntryPoint = mrtShader.vsEntryPoint;
    pipeDesc.fragmentEntryPoint = mrtShader.fsEntryPoint;
    pipeDesc.vertexBufferCount = 0; // No vertex buffers, use vertex_id.
    pipeDesc.topology = PrimitiveTopology::triangleList;
    pipeDesc.colorTargets[0].format = TextureFormat::rgba8unorm;
    pipeDesc.colorTargets[1].format = TextureFormat::rgba8unorm;
    pipeDesc.colorTargets[2].format = TextureFormat::rgba8unorm;
    pipeDesc.colorCount = 3;
    pipeDesc.depthStencil.depthCompare = CompareFunction::always;
    pipeDesc.depthStencil.depthWriteEnabled = false;
    pipeDesc.label = "mrt_pipeline";
    auto mrtPipeline = ctx.makePipeline(pipeDesc);

    // Render to all 3 targets in a single MRT pass.
    m_ore.beginFrame(renderContext);

    RenderPassDesc rpDesc{};
    for (int i = 0; i < 3; ++i)
    {
      rpDesc.colorAttachments[i].view = targetViews[i].get();
      rpDesc.colorAttachments[i].loadOp = LoadOp::clear;
      rpDesc.colorAttachments[i].storeOp = StoreOp::store;
      rpDesc.colorAttachments[i].clearColor = {0, 0, 0, 1};
    }
    rpDesc.colorCount = 3;
    rpDesc.label = "mrt_pass";

    auto pass = ctx.beginRenderPass(rpDesc);
    pass->setPipeline(mrtPipeline.get());
    pass->setViewport(0, 0, kSize, kSize);
    pass->draw(3); // Fullscreen triangle, no VBO needed.
    pass->finish();

    // Now blit each target to a RenderCanvas for compositing.
    // Load blit shader from the pre-compiled RSTB.
    auto blitShader = ore_gm::loadShader(ctx, ore_gm::kMrtBlit);
    if (!blitShader.vsModule)
      return;

    auto blitLayout1 = ore_gm::makeLayoutFromShader(
        ctx,
        blitShader.vsModule.get(),
        1);
    auto blitLayout2 = ore_gm::makeLayoutFromShader(
        ctx,
        blitShader.vsModule.get(),
        2);
    BindGroupLayout* blitLayouts[] = {
        nullptr,
        blitLayout1.get(),
        blitLayout2.get()};

    PipelineDesc blitPipeDesc{};
    blitPipeDesc.vertexModule = blitShader.vsModule.get();
    blitPipeDesc.fragmentModule = blitShader.psModule.get();
    blitPipeDesc.vertexEntryPoint = blitShader.vsEntryPoint;
    blitPipeDesc.fragmentEntryPoint = blitShader.fsEntryPoint;
    blitPipeDesc.vertexBufferCount = 0;
    blitPipeDesc.topology = PrimitiveTopology::triangleList;
    blitPipeDesc.colorTargets[0].format = TextureFormat::rgba8unorm;
    blitPipeDesc.colorCount = 1;
    blitPipeDesc.depthStencil.depthCompare = CompareFunction::always;
    blitPipeDesc.depthStencil.depthWriteEnabled = false;
    blitPipeDesc.bindGroupLayouts = blitLayouts;
    blitPipeDesc.bindGroupLayoutCount = 3;
    blitPipeDesc.label = "blit_pipeline";
    auto blitPipeline = ctx.makePipeline(blitPipeDesc);

    SamplerDesc sampDesc{};
    sampDesc.minFilter = Filter::nearest;
    sampDesc.magFilter = Filter::nearest;
    sampDesc.label = "blit_sampler";
    auto sampler = ctx.makeSampler(sampDesc);

    // Create a wide canvas (384x128) and blit each target side-by-side.
    auto canvas = renderContext->makeRenderCanvas(384, kSize);
    if (!canvas)
      return;
    auto canvasView = ctx.wrapCanvasTexture(canvas.get());

    RenderPassDesc blitPassDesc{};
    blitPassDesc.colorAttachments[0].view = canvasView.get();
    blitPassDesc.colorAttachments[0].loadOp = LoadOp::clear;
    blitPassDesc.colorAttachments[0].storeOp = StoreOp::store;
    blitPassDesc.colorAttachments[0].clearColor = {0, 0, 0, 1};
    blitPassDesc.colorCount = 1;
    blitPassDesc.label = "blit_pass";

    // Create sampler bind group (shared across all blits).
    BindGroupDesc::SampEntry blitSampEntry{0, sampler.get()};
    BindGroupDesc blitSampBGDesc{};
    blitSampBGDesc.layout = blitLayout2.get();
    blitSampBGDesc.samplers = &blitSampEntry;
    blitSampBGDesc.samplerCount = 1;
    auto blitSampBG = ctx.makeBindGroup(blitSampBGDesc);

    // Blit all 3 targets side-by-side using viewport offsets.
    for (int i = 0; i < 3; ++i)
    {
      if (i > 0)
      {
        // Subsequent blits load (don't clear) the canvas.
        blitPassDesc.colorAttachments[0].loadOp = LoadOp::load;
      }

      // Create texture bind group per target.
      BindGroupDesc::TexEntry blitTexEntry{0, targetViews[i].get()};
      BindGroupDesc blitTexBGDesc{};
      blitTexBGDesc.layout = blitLayout1.get();
      blitTexBGDesc.textures = &blitTexEntry;
      blitTexBGDesc.textureCount = 1;
      auto blitTexBG = ctx.makeBindGroup(blitTexBGDesc);

      auto blitPass = ctx.beginRenderPass(blitPassDesc);
      blitPass->setPipeline(blitPipeline.get());
      blitPass->setBindGroup(1, blitTexBG.get());
      blitPass->setBindGroup(2, blitSampBG.get());
      blitPass->setViewport(i * kSize, 0, kSize, kSize);
      blitPass->draw(3);
      blitPass->finish();
    }

    m_ore.endFrame(renderContext);
    ore_gm::invalidateGLStateAfterOre(renderContext);

    // Composite the canvas into the main framebuffer via the original
    // renderer. No frame break needed — Ore rendered to a separate canvas
    // texture, not the main render target.
    originalRenderer->save();
    originalRenderer->drawImage(
        canvas->renderImage(),
        {.filter = ImageFilter::nearest},
        BlendMode::srcOver,
        1);
    originalRenderer->restore();
#endif
  }

private:
  ore_gm::OreGMContext m_ore;
};

GMREGISTER(ore_mrt, return new OreMrtGM())
