broadcom/vc5: Add support for f32 render targets.

The TLB write code is getting ugly and needs a refactoring (that will
hopefully handle TLBU uniform coalescing as well).
This commit is contained in:
Eric Anholt
2017-10-02 17:21:23 -07:00
parent f2e6e1bbc3
commit 4b7de2a360
3 changed files with 38 additions and 13 deletions

View File

@@ -1109,28 +1109,47 @@ emit_frag_end(struct v3d_compile *c)
struct qreg b = color[2];
struct qreg a = color[3];
conf |= TLB_TYPE_F16_COLOR;
conf |= TLB_F16_SWAP_HI_LO;
if (num_components >= 3)
conf |= TLB_VEC_SIZE_4_F16;
else
conf |= TLB_VEC_SIZE_2_F16;
if (c->fs_key->f32_color_rb) {
conf |= TLB_TYPE_F32_COLOR;
conf |= ((num_components - 1) <<
TLB_VEC_SIZE_MINUS_1_SHIFT);
} else {
conf |= TLB_TYPE_F16_COLOR;
conf |= TLB_F16_SWAP_HI_LO;
if (num_components >= 3)
conf |= TLB_VEC_SIZE_4_F16;
else
conf |= TLB_VEC_SIZE_2_F16;
}
if (c->fs_key->swap_color_rb & (1 << rt)) {
r = color[2];
b = color[0];
}
inst = vir_VFPACK_dest(c, vir_reg(QFILE_TLB, 0), r, g);
if (conf != ~0) {
inst->dst.file = QFILE_TLBU;
if (c->fs_key->f32_color_rb & (1 << rt)) {
inst = vir_MOV_dest(c, vir_reg(QFILE_TLBU, 0), color[0]);
vir_set_cond(inst, discard_cond);
inst->src[vir_get_implicit_uniform_src(inst)] =
vir_uniform_ui(c, conf);
}
vir_set_cond(inst, discard_cond);
inst = vir_VFPACK_dest(c, vir_reg(QFILE_TLB, 0), b, a);
vir_set_cond(inst, discard_cond);
for (int i = 1; i < num_components; i++) {
inst = vir_MOV_dest(c, vir_reg(QFILE_TLB, 0),
color[i]);
vir_set_cond(inst, discard_cond);
}
} else {
inst = vir_VFPACK_dest(c, vir_reg(QFILE_TLB, 0), r, g);
if (conf != ~0) {
inst->dst.file = QFILE_TLBU;
inst->src[vir_get_implicit_uniform_src(inst)] =
vir_uniform_ui(c, conf);
}
vir_set_cond(inst, discard_cond);
inst = vir_VFPACK_dest(c, vir_reg(QFILE_TLB, 0), b, a);
vir_set_cond(inst, discard_cond);
}
break;
}
}

View File

@@ -320,6 +320,8 @@ struct v3d_fs_key {
bool clamp_color;
uint8_t nr_cbufs;
uint8_t swap_color_rb;
/* Mask of which render targets need to be written as 32-bit floats */
uint8_t f32_color_rb;
uint8_t alpha_test_func;
uint8_t logicop_func;
uint32_t point_sprite_mask;

View File

@@ -369,6 +369,10 @@ vc5_update_compiled_fs(struct vc5_context *vc5, uint8_t prim_mode)
if (desc->swizzle[0] == PIPE_SWIZZLE_Z)
key->swap_color_rb |= 1 << i;
if (desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT &&
desc->channel[0].size == 32) {
key->f32_color_rb |= 1 << i;
}
}
if (key->is_points) {