/*
 * Copyright © 2016 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 */

#include "spirv_info.h"
#include "util/macros.h"

#define CAPABILITY(cap) [SpvCapability##cap] = #cap
static const char * const capability_to_string[] = {
   CAPABILITY(Matrix),
   CAPABILITY(Shader),
   CAPABILITY(Geometry),
   CAPABILITY(Tessellation),
   CAPABILITY(Addresses),
   CAPABILITY(Linkage),
   CAPABILITY(Kernel),
   CAPABILITY(Vector16),
   CAPABILITY(Float16Buffer),
   CAPABILITY(Float16),
   CAPABILITY(Float64),
   CAPABILITY(Int64),
   CAPABILITY(Int64Atomics),
   CAPABILITY(ImageBasic),
   CAPABILITY(ImageReadWrite),
   CAPABILITY(ImageMipmap),
   CAPABILITY(Pipes),
   CAPABILITY(Groups),
   CAPABILITY(DeviceEnqueue),
   CAPABILITY(LiteralSampler),
   CAPABILITY(AtomicStorage),
   CAPABILITY(Int16),
   CAPABILITY(TessellationPointSize),
   CAPABILITY(GeometryPointSize),
   CAPABILITY(ImageGatherExtended),
   CAPABILITY(StorageImageMultisample),
   CAPABILITY(UniformBufferArrayDynamicIndexing),
   CAPABILITY(SampledImageArrayDynamicIndexing),
   CAPABILITY(StorageBufferArrayDynamicIndexing),
   CAPABILITY(StorageImageArrayDynamicIndexing),
   CAPABILITY(ClipDistance),
   CAPABILITY(CullDistance),
   CAPABILITY(ImageCubeArray),
   CAPABILITY(SampleRateShading),
   CAPABILITY(ImageRect),
   CAPABILITY(SampledRect),
   CAPABILITY(GenericPointer),
   CAPABILITY(Int8),
   CAPABILITY(InputAttachment),
   CAPABILITY(SparseResidency),
   CAPABILITY(MinLod),
   CAPABILITY(Sampled1D),
   CAPABILITY(Image1D),
   CAPABILITY(SampledCubeArray),
   CAPABILITY(SampledBuffer),
   CAPABILITY(ImageBuffer),
   CAPABILITY(ImageMSArray),
   CAPABILITY(StorageImageExtendedFormats),
   CAPABILITY(ImageQuery),
   CAPABILITY(DerivativeControl),
   CAPABILITY(InterpolationFunction),
   CAPABILITY(TransformFeedback),
   CAPABILITY(GeometryStreams),
   CAPABILITY(StorageImageReadWithoutFormat),
   CAPABILITY(StorageImageWriteWithoutFormat),
   CAPABILITY(MultiViewport),
};

const char *
spirv_capability_to_string(SpvCapability cap)
{
   if (cap < ARRAY_SIZE(capability_to_string))
      return capability_to_string[cap];
   else
      return "unknown";
}

#define DECORATION(dec) [SpvDecoration##dec] = #dec
static const char * const decoration_to_string[] = {
   DECORATION(RelaxedPrecision),
   DECORATION(SpecId),
   DECORATION(Block),
   DECORATION(BufferBlock),
   DECORATION(RowMajor),
   DECORATION(ColMajor),
   DECORATION(ArrayStride),
   DECORATION(MatrixStride),
   DECORATION(GLSLShared),
   DECORATION(GLSLPacked),
   DECORATION(CPacked),
   DECORATION(BuiltIn),
   DECORATION(NoPerspective),
   DECORATION(Flat),
   DECORATION(Patch),
   DECORATION(Centroid),
   DECORATION(Sample),
   DECORATION(Invariant),
   DECORATION(Restrict),
   DECORATION(Aliased),
   DECORATION(Volatile),
   DECORATION(Constant),
   DECORATION(Coherent),
   DECORATION(NonWritable),
   DECORATION(NonReadable),
   DECORATION(Uniform),
   DECORATION(SaturatedConversion),
   DECORATION(Stream),
   DECORATION(Location),
   DECORATION(Component),
   DECORATION(Index),
   DECORATION(Binding),
   DECORATION(DescriptorSet),
   DECORATION(Offset),
   DECORATION(XfbBuffer),
   DECORATION(XfbStride),
   DECORATION(FuncParamAttr),
   DECORATION(FPRoundingMode),
   DECORATION(FPFastMathMode),
   DECORATION(LinkageAttributes),
   DECORATION(NoContraction),
   DECORATION(InputAttachmentIndex),
   DECORATION(Alignment),
};

const char *
spirv_decoration_to_string(SpvDecoration dec)
{
   if (dec < ARRAY_SIZE(decoration_to_string))
      return decoration_to_string[dec];
   else
      return "unknown";
}