// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "impeller/renderer/compute_command.h"

#include <utility>

#include "impeller/base/validation.h"
#include "impeller/renderer/formats.h"
#include "impeller/renderer/vertex_descriptor.h"

namespace impeller {

bool ComputeCommand::BindResource(ShaderStage stage,
                                  const ShaderUniformSlot& slot,
                                  const ShaderMetadata& metadata,
                                  const BufferView& view) {
  if (stage != ShaderStage::kCompute) {
    VALIDATION_LOG << "Use Command for non-compute shader stages.";
    return false;
  }
  if (!view) {
    return false;
  }

  bindings.buffers[slot.ext_res_0] = {&metadata, view};
  return true;
}

bool ComputeCommand::BindResource(
    ShaderStage stage,
    const SampledImageSlot& slot,
    const ShaderMetadata& metadata,
    const std::shared_ptr<const Texture>& texture) {
  if (stage != ShaderStage::kCompute) {
    VALIDATION_LOG << "Use Command for non-compute shader stages.";
    return false;
  }
  if (!texture || !texture->IsValid()) {
    return false;
  }

  if (!slot.HasTexture()) {
    return true;
  }

  bindings.textures[slot.texture_index] = {&metadata, texture};
  return true;
}

bool ComputeCommand::BindResource(
    ShaderStage stage,
    const SampledImageSlot& slot,
    const ShaderMetadata& metadata,
    const std::shared_ptr<const Sampler>& sampler) {
  if (stage != ShaderStage::kCompute) {
    VALIDATION_LOG << "Use Command for non-compute shader stages.";
    return false;
  }
  if (!sampler || !sampler->IsValid()) {
    return false;
  }

  if (!slot.HasSampler()) {
    return true;
  }

  bindings.samplers[slot.sampler_index] = {&metadata, sampler};
  return true;
}

bool ComputeCommand::BindResource(
    ShaderStage stage,
    const SampledImageSlot& slot,
    const ShaderMetadata& metadata,
    const std::shared_ptr<const Texture>& texture,
    const std::shared_ptr<const Sampler>& sampler) {
  if (stage != ShaderStage::kCompute) {
    VALIDATION_LOG << "Use Command for non-compute shader stages.";
    return false;
  }
  return BindResource(stage, slot, metadata, texture) &&
         BindResource(stage, slot, metadata, sampler);
}

}  // namespace impeller
