1#pragma once
2
3#include "common/aglResShaderSymbol.h"
4#include "common/aglResShaderVariation.h"
5
6namespace agl {
7
8struct ResBinaryShaderProgramData {
9 u32 mSize;
10 u32 mNameLen;
11 u32 mKind;
12 u32 mBaseIndex;
13 // char mName[];
14};
15static_assert(sizeof(ResBinaryShaderProgramData) == 0x10,
16 "agl::ResBinaryShaderProgramData size mismatch");
17
18class ResBinaryShaderProgram : public ResCommon<ResBinaryShaderProgramData> {
19public:
20 using ResCommon::ResCommon;
21
22 const char* getName() const { return (const char*)(ptr() + 1); }
23
24 ResShaderVariationArray getResShaderVariationArray() const {
25 const DataType* const data = ptr();
26 return (const ResShaderVariationArrayData*)((uintptr_t)(data + 1) + data->mNameLen);
27 }
28
29 ResShaderVariationArray getResShaderVariationDefaultArray() const {
30 const ResShaderVariationArrayData* const data = getResShaderVariationArray().ptr();
31 return (const ResShaderVariationArrayData*)((uintptr_t)data + data->mSize);
32 }
33
34 ResShaderSymbolArray getResShaderSymbolArray(ShaderSymbolType type) const;
35};
36
37using ResBinaryShaderProgramArray = ResArray<ResBinaryShaderProgram>;
38
39using ResBinaryShaderProgramArrayData = ResBinaryShaderProgramArray::DataType;
40static_assert(sizeof(ResBinaryShaderProgramArrayData) == 8,
41 "agl::ResBinaryShaderProgramArrayData size mismatch");
42
43} // namespace agl
44