1 //===- llvm/MC/DXContainerPSVInfo.cpp - DXContainer PSVInfo -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/MC/DXContainerPSVInfo.h" 10 #include "llvm/BinaryFormat/DXContainer.h" 11 #include "llvm/Support/raw_ostream.h" 12 13 using namespace llvm; 14 using namespace llvm::mcdxbc; 15 using namespace llvm::dxbc::PSV; 16 17 void PSVRuntimeInfo::write(raw_ostream &OS, uint32_t Version) const { 18 uint32_t InfoSize; 19 uint32_t BindingSize; 20 switch (Version) { 21 case 0: 22 InfoSize = sizeof(dxbc::PSV::v0::RuntimeInfo); 23 BindingSize = sizeof(dxbc::PSV::v0::ResourceBindInfo); 24 break; 25 case 1: 26 InfoSize = sizeof(dxbc::PSV::v1::RuntimeInfo); 27 BindingSize = sizeof(dxbc::PSV::v0::ResourceBindInfo); 28 break; 29 case 2: 30 default: 31 InfoSize = sizeof(dxbc::PSV::v2::RuntimeInfo); 32 BindingSize = sizeof(dxbc::PSV::v2::ResourceBindInfo); 33 } 34 uint32_t InfoSizeSwapped = InfoSize; 35 if (sys::IsBigEndianHost) 36 sys::swapByteOrder(InfoSizeSwapped); 37 // Write the size of the info. 38 OS.write(reinterpret_cast<const char *>(&InfoSizeSwapped), sizeof(uint32_t)); 39 // Write the info itself. 40 OS.write(reinterpret_cast<const char *>(&BaseData), InfoSize); 41 42 uint32_t ResourceCount = static_cast<uint32_t>(Resources.size()); 43 uint32_t BindingSizeSwapped = BindingSize; 44 if (sys::IsBigEndianHost) { 45 sys::swapByteOrder(ResourceCount); 46 sys::swapByteOrder(BindingSizeSwapped); 47 } 48 49 OS.write(reinterpret_cast<const char *>(&ResourceCount), sizeof(uint32_t)); 50 OS.write(reinterpret_cast<const char *>(&BindingSizeSwapped), sizeof(uint32_t)); 51 52 for (const auto &Res : Resources) 53 OS.write(reinterpret_cast<const char *>(&Res), BindingSize); 54 } 55