// Copyright 2020 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "src/transform/emit_vertex_point_size.h"

#include <memory>
#include <utility>

#include "src/ast/assignment_statement.h"
#include "src/ast/block_statement.h"
#include "src/ast/clone_context.h"
#include "src/ast/float_literal.h"
#include "src/ast/identifier_expression.h"
#include "src/ast/scalar_constructor_expression.h"
#include "src/ast/type/f32_type.h"
#include "src/ast/type_manager.h"
#include "src/ast/variable.h"

namespace tint {
namespace transform {
namespace {

const char kPointSizeVar[] = "tint_pointsize";

}  // namespace

EmitVertexPointSize::EmitVertexPointSize() = default;
EmitVertexPointSize::~EmitVertexPointSize() = default;

Transform::Output EmitVertexPointSize::Run(ast::Module* in) {
  Output out;

  if (!in->HasStage(ast::PipelineStage::kVertex)) {
    // If the module doesn't have any vertex stages, then there's nothing to do.
    out.module = in->Clone();
    return out;
  }

  tint::ast::AssignmentStatement* pointsize_assign = nullptr;
  auto get_pointsize_assign = [&pointsize_assign](ast::Module* mod) {
    if (pointsize_assign != nullptr) {
      return pointsize_assign;
    }

    auto* f32 = mod->create<ast::type::F32>();

    // Declare the pointsize builtin output variable.
    auto* pointsize_var =
        mod->create<ast::Variable>(Source{},                    // source
                                   kPointSizeVar,               // name
                                   ast::StorageClass::kOutput,  // storage_class
                                   f32,                         // type
                                   false,                       // is_const
                                   nullptr,                     // constructor
                                   ast::VariableDecorationList{
                                       // decorations
                                       mod->create<ast::BuiltinDecoration>(
                                           Source{}, ast::Builtin::kPointSize),
                                   });
    mod->AddGlobalVariable(pointsize_var);

    // Build the AST expression & statement for assigning pointsize one.
    auto* one = mod->create<ast::ScalarConstructorExpression>(
        Source{}, mod->create<ast::FloatLiteral>(Source{}, f32, 1.0f));
    auto* pointsize_ident = mod->create<ast::IdentifierExpression>(
        Source{}, mod->RegisterSymbol(kPointSizeVar), kPointSizeVar);
    pointsize_assign =
        mod->create<ast::AssignmentStatement>(Source{}, pointsize_ident, one);
    return pointsize_assign;
  };

  // Add the pointsize assignment statement to the front of all vertex stages.
  out.module = in->Clone([&](ast::CloneContext* ctx) {
    ctx->ReplaceAll([&, ctx](ast::Function* func) -> ast::Function* {
      if (func->pipeline_stage() != ast::PipelineStage::kVertex) {
        return nullptr;  // Just clone func
      }
      return CloneWithStatementsAtStart(ctx, func,
                                        {get_pointsize_assign(ctx->mod)});
    });
  });

  return out;
}

}  // namespace transform
}  // namespace tint
