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