/*
 * Copyright © 2024 Imagination Technologies Ltd.
 *
 * SPDX-License-Identifier: MIT
 */

/**
 * \file pvr_uscgen.c
 *
 * \brief USC shader generation.
 */

#include "nir/nir.h"
#include "nir/nir_builder.h"
#include "pco/pco.h"
#include "pvr_uscgen.h"
#include "util/macros.h"

/**
 * Common function to build a NIR shader and export the binary.
 *
 * \param ctx PCO context.
 * \param nir NIR shader.
 * \param binary Output shader binary.
 */
static void build_shader(pco_ctx *ctx, nir_shader *nir, pco_binary **binary)
{
   pco_preprocess_nir(ctx, nir);
   pco_lower_nir(ctx, nir);
   pco_postprocess_nir(ctx, nir);

   pco_shader *shader = pco_trans_nir(ctx, nir);
   pco_process_ir(ctx, shader);

   pco_binary *bin = pco_encode_ir(ctx, shader);
   ralloc_free(shader);

   pco_binary_finalize(ctx, bin);
   *binary = bin;
}

/**
 * Generate a nop (empty) shader.
 *
 * \param ctx PCO context.
 * \param stage Shader stage.
 * \param binary Output shader binary.
 */
void pvr_uscgen_nop(pco_ctx *ctx, gl_shader_stage stage, pco_binary **binary)
{
   UNREACHABLE("finishme: pvr_uscgen_nop");
}

/**
 * Generate an end-of-tile shader.
 *
 * \param ctx PCO context.
 * \param props End of tile shader properties.
 * \param binary Output shader binary.
 */
void pvr_uscgen_eot(pco_ctx *ctx,
                    struct pvr_eot_props *props,
                    pco_binary **binary)
{
   UNREACHABLE("finishme: pvr_uscgen_eot");
}

/**
 * Generate a transfer queue shader.
 *
 * \param ctx PCO context.
 * \param props Transfer queue shader properties.
 * \param binary Output shader binary.
 */
void pvr_uscgen_tq(pco_ctx *ctx,
                   struct pvr_tq_props *props,
                   pco_binary **binary)
{
   UNREACHABLE("finishme: pvr_uscgen_tq");
}
