intel/fs: Set src0 alpha present bit in header when provided in message payload.
Currently the "Source0 Alpha Present to RenderTarget" bit of the RT write message header is derived from brw_wm_prog_data::replicate_alpha. However the src0_alpha payload is provided anytime it's specified to the logical message. This could theoretically lead to an inconsistency if somebody provided a src0_alpha value while brw_wm_prog_data::replicate_alpha was false, as I'm planning to do in a future commit in order to implement a hardware workaround. Instead calculate the header bit based on whether a src0_alpha value was provided to the logical message, which guarantees the same behavior on pre-ICL and ICL+ (the latter used an extended descriptor bit for this which didn't suffer from the same issue). Remove the brw_wm_prog_data::replicate_alpha flag. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -751,7 +751,6 @@ struct brw_wm_prog_data {
|
||||
bool dispatch_16;
|
||||
bool dispatch_32;
|
||||
bool dual_src_blend;
|
||||
bool replicate_alpha;
|
||||
bool persample_dispatch;
|
||||
bool uses_pos_offset;
|
||||
bool uses_omask;
|
||||
|
@@ -4340,6 +4340,8 @@ lower_fb_write_logical_send(const fs_builder &bld, fs_inst *inst,
|
||||
const unsigned components =
|
||||
inst->src[FB_WRITE_LOGICAL_SRC_COMPONENTS].ud;
|
||||
|
||||
assert(inst->target != 0 || src0_alpha.file == BAD_FILE);
|
||||
|
||||
/* We can potentially have a message length of up to 15, so we have to set
|
||||
* base_mrf to either 0 or 1 in order to fit in m0..m15.
|
||||
*/
|
||||
@@ -4404,7 +4406,7 @@ lower_fb_write_logical_send(const fs_builder &bld, fs_inst *inst,
|
||||
/* Set "Source0 Alpha Present to RenderTarget" bit in message
|
||||
* header.
|
||||
*/
|
||||
if (inst->target > 0 && prog_data->replicate_alpha)
|
||||
if (src0_alpha.file != BAD_FILE)
|
||||
g00_bits |= 1 << 11;
|
||||
|
||||
/* Set computes stencil to render target */
|
||||
@@ -4448,8 +4450,6 @@ lower_fb_write_logical_send(const fs_builder &bld, fs_inst *inst,
|
||||
length++;
|
||||
}
|
||||
|
||||
bool src0_alpha_present = false;
|
||||
|
||||
if (src0_alpha.file != BAD_FILE) {
|
||||
for (unsigned i = 0; i < bld.dispatch_width() / 8; i++) {
|
||||
const fs_builder &ubld = bld.exec_all().group(8, i)
|
||||
@@ -4459,14 +4459,6 @@ lower_fb_write_logical_send(const fs_builder &bld, fs_inst *inst,
|
||||
setup_color_payload(ubld, key, &sources[length], tmp, 1);
|
||||
length++;
|
||||
}
|
||||
src0_alpha_present = true;
|
||||
} else if (prog_data->replicate_alpha && inst->target != 0) {
|
||||
/* Handle the case when fragment shader doesn't write to draw buffer
|
||||
* zero. No need to call setup_color_payload() for src0_alpha because
|
||||
* alpha value will be undefined.
|
||||
*/
|
||||
length += bld.dispatch_width() / 8;
|
||||
src0_alpha_present = true;
|
||||
}
|
||||
|
||||
if (sample_mask.file != BAD_FILE) {
|
||||
@@ -4548,7 +4540,7 @@ lower_fb_write_logical_send(const fs_builder &bld, fs_inst *inst,
|
||||
/* Set the "Render Target Index" and "Src0 Alpha Present" fields
|
||||
* in the extended message descriptor, in lieu of using a header.
|
||||
*/
|
||||
ex_desc = inst->target << 12 | src0_alpha_present << 15;
|
||||
ex_desc = inst->target << 12 | (src0_alpha.file != BAD_FILE) << 15;
|
||||
|
||||
if (key->nr_color_regions == 0)
|
||||
ex_desc |= 1 << 20; /* Null Render Target */
|
||||
|
@@ -493,7 +493,7 @@ fs_visitor::emit_fb_writes()
|
||||
* so we compute if we need replicate alpha and emit alpha to coverage
|
||||
* workaround here.
|
||||
*/
|
||||
prog_data->replicate_alpha = key->alpha_test_replicate_alpha ||
|
||||
const bool replicate_alpha = key->alpha_test_replicate_alpha ||
|
||||
(key->nr_color_regions > 1 && key->alpha_to_coverage &&
|
||||
(sample_mask.file == BAD_FILE || devinfo->gen == 6));
|
||||
|
||||
@@ -506,7 +506,7 @@ fs_visitor::emit_fb_writes()
|
||||
ralloc_asprintf(this->mem_ctx, "FB write target %d", target));
|
||||
|
||||
fs_reg src0_alpha;
|
||||
if (devinfo->gen >= 6 && prog_data->replicate_alpha && target != 0)
|
||||
if (devinfo->gen >= 6 && replicate_alpha && target != 0)
|
||||
src0_alpha = offset(outputs[0], bld, 3);
|
||||
|
||||
inst = emit_single_fb_write(abld, this->outputs[target],
|
||||
|
Reference in New Issue
Block a user