freedreno/gmem: make noscis debug actually do something on a6xx
[mesa.git] / src / gallium / drivers / freedreno / freedreno_gmem.c
index bbffda66e470792afe28b07391e0d40c0d5579b4..4c694df1c63130aa56b9fe0e4534d1c1603c5e31 100644 (file)
@@ -169,7 +169,7 @@ static uint32_t bin_width(struct fd_screen *screen)
 static unsigned
 div_align(unsigned num, unsigned denom, unsigned al)
 {
-       return align(DIV_ROUND_UP(num, denom), al);
+       return util_align_npot(DIV_ROUND_UP(num, denom), al);
 }
 
 static bool
@@ -184,8 +184,8 @@ layout_gmem(struct gmem_key *key, uint32_t nbins_x, uint32_t nbins_y,
                return false;
 
        uint32_t bin_w, bin_h;
-       bin_w = div_align(key->width, nbins_x, screen->gmem_alignw);
-       bin_h = div_align(key->height, nbins_y, screen->gmem_alignh);
+       bin_w = div_align(key->width, nbins_x, screen->tile_alignw);
+       bin_h = div_align(key->height, nbins_y, screen->tile_alignh);
 
        gmem->bin_w = bin_w;
        gmem->bin_h = bin_h;
@@ -198,18 +198,18 @@ layout_gmem(struct gmem_key *key, uint32_t nbins_x, uint32_t nbins_y,
 
        for (i = 0; i < MAX_RENDER_TARGETS; i++) {
                if (key->cbuf_cpp[i]) {
-                       gmem->cbuf_base[i] = align(total, gmem_align);
+                       gmem->cbuf_base[i] = util_align_npot(total, gmem_align);
                        total = gmem->cbuf_base[i] + key->cbuf_cpp[i] * bin_w * bin_h;
                }
        }
 
        if (key->zsbuf_cpp[0]) {
-               gmem->zsbuf_base[0] = align(total, gmem_align);
+               gmem->zsbuf_base[0] = util_align_npot(total, gmem_align);
                total = gmem->zsbuf_base[0] + key->zsbuf_cpp[0] * bin_w * bin_h;
        }
 
        if (key->zsbuf_cpp[1]) {
-               gmem->zsbuf_base[1] = align(total, gmem_align);
+               gmem->zsbuf_base[1] = util_align_npot(total, gmem_align);
                total = gmem->zsbuf_base[1] + key->zsbuf_cpp[1] * bin_w * bin_h;
        }
 
@@ -244,7 +244,7 @@ gmem_stateobj_init(struct fd_screen *screen, struct gmem_key *key)
        /* first, find a bin width that satisfies the maximum width
         * restrictions:
         */
-       while (div_align(key->width, nbins_x, screen->gmem_alignw) > max_width) {
+       while (div_align(key->width, nbins_x, screen->tile_alignw) > max_width) {
                nbins_x++;
        }
 
@@ -463,7 +463,7 @@ gmem_key_init(struct fd_batch *batch, bool assume_zs, bool no_scis_opt)
        /* NOTE: on a6xx, the max-scissor-rect is handled in fd6_gmem, and
         * we just rely on CP_COND_EXEC to skip bins with no geometry.
         */
-       if ((fd_mesa_debug & FD_DBG_NOSCIS) || no_scis_opt || is_a6xx(screen)) {
+       if (no_scis_opt || is_a6xx(screen)) {
                key->minx = 0;
                key->miny = 0;
                key->width = pfb->width;
@@ -471,6 +471,13 @@ gmem_key_init(struct fd_batch *batch, bool assume_zs, bool no_scis_opt)
        } else {
                struct pipe_scissor_state *scissor = &batch->max_scissor;
 
+               if (fd_mesa_debug & FD_DBG_NOSCIS) {
+                       scissor->minx = 0;
+                       scissor->miny = 0;
+                       scissor->maxx = pfb->width;
+                       scissor->maxy = pfb->height;
+               }
+
                /* round down to multiple of alignment: */
                key->minx = scissor->minx & ~(screen->gmem_alignw - 1);
                key->miny = scissor->miny & ~(screen->gmem_alignh - 1);
@@ -484,7 +491,7 @@ gmem_key_init(struct fd_batch *batch, bool assume_zs, bool no_scis_opt)
                 */
                key->gmem_page_align = 8;
        } else if (is_a6xx(screen)) {
-               key->gmem_page_align = 1;
+               key->gmem_page_align = is_a650(screen) ? 3 : 1;
        } else {
                // TODO re-check this across gens.. maybe it should only
                // be a single page in some cases: