radeonsi: simplify si_num_banks function
authorMarek Olšák <marek.olsak@amd.com>
Sun, 17 Aug 2014 23:09:31 +0000 (01:09 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 19 Aug 2014 10:20:18 +0000 (12:20 +0200)
This makes it easier to use.

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/radeonsi/si_dma.c
src/gallium/drivers/radeonsi/si_state.c
src/gallium/drivers/radeonsi/si_state.h

index e90874624ed761b1df494a8c45b845091e28c9ee..a69f533c743873c07e7095c6a7f77108539e1a77 100644 (file)
@@ -173,8 +173,7 @@ static void si_dma_copy_tile(struct si_context *ctx,
                tile_split = cik_tile_split(rsrc->surface.tile_split);
                tile_mode_index = si_tile_mode_index(rsrc, src_level,
                                                     util_format_has_stencil(util_format_description(src->format)));
-               nbanks = si_num_banks(sscreen, rsrc->surface.bpe, rsrc->surface.tile_split,
-                                     tile_mode_index);
+               nbanks = si_num_banks(sscreen, rsrc);
                base += rsrc->resource.gpu_address;
                addr += rdst->resource.gpu_address;
        } else {
@@ -202,8 +201,7 @@ static void si_dma_copy_tile(struct si_context *ctx,
                tile_split = cik_tile_split(rdst->surface.tile_split);
                tile_mode_index = si_tile_mode_index(rdst, dst_level,
                                                     util_format_has_stencil(util_format_description(dst->format)));
-               nbanks = si_num_banks(sscreen, rdst->surface.bpe, rdst->surface.tile_split,
-                                     tile_mode_index);
+               nbanks = si_num_banks(sscreen, rdst);
                base += rdst->resource.gpu_address;
                addr += rsrc->resource.gpu_address;
        }
index fc928f3fc26b68b5a5874e25ae82fb6b7360b5c1..4ab2b8bf5b6f6c680331bbbe3f000a37fa113851 100644 (file)
@@ -47,15 +47,14 @@ static void si_init_atom(struct r600_atom *atom, struct r600_atom **list_elem,
        *list_elem = atom;
 }
 
-uint32_t si_num_banks(struct si_screen *sscreen, unsigned bpe, unsigned tile_split,
-                     unsigned tile_mode_index)
+uint32_t si_num_banks(struct si_screen *sscreen, struct r600_texture *tex)
 {
-       if ((sscreen->b.chip_class == CIK) &&
+       if (sscreen->b.chip_class == CIK &&
            sscreen->b.info.cik_macrotile_mode_array_valid) {
                unsigned index, tileb;
 
-               tileb = 8 * 8 * bpe;
-               tileb = MIN2(tile_split, tileb);
+               tileb = 8 * 8 * tex->surface.bpe;
+               tileb = MIN2(tex->surface.tile_split, tileb);
 
                for (index = 0; tileb > 64; index++) {
                        tileb >>= 1;
@@ -65,11 +64,14 @@ uint32_t si_num_banks(struct si_screen *sscreen, unsigned bpe, unsigned tile_spl
                return (sscreen->b.info.cik_macrotile_mode_array[index] >> 6) & 0x3;
        }
 
-       if ((sscreen->b.chip_class == SI) &&
+       if (sscreen->b.chip_class == SI &&
            sscreen->b.info.si_tile_mode_array_valid) {
+               /* Don't use stencil_tiling_index, because num_banks is always
+                * read from the depth mode. */
+               unsigned tile_mode_index = tex->surface.tiling_index[0];
                assert(tile_mode_index < 32);
 
-               return (sscreen->b.info.si_tile_mode_array[tile_mode_index] >> 20) & 0x3;
+               return G_009910_NUM_BANKS(sscreen->b.info.si_tile_mode_array[tile_mode_index]);
        }
 
        /* The old way. */
@@ -1820,8 +1822,7 @@ static void si_init_depth_surface(struct si_context *sctx,
                macro_aspect = cik_macro_tile_aspect(macro_aspect);
                bankw = cik_bank_wh(bankw);
                bankh = cik_bank_wh(bankh);
-               nbanks = si_num_banks(sscreen, rtex->surface.bpe, rtex->surface.tile_split,
-                                     ~0);
+               nbanks = si_num_banks(sscreen, rtex);
                tile_mode_index = si_tile_mode_index(rtex, level, false);
                pipe_config = cik_db_pipe_config(sscreen, tile_mode_index);
 
index ce18a27daed9a1072ffd6467351c66748dc3783f..7362ad129c985a69f007f5043939560dd75f6250 100644 (file)
@@ -263,8 +263,7 @@ unsigned cik_bank_wh(unsigned bankwh);
 unsigned cik_db_pipe_config(struct si_screen *sscreen, unsigned tile_mode);
 unsigned cik_macro_tile_aspect(unsigned macro_tile_aspect);
 unsigned cik_tile_split(unsigned tile_split);
-uint32_t si_num_banks(struct si_screen *sscreen, unsigned bpe, unsigned tile_split,
-                     unsigned tile_mode_index);
+uint32_t si_num_banks(struct si_screen *sscreen, struct r600_texture *tex);
 unsigned si_tile_mode_index(struct r600_texture *rtex, unsigned level, bool stencil);
 
 /* si_state_draw.c */