1#pragma once
2
3#include "common/aglResCommon.h"
4#include "common/aglResShaderProgram.h"
5#include "common/aglResShaderSource.h"
6
7namespace agl {
8
9struct ResShaderArchiveData {
10 union {
11 char mSignature[4];
12 u32 mSigWord;
13 };
14 u32 mVersion;
15 u32 mFileSize;
16 u32 mEndian;
17 u32 mNameLen;
18 // char mName[];
19
20public:
21 static u32 getVersion();
22 static u32 getSignature();
23 static const char* getExtension();
24
25private:
26 static const u32 cVersion = 11;
27 static const u32 cSignature = 0x53484141; // SHAA
28#ifdef cafe
29 static const u32 cEndianCheckBit = 0x01000001;
30#endif
31#ifdef SWITCH
32 static const u32 cEndianCheckBit = 0x00000001;
33#endif
34
35 friend class ResCommon<ResShaderArchiveData>;
36 friend class ResShaderArchive;
37};
38static_assert(sizeof(ResShaderArchiveData) == 0x14, "agl::ResShaderArchiveData size mismatch");
39
40class ResShaderArchive : public ResCommon<ResShaderArchiveData> {
41 AGL_RES_FILE_HEADER()
42
43public:
44 using ResCommon::ResCommon;
45
46 const char* getName() const {
47 const DataType* const data = ptr();
48 return (const char*)(data + 1);
49 }
50
51 ResShaderProgramArray getResShaderProgramArray() const {
52 const DataType* const data = ptr();
53 return (const ResShaderProgramArrayData*)((uintptr_t)(data + 1) + data->mNameLen);
54 }
55
56 s32 getResShaderProgramNum() const { return getResShaderProgramArray().getNum(); }
57
58 ResShaderSourceArray getResShaderSourceArray() const {
59 const ResShaderProgramArrayData* const data = getResShaderProgramArray().ptr();
60 return (const ResShaderSourceArrayData*)((uintptr_t)data + data->mSize);
61 }
62
63 s32 getResShaderSourceNum() const { return getResShaderSourceArray().getNum(); }
64
65 bool setUp();
66};
67
68} // namespace agl
69