From: "Rémi Bernon" Subject: [PATCH vkd3d 2/2] vkd3d-shader: Reserve spirv words upfront instead of checking each time. Message-Id: <20191003170933.12734-2-rbernon@codeweavers.com> Date: Thu, 3 Oct 2019 19:09:33 +0200 In-Reply-To: <20191003170933.12734-1-rbernon@codeweavers.com> References: <20191003170933.12734-1-rbernon@codeweavers.com> Signed-off-by: Rémi Bernon --- Same thing, the vkd3d_spirv_build_word function shows up in perf report, and we can instead reserve space upfront. libs/vkd3d-shader/spirv.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 75a3a4f3..d74d2d38 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -371,12 +371,17 @@ static uint32_t vkd3d_spirv_opcode_word(SpvOp op, unsigned int word_count) return (word_count << SpvWordCountShift) | op; } -static void vkd3d_spirv_build_word(struct vkd3d_spirv_stream *stream, uint32_t word) +static void vkd3d_spirv_reserve_words(struct vkd3d_spirv_stream *stream, uint32_t count) { if (!vkd3d_array_reserve((void **)&stream->words, &stream->capacity, - stream->word_count + 1, sizeof(*stream->words))) - return; + stream->word_count + count, sizeof(*stream->words))) + ERR("Not enough memory to reserve words.\n"); + assert(stream->capacity >= stream->word_count + count); +} +static void vkd3d_spirv_build_word(struct vkd3d_spirv_stream *stream, uint32_t word) +{ + assert(stream->capacity >= stream->word_count + 1); stream->words[stream->word_count++] = word; } @@ -563,12 +568,14 @@ static uint32_t vkd3d_spirv_build_once7(struct vkd3d_spirv_builder *builder, */ static void vkd3d_spirv_build_op(struct vkd3d_spirv_stream *stream, SpvOp op) { + vkd3d_spirv_reserve_words(stream, 1); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(op, 1)); } static void vkd3d_spirv_build_op1(struct vkd3d_spirv_stream *stream, SpvOp op, uint32_t operand) { + vkd3d_spirv_reserve_words(stream, 2); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(op, 2)); vkd3d_spirv_build_word(stream, operand); } @@ -577,6 +584,7 @@ static void vkd3d_spirv_build_op1v(struct vkd3d_spirv_stream *stream, SpvOp op, uint32_t operand0, const uint32_t *operands, unsigned int operand_count) { unsigned int i; + vkd3d_spirv_reserve_words(stream, 2 + operand_count); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(op, 2 + operand_count)); vkd3d_spirv_build_word(stream, operand0); for (i = 0; i < operand_count; ++i) @@ -588,6 +596,7 @@ static void vkd3d_spirv_build_op2v(struct vkd3d_spirv_stream *stream, const uint32_t *operands, unsigned int operand_count) { unsigned int i; + vkd3d_spirv_reserve_words(stream, 3 + operand_count); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(op, 3 + operand_count)); vkd3d_spirv_build_word(stream, operand0); vkd3d_spirv_build_word(stream, operand1); @@ -600,6 +609,7 @@ static void vkd3d_spirv_build_op3v(struct vkd3d_spirv_stream *stream, const uint32_t *operands, unsigned int operand_count) { unsigned int i; + vkd3d_spirv_reserve_words(stream, 4 + operand_count); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(op, 4 + operand_count)); vkd3d_spirv_build_word(stream, operand0); vkd3d_spirv_build_word(stream, operand1); @@ -712,6 +722,7 @@ static uint32_t vkd3d_spirv_build_op_tr2v(struct vkd3d_spirv_builder *builder, { uint32_t result_id = vkd3d_spirv_alloc_id(builder); unsigned int i; + vkd3d_spirv_reserve_words(stream, 5 + operand_count); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(op, 5 + operand_count)); vkd3d_spirv_build_word(stream, result_type); vkd3d_spirv_build_word(stream, result_id); @@ -775,6 +786,7 @@ static void vkd3d_spirv_build_op_extension(struct vkd3d_spirv_stream *stream, const char *name) { unsigned int name_size = vkd3d_spirv_string_word_count(name); + vkd3d_spirv_reserve_words(stream, 1 + name_size); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(SpvOpExtension, 1 + name_size)); vkd3d_spirv_build_string(stream, name, name_size); } @@ -783,6 +795,7 @@ static void vkd3d_spirv_build_op_ext_inst_import(struct vkd3d_spirv_stream *stre uint32_t result_id, const char *name) { unsigned int name_size = vkd3d_spirv_string_word_count(name); + vkd3d_spirv_reserve_words(stream, 2 + name_size); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(SpvOpExtInstImport, 2 + name_size)); vkd3d_spirv_build_word(stream, result_id); vkd3d_spirv_build_string(stream, name, name_size); @@ -807,6 +820,7 @@ static void vkd3d_spirv_build_op_entry_point(struct vkd3d_spirv_stream *stream, uint32_t *interface_list, unsigned int interface_size) { unsigned int i, name_size = vkd3d_spirv_string_word_count(name); + vkd3d_spirv_reserve_words(stream, 3 + name_size + interface_size); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(SpvOpEntryPoint, 3 + name_size + interface_size)); vkd3d_spirv_build_word(stream, model); vkd3d_spirv_build_word(stream, function_id); @@ -835,6 +849,7 @@ static void vkd3d_spirv_build_op_name(struct vkd3d_spirv_builder *builder, va_end(args); name_size = vkd3d_spirv_string_word_count(name); + vkd3d_spirv_reserve_words(stream, 2 + name_size); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(SpvOpName, 2 + name_size)); vkd3d_spirv_build_word(stream, id); vkd3d_spirv_build_string(stream, name, name_size); @@ -854,6 +869,7 @@ static void vkd3d_spirv_build_op_member_name(struct vkd3d_spirv_builder *builder va_end(args); name_size = vkd3d_spirv_string_word_count(name); + vkd3d_spirv_reserve_words(stream, 3 + name_size); vkd3d_spirv_build_word(stream, vkd3d_spirv_opcode_word(SpvOpMemberName, 3 + name_size)); vkd3d_spirv_build_word(stream, type_id); vkd3d_spirv_build_word(stream, member); @@ -1699,6 +1715,7 @@ static bool vkd3d_spirv_compile_module(struct vkd3d_spirv_builder *builder, vkd3d_spirv_stream_init(&stream); + vkd3d_spirv_reserve_words(&stream, 5); vkd3d_spirv_build_word(&stream, SpvMagicNumber); vkd3d_spirv_build_word(&stream, VKD3D_SPIRV_VERSION); vkd3d_spirv_build_word(&stream, VKD3D_SPIRV_GENERATOR_MAGIC); -- 2.23.0