///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// DxilRootSignature.cpp                                                     //
// Copyright (C) Microsoft Corporation. All rights reserved.                 //
// This file is distributed under the University of Illinois Open Source     //
// License. See LICENSE.TXT for details.                                     //
//                                                                           //
// Provides support for manipulating root signature structures.              //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#pragma once

#include "dxc/DxilRootSignature/DxilRootSignature.h"
#include "dxc/Support/Global.h"
#include "dxc/Support/WinIncludes.h"

namespace hlsl {

DEFINE_ENUM_FLAG_OPERATORS(DxilRootSignatureFlags)
DEFINE_ENUM_FLAG_OPERATORS(DxilRootDescriptorFlags)
DEFINE_ENUM_FLAG_OPERATORS(DxilDescriptorRangeType)
DEFINE_ENUM_FLAG_OPERATORS(DxilDescriptorRangeFlags)

// Execute (error) and throw.
#define EAT(x)                                                                 \
  {                                                                            \
    (x);                                                                       \
    throw ::hlsl::Exception(E_FAIL);                                           \
  }

namespace root_sig_helper {
// GetFlags/SetFlags overloads.
DxilRootDescriptorFlags GetFlags(const DxilRootDescriptor &);
void SetFlags(DxilRootDescriptor &, DxilRootDescriptorFlags);
DxilRootDescriptorFlags GetFlags(const DxilRootDescriptor1 &D);
void SetFlags(DxilRootDescriptor1 &D, DxilRootDescriptorFlags Flags);
void SetFlags(DxilContainerRootDescriptor1 &D, DxilRootDescriptorFlags Flags);
DxilDescriptorRangeFlags GetFlags(const DxilDescriptorRange &D);
void SetFlags(DxilDescriptorRange &, DxilDescriptorRangeFlags);
DxilDescriptorRangeFlags GetFlags(const DxilContainerDescriptorRange &D);
void SetFlags(DxilContainerDescriptorRange &, DxilDescriptorRangeFlags);
DxilDescriptorRangeFlags GetFlags(const DxilDescriptorRange1 &D);
void SetFlags(DxilDescriptorRange1 &D, DxilDescriptorRangeFlags Flags);
DxilDescriptorRangeFlags GetFlags(const DxilContainerDescriptorRange1 &D);
void SetFlags(DxilContainerDescriptorRange1 &D, DxilDescriptorRangeFlags Flags);
} // namespace root_sig_helper

} // namespace hlsl
