5151 * before using LRZ.
5252 */
5353
54+ template <chip CHIP>
5455static void
5556tu6_emit_lrz_buffer (struct tu_cs *cs, struct tu_image *depth_image)
5657{
@@ -59,6 +60,10 @@ tu6_emit_lrz_buffer(struct tu_cs *cs, struct tu_image *depth_image)
5960 A6XX_GRAS_LRZ_BUFFER_BASE (0 ),
6061 A6XX_GRAS_LRZ_BUFFER_PITCH (0 ),
6162 A6XX_GRAS_LRZ_FAST_CLEAR_BUFFER_BASE (0 ));
63+
64+ if (CHIP >= A7XX)
65+ tu_cs_emit_regs (cs, A7XX_GRAS_LRZ_DEPTH_BUFFER_INFO (0 ));
66+
6267 return ;
6368 }
6469
@@ -71,6 +76,10 @@ tu6_emit_lrz_buffer(struct tu_cs *cs, struct tu_image *depth_image)
7176 A6XX_GRAS_LRZ_BUFFER_BASE (.qword = lrz_iova),
7277 A6XX_GRAS_LRZ_BUFFER_PITCH (.pitch = depth_image->lrz_pitch ),
7378 A6XX_GRAS_LRZ_FAST_CLEAR_BUFFER_BASE (.qword = lrz_fc_iova));
79+
80+ if (CHIP >= A7XX)
81+ // TODO: Figure out the correct value to set here.
82+ tu_cs_emit_regs (cs, A7XX_GRAS_LRZ_DEPTH_BUFFER_INFO (0 ));
7483}
7584
7685static void
@@ -215,6 +224,7 @@ tu_lrz_begin_resumed_renderpass(struct tu_cmd_buffer *cmd)
215224 }
216225}
217226
227+ template <chip CHIP>
218228void
219229tu_lrz_begin_renderpass (struct tu_cmd_buffer *cmd)
220230{
@@ -238,7 +248,7 @@ tu_lrz_begin_renderpass(struct tu_cmd_buffer *cmd)
238248
239249 for (unsigned i = 0 ; i < pass->attachment_count ; i++) {
240250 struct tu_image *image = cmd->state .attachments [i]->image ;
241- tu_disable_lrz (cmd, &cmd->cs , image);
251+ tu_disable_lrz<CHIP> (cmd, &cmd->cs , image);
242252 }
243253
244254 /* We need a valid LRZ fast-clear base, in case the render pass contents
@@ -254,9 +264,10 @@ tu_lrz_begin_renderpass(struct tu_cmd_buffer *cmd)
254264 tu_lrz_begin_resumed_renderpass (cmd);
255265
256266 if (!cmd->state .lrz .valid ) {
257- tu6_emit_lrz_buffer (&cmd->cs , NULL );
267+ tu6_emit_lrz_buffer<CHIP> (&cmd->cs , NULL );
258268 }
259269}
270+ TU_GENX (tu_lrz_begin_renderpass);
260271
261272void
262273tu_lrz_begin_secondary_cmdbuf (struct tu_cmd_buffer *cmd)
@@ -269,6 +280,7 @@ tu_lrz_begin_secondary_cmdbuf(struct tu_cmd_buffer *cmd)
269280 }
270281}
271282
283+ template <chip CHIP>
272284void
273285tu_lrz_tiling_begin (struct tu_cmd_buffer *cmd, struct tu_cs *cs)
274286{
@@ -282,7 +294,7 @@ tu_lrz_tiling_begin(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
282294
283295 struct tu_lrz_state *lrz = &cmd->state .lrz ;
284296
285- tu6_emit_lrz_buffer (cs, lrz->image_view ->image );
297+ tu6_emit_lrz_buffer<CHIP> (cs, lrz->image_view ->image );
286298
287299 if (lrz->reuse_previous_state ) {
288300 /* Reuse previous LRZ state, LRZ cache is assumed to be
@@ -338,12 +350,14 @@ tu_lrz_tiling_begin(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
338350 }
339351 }
340352}
353+ TU_GENX (tu_lrz_tiling_begin);
341354
355+ template <chip CHIP>
342356void
343357tu_lrz_tiling_end (struct tu_cmd_buffer *cmd, struct tu_cs *cs)
344358{
345359 if (cmd->state .lrz .fast_clear || cmd->state .lrz .gpu_dir_tracking ) {
346- tu6_emit_lrz_buffer (cs, cmd->state .lrz .image_view ->image );
360+ tu6_emit_lrz_buffer<CHIP> (cs, cmd->state .lrz .image_view ->image );
347361
348362 if (cmd->state .lrz .gpu_dir_tracking ) {
349363 tu6_write_lrz_reg (cmd, &cmd->cs ,
@@ -373,7 +387,9 @@ tu_lrz_tiling_end(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
373387 * reason to do such clear.
374388 */
375389}
390+ TU_GENX (tu_lrz_tiling_end);
376391
392+ template <chip CHIP>
377393void
378394tu_lrz_sysmem_begin (struct tu_cmd_buffer *cmd, struct tu_cs *cs)
379395{
@@ -387,12 +403,12 @@ tu_lrz_sysmem_begin(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
387403 struct tu_lrz_state *lrz = &cmd->state .lrz ;
388404
389405 if (cmd->device ->physical_device ->info ->a6xx .has_lrz_dir_tracking ) {
390- tu_disable_lrz (cmd, cs, lrz->image_view ->image );
406+ tu_disable_lrz<CHIP> (cmd, cs, lrz->image_view ->image );
391407 /* Make sure depth view comparison will fail. */
392408 tu6_write_lrz_reg (cmd, cs,
393409 A6XX_GRAS_LRZ_DEPTH_VIEW (.dword = 0 ));
394410 } else {
395- tu6_emit_lrz_buffer (cs, lrz->image_view ->image );
411+ tu6_emit_lrz_buffer<CHIP> (cs, lrz->image_view ->image );
396412 /* Even though we disable LRZ writes in sysmem mode - there is still
397413 * LRZ test, so LRZ should be cleared.
398414 */
@@ -408,6 +424,7 @@ tu_lrz_sysmem_begin(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
408424 }
409425 }
410426}
427+ TU_GENX (tu_lrz_sysmem_begin);
411428
412429void
413430tu_lrz_sysmem_end (struct tu_cmd_buffer *cmd, struct tu_cs *cs)
@@ -416,6 +433,7 @@ tu_lrz_sysmem_end(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
416433}
417434
418435/* Disable LRZ outside of renderpass. */
436+ template <chip CHIP>
419437void
420438tu_disable_lrz (struct tu_cmd_buffer *cmd, struct tu_cs *cs,
421439 struct tu_image *image)
@@ -426,11 +444,13 @@ tu_disable_lrz(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
426444 if (!image->lrz_height )
427445 return ;
428446
429- tu6_emit_lrz_buffer (cs, image);
447+ tu6_emit_lrz_buffer<CHIP> (cs, image);
430448 tu6_disable_lrz_via_depth_view (cmd, cs);
431449}
450+ TU_GENX (tu_disable_lrz);
432451
433452/* Clear LRZ, used for out of renderpass depth clears. */
453+ template <chip CHIP>
434454void
435455tu_lrz_clear_depth_image (struct tu_cmd_buffer *cmd,
436456 struct tu_image *image,
@@ -460,7 +480,7 @@ tu_lrz_clear_depth_image(struct tu_cmd_buffer *cmd,
460480 bool fast_clear = image->lrz_fc_size && (pDepthStencil->depth == 0 .f ||
461481 pDepthStencil->depth == 1 .f );
462482
463- tu6_emit_lrz_buffer (&cmd->cs , image);
483+ tu6_emit_lrz_buffer<CHIP> (&cmd->cs , image);
464484
465485 tu6_write_lrz_reg (cmd, &cmd->cs , A6XX_GRAS_LRZ_DEPTH_VIEW (
466486 .base_layer = range->baseArrayLayer ,
@@ -481,6 +501,7 @@ tu_lrz_clear_depth_image(struct tu_cmd_buffer *cmd,
481501 tu6_clear_lrz<A6XX>(cmd, &cmd->cs , image, (const VkClearValue*) pDepthStencil);
482502 }
483503}
504+ TU_GENX (tu_lrz_clear_depth_image);
484505
485506void
486507tu_lrz_disable_during_renderpass (struct tu_cmd_buffer *cmd)
0 commit comments