diff --git a/src/imagination/vulkan/pds/pvr_pds.c b/src/imagination/vulkan/pds/pvr_pds.c index eefccdaa69b..0906d995f30 100644 --- a/src/imagination/vulkan/pds/pvr_pds.c +++ b/src/imagination/vulkan/pds/pvr_pds.c @@ -4156,6 +4156,11 @@ uint32_t *pvr_pds_coefficient_loading( else program->dout_src_offsets[iterator] = ~0u; + if (program->z_iterator == ~0u) + program->dout_z_iterator_offset = ~0u; + else if (program->z_iterator == iterator) + program->dout_z_iterator_offset = constant; + /* Write the first iterator. */ iterator_word = (uint64_t)program->FPU_iterators[iterator] diff --git a/src/imagination/vulkan/pds/pvr_pds.h b/src/imagination/vulkan/pds/pvr_pds.h index ccfa1cd68ce..63827c92bca 100644 --- a/src/imagination/vulkan/pds/pvr_pds.h +++ b/src/imagination/vulkan/pds/pvr_pds.h @@ -272,6 +272,9 @@ struct pvr_pds_coeff_loading_program { BITSET_DECLARE(flat_iter_mask, PVR_MAXIMUM_ITERATIONS); uint32_t dout_src_offsets[PVR_MAXIMUM_ITERATIONS]; + uint32_t z_iterator; + uint32_t dout_z_iterator_offset; + uint32_t data_size; uint32_t code_size; diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index 3dd78bd7c04..f055fc36347 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -5132,6 +5132,19 @@ setup_pds_coeff_program(struct pvr_cmd_buffer *const cmd_buffer, &douti_src); } + if (program->dout_z_iterator_offset != ~0u) { + struct ROGUE_PDSINST_DOUT_FIELDS_DOUTI_SRC douti_src; + ROGUE_PDSINST_DOUT_FIELDS_DOUTI_SRC_unpack( + &pds_coeff_program_buffer[program->dout_z_iterator_offset], + &douti_src); + + douti_src.depthbias = dynamic_state->rs.depth_bias.enable; + + ROGUE_PDSINST_DOUT_FIELDS_DOUTI_SRC_pack( + &pds_coeff_program_buffer[program->dout_z_iterator_offset], + &douti_src); + } + /* FIXME: Figure out the define for alignment of 16. */ return pvr_cmd_buffer_upload_pds( cmd_buffer, diff --git a/src/imagination/vulkan/pvr_pipeline.c b/src/imagination/vulkan/pvr_pipeline.c index b6e59de2e16..06399a29a27 100644 --- a/src/imagination/vulkan/pvr_pipeline.c +++ b/src/imagination/vulkan/pvr_pipeline.c @@ -1424,7 +1424,10 @@ static void pvr_graphics_pipeline_setup_fragment_coeff_program( douti_src.size = ROGUE_PDSINST_DOUTI_SIZE_1D; } + frag_coeff_program->z_iterator = fpu; frag_coeff_program->destination[fpu++] = dest++; + } else { + frag_coeff_program->z_iterator = ~0u; } if (fs_data->uses.w) {