From: Józef Kucia Subject: [PATCH vkd3d 1/7] vkd3d-shader: Add support for dual source blending. Message-Id: <20181213092842.17876-1-joseph.kucia@gmail.com> Date: Thu, 13 Dec 2018 10:28:36 +0100 From: Józef Kucia Signed-off-by: Józef Kucia --- include/vkd3d_shader.h | 1 + libs/vkd3d-shader/spirv.c | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h index 7d9bf70e3131..1153fdea0a0d 100644 --- a/include/vkd3d_shader.h +++ b/include/vkd3d_shader.h @@ -165,6 +165,7 @@ struct vkd3d_shader_compile_arguments const void *next; enum vkd3d_shader_target target; + bool dual_source_blending; const unsigned int *output_swizzles; unsigned int output_swizzle_count; }; diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index ec7cab693c84..a24585c542da 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -3400,6 +3400,14 @@ static unsigned int get_shader_output_swizzle(const struct vkd3d_dxbc_compiler * return compile_args->output_swizzles[register_idx]; } +static bool is_dual_source_blending(const struct vkd3d_dxbc_compiler *compiler) +{ + const struct vkd3d_shader_compile_arguments *compile_args = compiler->compile_args; + + return compiler->shader_type == VKD3D_SHADER_TYPE_PIXEL + && compile_args && compile_args->dual_source_blending; +} + static void calculate_clip_or_cull_distance_mask(const struct vkd3d_shader_signature_element *e, uint32_t *mask) { @@ -3544,7 +3552,16 @@ static void vkd3d_dxbc_compiler_emit_output(struct vkd3d_dxbc_compiler *compiler } else { - vkd3d_spirv_build_op_decorate1(builder, id, SpvDecorationLocation, reg->idx[0].offset); + if (is_dual_source_blending(compiler) && reg->idx[0].offset < 2) + { + vkd3d_spirv_build_op_decorate1(builder, id, SpvDecorationLocation, 0); + vkd3d_spirv_build_op_decorate1(builder, id, SpvDecorationIndex, reg->idx[0].offset); + } + else + { + vkd3d_spirv_build_op_decorate1(builder, id, SpvDecorationLocation, reg->idx[0].offset); + } + if (component_idx) vkd3d_spirv_build_op_decorate1(builder, id, SpvDecorationComponent, component_idx); } -- 2.19.2