// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gpu/command_buffer/common/shared_image_usage.h"

#include <cstdint>
#include <string>
#include <utility>

#include "base/check.h"

namespace gpu {

const char kExoTextureLabelPrefix[] = "ExoTexture";

bool IsValidClientUsage(SharedImageUsageSet usage) {
  const uint32_t usage_as_int = uint32_t(usage);
  constexpr int32_t kClientMax = (LAST_CLIENT_USAGE << 1) - 1;
  return 0 < usage_as_int && usage_as_int <= kClientMax;
}

bool HasGLES2ReadOrWriteUsage(SharedImageUsageSet usage) {
  return usage.HasAny(SHARED_IMAGE_USAGE_GLES2_READ |
                      SHARED_IMAGE_USAGE_GLES2_WRITE);
}

std::string CreateLabelForSharedImageUsage(SharedImageUsageSet usage) {
  if (usage.empty()) {
    return {};
  }

  const std::pair<SharedImageUsage, const char*> kUsages[] = {
      {SHARED_IMAGE_USAGE_GLES2_READ, "Gles2Read"},
      {SHARED_IMAGE_USAGE_RASTER_READ, "RasterRead"},
      {SHARED_IMAGE_USAGE_DISPLAY_READ, "DisplayRead"},
      {SHARED_IMAGE_USAGE_DISPLAY_WRITE, "DisplayWrite"},
      {SHARED_IMAGE_USAGE_SCANOUT, "Scanout"},
      {SHARED_IMAGE_USAGE_OOP_RASTERIZATION, "OopRasterization"},
      {SHARED_IMAGE_USAGE_WEBGPU_READ, "WebgpuRead"},
      {SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE, "ConcurrentReadWrite"},
      {SHARED_IMAGE_USAGE_VIDEO_DECODE, "VideoDecode"},
      {SHARED_IMAGE_USAGE_WEBGPU_SWAP_CHAIN_TEXTURE, "WebgpuSwapChainTexture"},
      {SHARED_IMAGE_USAGE_MACOS_VIDEO_TOOLBOX, "MacosVideoToolbox"},
      {SHARED_IMAGE_USAGE_MIPMAP, "Mipmap"},
      {SHARED_IMAGE_USAGE_CPU_WRITE_ONLY, "CpuWriteOnly"},
      {SHARED_IMAGE_USAGE_RAW_DRAW, "RawDraw"},
      {SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU, "HighPerformanceGpu"},
      {SHARED_IMAGE_USAGE_CPU_UPLOAD, "CpuUpload"},
      {SHARED_IMAGE_USAGE_SCANOUT_DCOMP_SURFACE, "ScanoutDCompSurface"},
      {SHARED_IMAGE_USAGE_SCANOUT_DXGI_SWAP_CHAIN, "ScanoutDxgiSwapChain"},
      {SHARED_IMAGE_USAGE_WEBGPU_STORAGE_TEXTURE, "WebgpuStorageTexture"},
      {SHARED_IMAGE_USAGE_GLES2_WRITE, "Gles2Write"},
      {SHARED_IMAGE_USAGE_RASTER_WRITE, "RasterWrite"},
      {SHARED_IMAGE_USAGE_WEBGPU_WRITE, "WebgpuWrite"},
      {SHARED_IMAGE_USAGE_GLES2_FOR_RASTER_ONLY, "GLES2ForRasterOnly"},
      {SHARED_IMAGE_USAGE_RASTER_OVER_GLES2_ONLY, "RasterOverGLES2Only"},
      {SHARED_IMAGE_USAGE_PROTECTED_VIDEO, "ProtectedVideo"},
      {SHARED_IMAGE_USAGE_WEBGPU_SHARED_BUFFER, "WebgpuSharedBuffer"},
      {SHARED_IMAGE_USAGE_CPU_ONLY_READ_WRITE, "CpuOnlyReadWrite"},
  };

  std::string label;
  for (const auto& [value, name] : kUsages) {
    if (!usage.Has(value)) {
      continue;
    }
    if (!label.empty()) {
      label.append("|");
    }
    label.append(name);
  }

  DCHECK(!label.empty());

  return label;
}

std::string SharedImageUsageSet::ToString() const {
  return CreateLabelForSharedImageUsage(*this);
}

}  // namespace gpu
