ae2f_docs
Spvc.def.c
Go to the documentation of this file.
1#ifndef ae2fVK_Spvc_h
2#define ae2fVK_Spvc_h
3
4#include <glslang/Include/glslang_c_interface.h>
5#include <glslang/Include/glslang_c_shader_types.h>
6#include <glslang/Public/resource_limits_c.h>
7
8#include <ae2f/Call.h>
9#include <ae2f/Cast.h>
10#include <ae2f/errGlob.h>
11
12#include <ae2f/Macro.h>
13#include <stddef.h>
14
15ae2f_structdef(struct, ae2fVK_Spvc) {
16 glslang_shader_t* restrict m_shader;
17 glslang_program_t* restrict m_programme;
18 unsigned int* restrict m_spirv_words;
19 size_t m_spirv_sz;
20};
21
22#if ae2f_MAC_BUILD
23
24ae2f_extern ae2f_SHAREDCALL void ae2fVK_SpvcMk(
25 ae2f_err_t* restrict reterr
26 , ae2f_FREE(ae2fVK_SpvcDel, __ae2fVK_SpvcDel)
27 ae2fVK_Spvc* restrict const ret
28 , const glslang_input_t* const restrict inp
29 );
30
31ae2f_extern ae2f_SHAREDCALL void ae2fVK_SpvcDel(
32 ae2fVK_Spvc* restrict const block
33 );
34
35#else
36
37#define ae2fVK_SpvcMk __ae2fVK_SpvcMk_C
38#define ae2fVK_SpvcDel __ae2fVK_SpvcDel_C
39
40#endif // ae2f_MAC_BUILD
41
42#endif
43
44#ifndef ae2fVK_Spvc_c
45
46#if !__ae2f_MACRO_GENERATED
47
48#if !ae2f_MAC_BUILD
49#include <assert.h>
50#include <ae2fVK/Spvc.h>
51#include <ae2f/Macro.h>
52#endif
53
54#endif
55#define ae2fVK_Spvc_c
56
57ae2f_MAC() _ae2fVK_SpvcMkWithMsg_imp(
58 int v_ret_isgood
59 , ae2fVK_Spvc v_ret
60 , const glslang_input_t* const restrict inp
61 , const int msg
62 )
63{
64 do {
65 assert(inp);
66 (v_ret).m_shader = glslang_shader_create(inp);
67 (v_ret).m_programme = glslang_program_create();
68
69 assert(((v_ret).m_shader && (v_ret).m_programme) && "initiating has failed.");
70 if(!(v_ret).m_shader) {
71 break;
72 }
73
74 (v_ret_isgood) = glslang_shader_preprocess((v_ret).m_shader, inp);
75 assert((v_ret_isgood) && "GLSL preprocessing failed.");
76 if(!v_ret_isgood) {
77 break;
78 }
79
80 (v_ret_isgood) = glslang_shader_parse((v_ret).m_shader, inp);
81 assert((v_ret_isgood) && "GLSL parsing failed.");
82 if(!v_ret_isgood) {
83 break;
84 }
85
86 glslang_program_add_shader(
87 (v_ret).m_programme
88 , (v_ret).m_shader
89 );
90
91 (v_ret_isgood) = glslang_program_link(
92 (v_ret).m_programme
93 , msg
94 );
95
96 (v_ret_isgood) = glslang_shader_parse((v_ret).m_shader, inp);
97 assert((v_ret_isgood) && "GLSL linking failed.");
98 if(!v_ret_isgood) {
99 break;
100 }
101
102 glslang_program_SPIRV_generate((v_ret).m_programme, (inp)->stage);
103 (v_ret).m_spirv_words = glslang_program_SPIRV_get_ptr((v_ret).m_programme);
104 (v_ret).m_spirv_sz = glslang_program_SPIRV_get_size((v_ret).m_programme);
105
106 assert((v_ret).m_spirv_words);
107 assert((v_ret).m_spirv_sz);
108 } while(0);
109}
110
111#define __ae2fVK_SpvcMk_imp(v_ret_isgood, v_ret, inp)
112 __ae2fVK_SpvcMkWithMsg_imp(v_ret_isgood, v_ret, inp, GLSLANG_MSG_VULKAN_RULES_BIT | GLSLANG_MSG_SPV_RULES_BIT)
113
114
115ae2f_MAC() _ae2fVK_SpvcMk(
116 ae2f_err_t* restrict reterr
117 , ae2fVK_Spvc* restrict const ret
118 , const glslang_input_t* const restrict inp
119 )
120{
121 assert(ret);
122 if((reterr) && *(reterr))
123 ;
124 else unless(ret) {
125 (reterr) && (*(reterr) |= ae2f_errGlob_PTR_IS_NULL);
126 } else {
127 int v_isgood;
128 __ae2fVK_SpvcMk_imp(v_isgood, *(ret), inp);
129 assert(v_isgood);
130 v_isgood || (*(reterr) |= ae2f_errGlob_ALLOC_FAILED);
131 }
132}
133
134#define __ae2fVK_SpvcMk_C __ae2fVK_SpvcMk
135
136ae2f_MAC() _ae2fVK_SpvcDel_imp(ae2fVK_Spvc v_block) {
137 if((v_block).m_programme)
138 glslang_program_delete((v_block).m_programme);
139 if((v_block).m_shader)
140 glslang_shader_delete((v_block).m_shader);
141
142}
143
144ae2f_MAC() _ae2fVK_SpvcDel(ae2fVK_Spvc* restrict const block)
145{
146 __ae2fVK_SpvcDel_imp(*(block));
147 (block)->m_programme = 0;
148 (block)->m_shader = 0;
149 (block)->m_spirv_words = 0;
150 (block)->m_spirv_sz = 0;
151}
152
153#define __ae2fVK_SpvcDel_C __ae2fVK_SpvcDel
154
155#endif
#define __ae2fVK_SpvcMk_imp(v_ret_isgood, v_ret, inp)
Definition Spvc.def.c:111
#define __ae2fVK_SpvcMk_C
Definition Spvc.def.c:134
#define __ae2fVK_SpvcDel_C
Definition Spvc.def.c:153
ae2f_structdef(struct, ae2fVK_Spvc)
Definition Spvc.def.c:15