Go to the documentation of this file.
21 #ifndef SWSCALE_VULKAN_SPVASM_H
22 #define SWSCALE_VULKAN_SPVASM_H
31 #if HAVE_SPIRV_HEADERS_SPIRV_H
32 #include <spirv-headers/spirv.h>
33 #include <spirv-headers/GLSL.std.450.h>
36 #if HAVE_SPIRV_UNIFIED1_SPIRV_H
37 #include <spirv/unified1/spirv.h>
38 #include <spirv/unified1/GLSL.std.450.h>
44 #define COUNT_ARGS_IMPL(...) (sizeof((int[]){__VA_ARGS__}) / sizeof(int))
45 #define COUNT_ARGS(...) (COUNT_ARGS_IMPL(0, __VA_ARGS__) - 1)
50 #define SPI_ARGS(...) ((int[]){0, __VA_ARGS__}) + 1, COUNT_ARGS(__VA_ARGS__)
79 for (
int i = 0;
i < strlen(str) + 1;
i++)
81 int padding = (4 - (spi->
off & 3)) & 3;
82 for (
int i = 0;
i < padding;
i++)
126 SpvMemoryModel memory_model)
140 return FFALIGN(strlen(str) + 1, 4) >> 2;
149 #define OP_1SRC(name, code) \
150 static inline void spi_ ## name(SPICtx *spi, int src1_id) \
152 spi_op_1src(spi, code, src1_id); \
164 #define OP_UNTYPEDRES1SRC(name, code) \
165 static inline int spi_ ## name(SPICtx *spi, int src1_id) \
167 return spi_op_untypedres_1src(spi, code, spi_get_id(spi), src1_id); \
180 #define OP_RES1SRC(name, code) \
181 static inline int spi_ ## name(SPICtx *spi, int type_id, int src1_id) \
183 return spi_op_res_1src(spi, code, spi_get_id(spi), type_id, src1_id); \
193 #define OP_2SRC(name, code) \
194 static inline void spi_ ## name(SPICtx *spi, int src1_id, int src2_id) \
196 spi_op_2src(spi, code, src1_id, src2_id); \
201 int src1_id,
int src2_id)
209 #define OP_UNTYPEDRES2SRC(name, code) \
210 static inline int spi_ ## name(SPICtx *spi, int src1_id, int src2_id) \
212 return spi_op_untypedres_2src(spi, code, spi_get_id(spi), \
218 int src1_id,
int src2_id)
227 #define OP_RES2SRC(name, code) \
228 static inline int spi_ ## name(SPICtx *spi, int type_id, int src1_id, int src2_id) \
230 return spi_op_res_2src(spi, code, spi_get_id(spi), type_id, \
236 int src1_id,
const int *args,
int nb_args)
242 for (
int i = 0;
i < nb_args;
i++)
249 int id,
const int *args,
int nb_args)
253 for (
int i = 0;
i < nb_args;
i++)
259 int src1_id,
int src2_id,
260 const int *args,
int nb_args)
265 for (
int i = 0;
i < nb_args;
i++)
271 int src1_id,
int src2_id,
272 const int *args,
int nb_args)
279 for (
int i = 0;
i < nb_args;
i++)
286 int src2_id,
int src3_id,
287 const int *args,
int nb_args)
293 for (
int i = 0;
i < nb_args;
i++)
307 #define spi_OpConstantComposite(spi, res_type, src, ...) \
308 spi_op_res_1src_list(spi, 44, spi_get_id(spi), res_type, src, \
309 SPI_ARGS(__VA_ARGS__))
311 #define spi_OpAccessChain(spi, res_type, ptr_id, ...) \
312 spi_op_res_1src_list(spi, 65, spi_get_id(spi), res_type, ptr_id, \
313 SPI_ARGS(__VA_ARGS__))
315 #define spi_OpCompositeConstruct(spi, res_type, src, ...) \
316 spi_op_res_1src_list(spi, 80, spi_get_id(spi), res_type, src, \
317 SPI_ARGS(__VA_ARGS__))
319 #define spi_OpCompositeExtract(spi, res_type, src, ...) \
320 spi_op_res_1src_list(spi, 81, spi_get_id(spi), res_type, src, \
321 SPI_ARGS(__VA_ARGS__))
347 #define spi_OpExtInst(spi, res_type, instr_id, set_id, ...) \
348 spi_op_res_2src_list(spi, 12, spi_get_id(spi), res_type, instr_id, set_id, \
349 SPI_ARGS(__VA_ARGS__))
351 #define spi_OpTypeStruct(spi, id, ...) \
352 spi_op_untypedres_list(spi, 30, id, \
353 SPI_ARGS(__VA_ARGS__))
355 #define spi_OpDecorate(spi, target, deco, ...) \
356 spi_op_2src_list(spi, 71, target, deco, \
357 SPI_ARGS(__VA_ARGS__))
359 #define spi_OpMemberDecorate(spi, type, target, deco, ...) \
360 spi_op_3src_list(spi, 72, type, target, deco, \
361 SPI_ARGS(__VA_ARGS__))
363 #define spi_OpVectorShuffle(spi, res_type, src1, src2, ...) \
364 spi_op_res_2src_list(spi, 79, spi_get_id(spi), res_type, src1, src2, \
365 SPI_ARGS(__VA_ARGS__))
367 #define spi_OpCompositeInsert(spi, res_type, src1, src2, ...) \
368 spi_op_res_2src_list(spi, 82, spi_get_id(spi), res_type, src1, src2, \
369 SPI_ARGS(__VA_ARGS__))
372 const char *
name,
const int *args,
int nb_args)
378 for (
int i = 0;
i < nb_args;
i++)
405 SpvExecutionMode
mode,
int *
s,
int nb_s)
410 for (
int i = 0;
i < nb_s;
i++)
443 SpvFPEncoding floating_point_encoding)
453 int depth,
int arrayed,
int ms,
int sampled,
454 SpvImageFormat image_format)
498 const int *args,
int nb_args)
503 for (
int i = 0;
i < nb_args;
i++)
509 SpvFunctionControlMask function_control,
510 int function_type_id)
537 SpvStorageClass storage_class,
int initializer_id)
585 uint32_t vu = (
union {
int i; uint32_t
u; }){
val}.u;
591 uint64_t vu = (
union {
int64_t i; uint64_t
u; }){
val}.u;
597 uint32_t vu = (
union {
float f; uint32_t
u; }){
val}.u;
603 uint64_t vu = (
union {
double d; uint64_t
u; }){
val}.u;
608 SpvMemoryAccessMask memory_access,
int align)
610 int is_aligned = !!(memory_access & SpvMemoryAccessAlignedMask);
622 SpvMemoryAccessMask memory_access,
int align)
624 int is_aligned = !!(memory_access & SpvMemoryAccessAlignedMask);
634 SpvSelectionControlMask selection_control)
642 int true_label,
int false_label,
643 uint32_t branch_weights)
645 spi_write_u32(spi, ((4 + 2*(!!branch_weights)) << 16) | 250);
649 if (branch_weights) {
656 int pos_id, SpvImageOperandsMask image_operands)
669 int src_id, SpvImageOperandsMask image_operands)
static void spi_OpExecutionMode(SPICtx *spi, int entry_point_id, SpvExecutionMode mode, int *s, int nb_s)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
static void spi_op_2src_list(SPICtx *spi, int code, int src1_id, int src2_id, const int *args, int nb_args)
static int spi_OpConstantInt(SPICtx *spi, int type_id, int val)
static int spi_end(SPICtx *spi)
static int spi_OpVariable(SPICtx *spi, int var_id, int ptr_type_id, SpvStorageClass storage_class, int initializer_id)
static int spi_OpTypeFunction(SPICtx *spi, int return_type_id, const int *args, int nb_args)
static void spi_op_2src(SPICtx *spi, int code, int src1_id, int src2_id)
static int spi_OpConstantFalse(SPICtx *spi)
static int spi_OpConstantUInt(SPICtx *spi, int type_id, uint32_t val)
static int spi_op_res_1src(SPICtx *spi, int code, int id, int type_id, int src1_id)
static void spi_OpFunctionEnd(SPICtx *spi)
#define u(width, name, range_min, range_max)
#define OP_1SRC(name, code)
static int spi_OpConstantTrue(SPICtx *spi)
static double val(void *priv, double ch)
static int spi_OpTypeBool(SPICtx *spi)
#define OP_UNTYPEDRES1SRC(name, code)
static int spi_reserve(SPICtx *spi, int len)
static void spi_init(SPICtx *spi, uint8_t *spv_buf, int buf_len)
static void spi_OpFunction(SPICtx *spi, int fn_id, int result_type_id, SpvFunctionControlMask function_control, int function_type_id)
#define OP_UNTYPEDRES2SRC(name, code)
static void spi_OpMemoryModel(SPICtx *spi, SpvAddressingModel addressing_model, SpvMemoryModel memory_model)
static int spi_OpLabel(SPICtx *spi, int label_id)
static void spi_op_1src(SPICtx *spi, int code, int src1_id)
static int spi_OpUndef(SPICtx *spi, int type_id)
static void spi_OpBranchConditional(SPICtx *spi, int cond_id, int true_label, int false_label, uint32_t branch_weights)
static int spi_OpTypeFloatEnc(SPICtx *spi, int width, SpvFPEncoding floating_point_encoding)
static int spi_OpTypeImage(SPICtx *spi, int sampled_type_id, SpvDim dim, int depth, int arrayed, int ms, int sampled, SpvImageFormat image_format)
static int spi_OpEntryPoint(SPICtx *spi, SpvExecutionModel execution_model, const char *name, const int *args, int nb_args)
static int spi_strl(const char *str)
static void spi_OpSelectionMerge(SPICtx *spi, int merge_block, SpvSelectionControlMask selection_control)
#define OP_RES2SRC(name, code)
#define i(width, name, range_min, range_max)
static void spi_op_untypedres_list(SPICtx *spi, int code, int id, const int *args, int nb_args)
static void spi_OpName(SPICtx *spi, int target_id, const char *name)
static const uint8_t *BS_FUNC() align(BSCTX *bc)
Skip bits to a byte boundary.
static int spi_OpTypeArray(SPICtx *spi, int element_type_id, int id, int length_id)
static int spi_OpConstantInt64(SPICtx *spi, int type_id, int64_t val)
static int spi_OpExtInstImport(SPICtx *spi, const char *name)
static void spi_OpExtension(SPICtx *spi, const char *name)
static int spi_op_untypedres_1src(SPICtx *spi, int code, int id, int src1_id)
static int spi_get_id(SPICtx *spi)
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
static void spi_OpImageWrite(SPICtx *spi, int img_id, int pos_id, int src_id, SpvImageOperandsMask image_operands)
static int spi_op_untypedres_2src(SPICtx *spi, int code, int id, int src1_id, int src2_id)
static int spi_OpConstantDouble(SPICtx *spi, int type_id, double val)
static int spi_OpConstantUInt64(SPICtx *spi, int type_id, uint64_t val)
#define OP_RES1SRC(name, code)
static void spi_op_3src_list(SPICtx *spi, int code, int src1_id, int src2_id, int src3_id, const int *args, int nb_args)
static int spi_OpTypeVoid(SPICtx *spi)
static void spi_OpStore(SPICtx *spi, int ptr_id, int obj_id, SpvMemoryAccessMask memory_access, int align)
static int spi_op_res_1src_list(SPICtx *spi, int code, int id, int type_id, int src1_id, const int *args, int nb_args)
static void spi_OpReturn(SPICtx *spi)
static int spi_OpImageRead(SPICtx *spi, int result_type_id, int img_id, int pos_id, SpvImageOperandsMask image_operands)
static void spi_OpCapability(SPICtx *spi, SpvCapability capability)
static int spi_OpConstantFloat(SPICtx *spi, int type_id, float val)
static int spi_OpLoad(SPICtx *spi, int result_type_id, int ptr_id, SpvMemoryAccessMask memory_access, int align)
static int spi_OpTypePointer(SPICtx *spi, SpvStorageClass storage_class, int type_id)
static int spi_op_res_2src(SPICtx *spi, int code, int id, int type_id, int src1_id, int src2_id)
static void spi_write_u32(SPICtx *spi, uint32_t v)
static int spi_op_res_2src_list(SPICtx *spi, int code, int id, int type_id, int src1_id, int src2_id, const int *args, int nb_args)
static int spi_OpTypeRuntimeArray(SPICtx *spi, int element_type_id)
static void spi_put_str(SPICtx *spi, const char *str)