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:
Alejandro Piñeiro
2018-01-18 12:24:38 +01:00
parent 3761e675e2
commit bebe3d626e
2 changed files with 38 additions and 17 deletions

View File

@@ -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);

View File

@@ -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)
{ {