anv/cmd_buffer: Initalize the clear color struct for CNL+

On CNL+, the clear color struct is composed of RGBA channel values and
fields which are either reserved by the HW or used to control
fast-clears. Currently anv initializes the channel values to zero and
allows the other fields to be undefined.

Satisfy the MBZ field requirements by removing an optimization that
doesn't hold true for CNL+ and pulling in the number of dwords to
initialize from ISL.

Cc: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Nanley Chery 2018-10-24 14:50:32 -07:00 committed by Nanley Chery
parent 87173ded6e
commit b4198e792c

View file

@ -762,27 +762,21 @@ init_fast_clear_color(struct anv_cmd_buffer *cmd_buffer,
set_image_fast_clear_state(cmd_buffer, image, aspect, set_image_fast_clear_state(cmd_buffer, image, aspect,
ANV_FAST_CLEAR_NONE); ANV_FAST_CLEAR_NONE);
/* The fast clear value dword(s) will be copied into a surface state object. /* Initialize the struct fields that are accessed for fast-clears so that
* Ensure that the restrictions of the fields in the dword(s) are followed. * the HW restrictions on the field values are satisfied.
*
* CCS buffers on SKL+ can have any value set for the clear colors.
*/
if (image->samples == 1 && GEN_GEN >= 9)
return;
/* Other combinations of auxiliary buffers and platforms require specific
* values in the clear value dword(s).
*/ */
struct anv_address addr = struct anv_address addr =
anv_image_get_clear_color_addr(cmd_buffer->device, image, aspect); anv_image_get_clear_color_addr(cmd_buffer->device, image, aspect);
if (GEN_GEN >= 9) { if (GEN_GEN >= 9) {
for (unsigned i = 0; i < 4; i++) { const struct isl_device *isl_dev = &cmd_buffer->device->isl_dev;
const unsigned num_dwords = GEN_GEN >= 10 ?
isl_dev->ss.clear_color_state_size / 4 :
isl_dev->ss.clear_value_size / 4;
for (unsigned i = 0; i < num_dwords; i++) {
anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_DATA_IMM), sdi) { anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_DATA_IMM), sdi) {
sdi.Address = addr; sdi.Address = addr;
sdi.Address.offset += i * 4; sdi.Address.offset += i * 4;
/* MCS buffers on SKL+ can only have 1/0 clear colors. */
assert(image->samples > 1);
sdi.ImmediateData = 0; sdi.ImmediateData = 0;
} }
} }