spirv: add vtn_create_builder
Refactored from spirv_to_nir, in order to be reused later. Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com> v2: renamed method (from vtn_builder_create), add explanatory comment (Timothy)
This commit is contained in:
@@ -3972,14 +3972,12 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
nir_function *
|
struct vtn_builder*
|
||||||
spirv_to_nir(const uint32_t *words, size_t word_count,
|
vtn_create_builder(const uint32_t *words, size_t word_count,
|
||||||
struct nir_spirv_specialization *spec, unsigned num_spec,
|
|
||||||
gl_shader_stage stage, const char *entry_point_name,
|
gl_shader_stage stage, const char *entry_point_name,
|
||||||
const struct spirv_to_nir_options *options,
|
const struct spirv_to_nir_options *options)
|
||||||
const nir_shader_compiler_options *nir_options)
|
|
||||||
{
|
{
|
||||||
/* Initialize the stn_builder object */
|
/* Initialize the vtn_builder object */
|
||||||
struct vtn_builder *b = rzalloc(NULL, struct vtn_builder);
|
struct vtn_builder *b = rzalloc(NULL, struct vtn_builder);
|
||||||
b->spirv = words;
|
b->spirv = words;
|
||||||
b->spirv_word_count = word_count;
|
b->spirv_word_count = word_count;
|
||||||
@@ -3991,14 +3989,6 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
|
|||||||
b->entry_point_name = entry_point_name;
|
b->entry_point_name = entry_point_name;
|
||||||
b->options = options;
|
b->options = options;
|
||||||
|
|
||||||
/* See also _vtn_fail() */
|
|
||||||
if (setjmp(b->fail_jump)) {
|
|
||||||
ralloc_free(b);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint32_t *word_end = words + word_count;
|
|
||||||
|
|
||||||
/* Handle the SPIR-V header (first 4 dwords) */
|
/* Handle the SPIR-V header (first 4 dwords) */
|
||||||
vtn_assert(word_count > 5);
|
vtn_assert(word_count > 5);
|
||||||
|
|
||||||
@@ -4008,11 +3998,38 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
|
|||||||
unsigned value_id_bound = words[3];
|
unsigned value_id_bound = words[3];
|
||||||
vtn_assert(words[4] == 0);
|
vtn_assert(words[4] == 0);
|
||||||
|
|
||||||
words+= 5;
|
|
||||||
|
|
||||||
b->value_id_bound = value_id_bound;
|
b->value_id_bound = value_id_bound;
|
||||||
b->values = rzalloc_array(b, struct vtn_value, value_id_bound);
|
b->values = rzalloc_array(b, struct vtn_value, value_id_bound);
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
nir_function *
|
||||||
|
spirv_to_nir(const uint32_t *words, size_t word_count,
|
||||||
|
struct nir_spirv_specialization *spec, unsigned num_spec,
|
||||||
|
gl_shader_stage stage, const char *entry_point_name,
|
||||||
|
const struct spirv_to_nir_options *options,
|
||||||
|
const nir_shader_compiler_options *nir_options)
|
||||||
|
|
||||||
|
{
|
||||||
|
const uint32_t *word_end = words + word_count;
|
||||||
|
|
||||||
|
struct vtn_builder *b = vtn_create_builder(words, word_count,
|
||||||
|
stage, entry_point_name,
|
||||||
|
options);
|
||||||
|
|
||||||
|
if (b == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* See also _vtn_fail() */
|
||||||
|
if (setjmp(b->fail_jump)) {
|
||||||
|
ralloc_free(b);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip the SPIR-V header, handled at vtn_create_builder */
|
||||||
|
words+= 5;
|
||||||
|
|
||||||
/* Handle all the preamble instructions */
|
/* Handle all the preamble instructions */
|
||||||
words = vtn_foreach_instruction(b, words, word_end,
|
words = vtn_foreach_instruction(b, words, word_end,
|
||||||
vtn_handle_preamble_instruction);
|
vtn_handle_preamble_instruction);
|
||||||
|
@@ -719,6 +719,10 @@ void vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
|
|||||||
bool vtn_handle_glsl450_instruction(struct vtn_builder *b, uint32_t ext_opcode,
|
bool vtn_handle_glsl450_instruction(struct vtn_builder *b, uint32_t ext_opcode,
|
||||||
const uint32_t *words, unsigned count);
|
const uint32_t *words, unsigned count);
|
||||||
|
|
||||||
|
struct vtn_builder* vtn_create_builder(const uint32_t *words, size_t word_count,
|
||||||
|
gl_shader_stage stage, const char *entry_point_name,
|
||||||
|
const struct spirv_to_nir_options *options);
|
||||||
|
|
||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
vtn_align_u32(uint32_t v, uint32_t a)
|
vtn_align_u32(uint32_t v, uint32_t a)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user