1bdd1243dSDimitry Andric 2bdd1243dSDimitry Andric //===-- llvm/BinaryFormat/DXContainer.cpp - DXContainer Utils ----*- C++-*-===// 3bdd1243dSDimitry Andric // 4bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 6bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7bdd1243dSDimitry Andric // 8bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 9bdd1243dSDimitry Andric // 10bdd1243dSDimitry Andric // This file contains utility functions for working with DXContainers. 11bdd1243dSDimitry Andric // 12bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 13bdd1243dSDimitry Andric 14bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainer.h" 15bdd1243dSDimitry Andric #include "llvm/ADT/StringSwitch.h" 16*5f757f3fSDimitry Andric #include "llvm/Support/ScopedPrinter.h" 17bdd1243dSDimitry Andric 18bdd1243dSDimitry Andric using namespace llvm; 19bdd1243dSDimitry Andric using namespace llvm::dxbc; 20bdd1243dSDimitry Andric 21bdd1243dSDimitry Andric dxbc::PartType dxbc::parsePartType(StringRef S) { 22bdd1243dSDimitry Andric #define CONTAINER_PART(PartName) .Case(#PartName, PartType::PartName) 23bdd1243dSDimitry Andric return StringSwitch<dxbc::PartType>(S) 24bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def" 25bdd1243dSDimitry Andric .Default(dxbc::PartType::Unknown); 26bdd1243dSDimitry Andric } 27bdd1243dSDimitry Andric 28bdd1243dSDimitry Andric bool ShaderHash::isPopulated() { 29bdd1243dSDimitry Andric static uint8_t Zeros[16] = {0}; 30bdd1243dSDimitry Andric return Flags > 0 || 0 != memcmp(&Digest, &Zeros, 16); 31bdd1243dSDimitry Andric } 32*5f757f3fSDimitry Andric 33*5f757f3fSDimitry Andric #define COMPONENT_PRECISION(Val, Enum) {#Enum, SigMinPrecision::Enum}, 34*5f757f3fSDimitry Andric 35*5f757f3fSDimitry Andric static const EnumEntry<SigMinPrecision> SigMinPrecisionNames[] = { 36*5f757f3fSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def" 37*5f757f3fSDimitry Andric }; 38*5f757f3fSDimitry Andric 39*5f757f3fSDimitry Andric ArrayRef<EnumEntry<SigMinPrecision>> dxbc::getSigMinPrecisions() { 40*5f757f3fSDimitry Andric return ArrayRef(SigMinPrecisionNames); 41*5f757f3fSDimitry Andric } 42*5f757f3fSDimitry Andric 43*5f757f3fSDimitry Andric #define D3D_SYSTEM_VALUE(Val, Enum) {#Enum, D3DSystemValue::Enum}, 44*5f757f3fSDimitry Andric 45*5f757f3fSDimitry Andric static const EnumEntry<D3DSystemValue> D3DSystemValueNames[] = { 46*5f757f3fSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def" 47*5f757f3fSDimitry Andric }; 48*5f757f3fSDimitry Andric 49*5f757f3fSDimitry Andric ArrayRef<EnumEntry<D3DSystemValue>> dxbc::getD3DSystemValues() { 50*5f757f3fSDimitry Andric return ArrayRef(D3DSystemValueNames); 51*5f757f3fSDimitry Andric } 52*5f757f3fSDimitry Andric 53*5f757f3fSDimitry Andric #define COMPONENT_TYPE(Val, Enum) {#Enum, SigComponentType::Enum}, 54*5f757f3fSDimitry Andric 55*5f757f3fSDimitry Andric static const EnumEntry<SigComponentType> SigComponentTypes[] = { 56*5f757f3fSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def" 57*5f757f3fSDimitry Andric }; 58*5f757f3fSDimitry Andric 59*5f757f3fSDimitry Andric ArrayRef<EnumEntry<SigComponentType>> dxbc::getSigComponentTypes() { 60*5f757f3fSDimitry Andric return ArrayRef(SigComponentTypes); 61*5f757f3fSDimitry Andric } 62*5f757f3fSDimitry Andric 63*5f757f3fSDimitry Andric #define SEMANTIC_KIND(Val, Enum) {#Enum, PSV::SemanticKind::Enum}, 64*5f757f3fSDimitry Andric 65*5f757f3fSDimitry Andric static const EnumEntry<PSV::SemanticKind> SemanticKindNames[] = { 66*5f757f3fSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def" 67*5f757f3fSDimitry Andric }; 68*5f757f3fSDimitry Andric 69*5f757f3fSDimitry Andric ArrayRef<EnumEntry<PSV::SemanticKind>> PSV::getSemanticKinds() { 70*5f757f3fSDimitry Andric return ArrayRef(SemanticKindNames); 71*5f757f3fSDimitry Andric } 72*5f757f3fSDimitry Andric 73*5f757f3fSDimitry Andric #define COMPONENT_TYPE(Val, Enum) {#Enum, PSV::ComponentType::Enum}, 74*5f757f3fSDimitry Andric 75*5f757f3fSDimitry Andric static const EnumEntry<PSV::ComponentType> ComponentTypeNames[] = { 76*5f757f3fSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def" 77*5f757f3fSDimitry Andric }; 78*5f757f3fSDimitry Andric 79*5f757f3fSDimitry Andric ArrayRef<EnumEntry<PSV::ComponentType>> PSV::getComponentTypes() { 80*5f757f3fSDimitry Andric return ArrayRef(ComponentTypeNames); 81*5f757f3fSDimitry Andric } 82*5f757f3fSDimitry Andric 83*5f757f3fSDimitry Andric #define INTERPOLATION_MODE(Val, Enum) {#Enum, PSV::InterpolationMode::Enum}, 84*5f757f3fSDimitry Andric 85*5f757f3fSDimitry Andric static const EnumEntry<PSV::InterpolationMode> InterpolationModeNames[] = { 86*5f757f3fSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def" 87*5f757f3fSDimitry Andric }; 88*5f757f3fSDimitry Andric 89*5f757f3fSDimitry Andric ArrayRef<EnumEntry<PSV::InterpolationMode>> PSV::getInterpolationModes() { 90*5f757f3fSDimitry Andric return ArrayRef(InterpolationModeNames); 91*5f757f3fSDimitry Andric } 92