1#pragma once
2
3#include <nn/gfx/detail/gfx_DataContainer.h>
4#include <nn/gfx/gfx_Common.h>
5#include <nn/gfx/gfx_ResShaderData.h>
6#include <nn/util/AccessorBase.h>
7#include <nn/util/util_BinaryFormat.h>
8
9namespace nn::gfx {
10
11class ShaderInfo;
12
13class ResShaderProgram : public nn::util::AccessorBase<ResShaderProgramData> {
14 NN_NO_COPY(ResShaderProgram);
15
16public:
17 static ResShaderProgram* ToAccessor(value_type*);
18 static ResShaderProgram& ToAccessor(value_type&);
19
20 static const ResShaderProgram* ToAccessor(const value_type* pData) {
21 return static_cast<const ResShaderProgram*>(pData);
22 }
23
24 static const ResShaderProgram& ToAccessor(const value_type&);
25
26 ShaderInfo* GetShaderInfo() { return DataToAccessor(data&: info); }
27 const ShaderInfo* GetShaderInfo() const { return DataToAccessor(data: info); }
28 detail::Caster<void> GetShader();
29 detail::Caster<const void> GetShader() const;
30 const nngfxToolShaderCompilerShaderReflection* GetShaderCompilerReflection() const;
31};
32
33class ResShaderVariation : public nn::util::AccessorBase<ResShaderVariationData> {
34 NN_NO_COPY(ResShaderVariation);
35
36public:
37 static ResShaderVariation* ToAccessor(value_type* pData) {
38 return static_cast<ResShaderVariation*>(pData);
39 }
40
41 static ResShaderVariation& ToAccessor(value_type&);
42
43 static const ResShaderVariation* ToAccessor(const value_type* pData) {
44 return static_cast<const ResShaderVariation*>(pData);
45 }
46
47 static const ResShaderVariation& ToAccessor(const value_type&);
48
49 ResShaderProgram* GetResShaderProgram(ShaderCodeType codeType) {
50 return const_cast<ResShaderProgram*>(
51 static_cast<const ResShaderVariation*>(this)->GetResShaderProgram(codeType));
52 }
53
54 const ResShaderProgram* GetResShaderProgram(ShaderCodeType codeType) const {
55 static const nn::util::BinTPtr<ResShaderProgramData> ResShaderVariationData::*
56 s_pResShaderProgramDataTable[] = {
57 &ResShaderVariationData::pBinaryProgram,
58 &ResShaderVariationData::pIntermediateLanguageProgram,
59 &ResShaderVariationData::pSourceProgram,
60 nullptr,
61 };
62
63 return ResShaderProgram::ToAccessor(pData: (this->*s_pResShaderProgramDataTable[codeType]).Get());
64 }
65};
66
67class ResShaderContainer : public nn::util::AccessorBase<ResShaderContainerData> {
68 NN_NO_COPY(ResShaderContainer);
69
70public:
71 static const int Signature = 0x63737267; // ??
72
73 static ResShaderContainer* ToAccessor(value_type*);
74 static ResShaderContainer& ToAccessor(value_type&);
75
76 static const ResShaderContainer* ToAccessor(const value_type* pData) {
77 return static_cast<const ResShaderContainer*>(pData);
78 }
79
80 static const ResShaderContainer& ToAccessor(const value_type&);
81
82 ResShaderProgram* GetResShaderProgram(int);
83 const ResShaderProgram* GetResShaderProgram(int) const;
84
85 ResShaderVariation* GetResShaderVariation(int index) {
86 return ResShaderVariation::ToAccessor(pData: pShaderVariationArray.Get() + index);
87 }
88
89 const ResShaderVariation* GetResShaderVariation(int index) const {
90 return ResShaderVariation::ToAccessor(pData: pShaderVariationArray.Get() + index);
91 }
92
93 int GetShaderVariationCount() const { return shaderVariationCount; }
94};
95
96class ResShaderFile : public nn::util::AccessorBase<ResShaderFileData> {
97 NN_NO_COPY(ResShaderFile);
98
99public:
100 static const int64_t Signature = 0x48534E42; // ??
101 static const int MajorVersion = 2;
102 static const int MinorVersion = 1;
103 static const int MicroVersion = 5;
104
105 static size_t GetMaxFileAlignment();
106
107 static ResShaderFile* ToAccessor(value_type* pData) {
108 return static_cast<ResShaderFile*>(pData);
109 }
110
111 static ResShaderFile& ToAccessor(value_type& data) { return static_cast<ResShaderFile&>(data); }
112
113 static const ResShaderFile* ToAccessor(const value_type*);
114 static const ResShaderFile& ToAccessor(const value_type&);
115 static bool IsValid(const void*);
116 static ResShaderFile* ResCast(void*);
117
118 ResShaderContainer* GetShaderContainer();
119 const ResShaderContainer* GetShaderContainer() const {
120 return ResShaderContainer::ToAccessor(
121 pData: reinterpret_cast<const ResShaderContainerData*>(fileHeader.GetFirstBlock()));
122 }
123
124 nn::util::BinaryFileHeader* GetBinaryFileHeader() { return &fileHeader; }
125 const nn::util::BinaryFileHeader* GetBinaryFileHeader() const { return &fileHeader; }
126};
127} // namespace nn::gfx