tu: Implement dual-src blending

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5039>
This commit is contained in:
Connor Abbott 2020-05-14 17:17:46 +02:00 committed by Marge Bot
parent 078aa9df8d
commit adbdab3ee8
1 changed files with 50 additions and 4 deletions

View File

@ -298,6 +298,7 @@ struct tu_pipeline_builder
/* these states are affectd by rasterizer_discard */
VkSampleCountFlagBits samples;
bool use_color_attachments;
bool use_dual_src_blend;
uint32_t color_attachment_count;
VkFormat color_attachment_formats[MAX_RTS];
VkFormat depth_attachment_format;
@ -383,6 +384,37 @@ tu_blend_factor_no_dst_alpha(VkBlendFactor factor)
}
}
static bool tu_blend_factor_is_dual_src(VkBlendFactor factor)
{
switch (factor) {
case VK_BLEND_FACTOR_SRC1_COLOR:
case VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR:
case VK_BLEND_FACTOR_SRC1_ALPHA:
case VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA:
return true;
default:
return false;
}
}
static bool
tu_blend_state_is_dual_src(const VkPipelineColorBlendStateCreateInfo *info)
{
if (!info)
return false;
for (unsigned i = 0; i < info->attachmentCount; i++) {
const VkPipelineColorBlendAttachmentState *blend = &info->pAttachments[i];
if (tu_blend_factor_is_dual_src(blend->srcColorBlendFactor) ||
tu_blend_factor_is_dual_src(blend->dstColorBlendFactor) ||
tu_blend_factor_is_dual_src(blend->srcAlphaBlendFactor) ||
tu_blend_factor_is_dual_src(blend->dstAlphaBlendFactor))
return true;
}
return false;
}
static enum pc_di_primtype
tu6_primtype(VkPrimitiveTopology topology)
{
@ -1305,7 +1337,7 @@ tu6_emit_fs_inputs(struct tu_cs *cs, const struct ir3_shader_variant *fs)
static void
tu6_emit_fs_outputs(struct tu_cs *cs,
const struct ir3_shader_variant *fs,
uint32_t mrt_count)
uint32_t mrt_count, bool dual_src_blend)
{
uint32_t smask_regid, posz_regid;
@ -1327,6 +1359,7 @@ tu6_emit_fs_outputs(struct tu_cs *cs,
tu_cs_emit_pkt4(cs, REG_A6XX_SP_FS_OUTPUT_CNTL0, 2);
tu_cs_emit(cs, A6XX_SP_FS_OUTPUT_CNTL0_DEPTH_REGID(posz_regid) |
A6XX_SP_FS_OUTPUT_CNTL0_SAMPMASK_REGID(smask_regid) |
COND(dual_src_blend, A6XX_SP_FS_OUTPUT_CNTL0_DUAL_COLOR_IN_ENABLE) |
0xfc000000);
tu_cs_emit(cs, A6XX_SP_FS_OUTPUT_CNTL1_MRT(mrt_count));
@ -1343,7 +1376,8 @@ tu6_emit_fs_outputs(struct tu_cs *cs,
tu_cs_emit_pkt4(cs, REG_A6XX_RB_FS_OUTPUT_CNTL0, 2);
tu_cs_emit(cs, COND(fs->writes_pos, A6XX_RB_FS_OUTPUT_CNTL0_FRAG_WRITES_Z) |
COND(fs->writes_smask, A6XX_RB_FS_OUTPUT_CNTL0_FRAG_WRITES_SAMPMASK));
COND(fs->writes_smask, A6XX_RB_FS_OUTPUT_CNTL0_FRAG_WRITES_SAMPMASK) |
COND(dual_src_blend, A6XX_RB_FS_OUTPUT_CNTL0_DUAL_COLOR_IN_ENABLE));
tu_cs_emit(cs, A6XX_RB_FS_OUTPUT_CNTL1_MRT(mrt_count));
tu_cs_emit_regs(cs,
@ -1561,7 +1595,8 @@ tu6_emit_program(struct tu_cs *cs,
tu6_emit_vpc(cs, vs, gs, fs, binning_pass, tf);
tu6_emit_vpc_varying_modes(cs, fs, binning_pass);
tu6_emit_fs_inputs(cs, fs);
tu6_emit_fs_outputs(cs, fs, builder->color_attachment_count);
tu6_emit_fs_outputs(cs, fs, builder->color_attachment_count,
builder->use_dual_src_blend);
tu6_emit_shader_object(cs, MESA_SHADER_VERTEX, vs, binary_bo,
binning_pass ? builder->binning_vs_offset : builder->shader_offsets[MESA_SHADER_VERTEX]);
@ -2029,6 +2064,7 @@ tu6_emit_rb_mrt_controls(struct tu_cs *cs,
static void
tu6_emit_blend_control(struct tu_cs *cs,
uint32_t blend_enable_mask,
bool dual_src_blend,
const VkPipelineMultisampleStateCreateInfo *msaa_info)
{
assert(!msaa_info->alphaToOneEnable);
@ -2036,6 +2072,8 @@ tu6_emit_blend_control(struct tu_cs *cs,
uint32_t sp_blend_cntl = A6XX_SP_BLEND_CNTL_UNK8;
if (blend_enable_mask)
sp_blend_cntl |= A6XX_SP_BLEND_CNTL_ENABLED;
if (dual_src_blend)
sp_blend_cntl |= A6XX_SP_BLEND_CNTL_DUAL_COLOR_IN_ENABLE;
if (msaa_info->alphaToCoverageEnable)
sp_blend_cntl |= A6XX_SP_BLEND_CNTL_ALPHA_TO_COVERAGE;
@ -2048,6 +2086,8 @@ tu6_emit_blend_control(struct tu_cs *cs,
A6XX_RB_BLEND_CNTL_ENABLE_BLEND(blend_enable_mask) |
A6XX_RB_BLEND_CNTL_INDEPENDENT_BLEND |
A6XX_RB_BLEND_CNTL_SAMPLE_MASK(sample_mask);
if (dual_src_blend)
rb_blend_cntl |= A6XX_RB_BLEND_CNTL_DUAL_COLOR_IN_ENABLE;
if (msaa_info->alphaToCoverageEnable)
rb_blend_cntl |= A6XX_RB_BLEND_CNTL_ALPHA_TO_COVERAGE;
@ -2478,7 +2518,8 @@ tu_pipeline_builder_parse_multisample_and_color_blend(
tu6_emit_sample_locations(&blend_cs, samp_loc);
}
tu6_emit_blend_control(&blend_cs, blend_enable_mask, msaa_info);
tu6_emit_blend_control(&blend_cs, blend_enable_mask,
builder->use_dual_src_blend, msaa_info);
pipeline->blend.state_ib = tu_cs_end_sub_stream(&pipeline->cs, &blend_cs);
}
@ -2592,6 +2633,11 @@ tu_pipeline_builder_init_graphics(
builder->color_attachment_formats[i] = pass->attachments[a].format;
builder->use_color_attachments = true;
}
if (tu_blend_state_is_dual_src(create_info->pColorBlendState)) {
builder->color_attachment_count++;
builder->use_dual_src_blend = true;
}
}
}