etnaviv: add tile size helper
On older GPUs a color tile was always 64 Byte. On new GPUs with CACHE128B256BPERLINE support the tile size is either 128 Byte or 256 Byte depending on the TS mode. Add a helper to return the color tile size and use in in places that use hard-coded tile size values or do their own calculation. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9255>
This commit is contained in:
@@ -450,7 +450,8 @@ etna_try_blt_blit(struct pipe_context *pctx,
|
||||
op.ts_clear_value[0] = src_lev->clear_value;
|
||||
op.ts_clear_value[1] = src_lev->clear_value;
|
||||
op.ts_mode = src_lev->ts_mode;
|
||||
op.num_tiles = DIV_ROUND_UP(src_lev->size, src_lev->ts_mode ? 256 : 128);
|
||||
op.num_tiles = DIV_ROUND_UP(src_lev->size,
|
||||
etna_screen_get_tile_size(ctx->screen, src_lev->ts_mode));
|
||||
op.bpp = util_format_get_blocksize(src->base.format);
|
||||
|
||||
etna_set_state(ctx->stream, VIVS_GL_FLUSH_CACHE, 0x00000c23);
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "hw/common.xml.h"
|
||||
#include "hw/common_3d.xml.h"
|
||||
#include "hw/state.xml.h"
|
||||
#include "hw/state_3d.xml.h"
|
||||
|
||||
|
||||
@@ -85,7 +85,6 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen,
|
||||
{
|
||||
struct etna_screen *screen = etna_screen(pscreen);
|
||||
size_t rt_ts_size, ts_layer_stride;
|
||||
size_t bytes_per_tile;
|
||||
uint8_t ts_mode = TS_MODE_128B;
|
||||
int8_t ts_compress_fmt;
|
||||
|
||||
@@ -98,20 +97,15 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen,
|
||||
ts_compress_fmt = (screen->specs.v4_compression || rsc->base.nr_samples > 1) ?
|
||||
translate_ts_format(rsc->base.format) : -1;
|
||||
|
||||
if (VIV_FEATURE(screen, chipMinorFeatures6, CACHE128B256BPERLINE)) {
|
||||
/* enable 256B ts mode with compression, as it improves performance
|
||||
* the size of the resource might also determine if we want to use it or not
|
||||
*/
|
||||
if (ts_compress_fmt >= 0)
|
||||
/* enable 256B ts mode with compression, as it improves performance
|
||||
* the size of the resource might also determine if we want to use it or not
|
||||
*/
|
||||
if (VIV_FEATURE(screen, chipMinorFeatures6, CACHE128B256BPERLINE) &&
|
||||
ts_compress_fmt >= 0)
|
||||
ts_mode = TS_MODE_256B;
|
||||
|
||||
bytes_per_tile = ts_mode == TS_MODE_256B ? 256 : 128;
|
||||
} else {
|
||||
bytes_per_tile = 64;
|
||||
}
|
||||
|
||||
ts_layer_stride = align(DIV_ROUND_UP(rsc->levels[0].layer_stride,
|
||||
bytes_per_tile *
|
||||
etna_screen_get_tile_size(screen, ts_mode) *
|
||||
8 / screen->specs.bits_per_tile),
|
||||
0x100 * screen->specs.pixel_pipes);
|
||||
rt_ts_size = ts_layer_stride * rsc->base.array_size;
|
||||
|
||||
@@ -789,7 +789,8 @@ etna_try_rs_blit(struct pipe_context *pctx,
|
||||
.clear_mode = VIVS_RS_CLEAR_CONTROL_MODE_DISABLED,
|
||||
.width = width,
|
||||
.height = height,
|
||||
.tile_count = src_lev->layer_stride / 64
|
||||
.tile_count = src_lev->layer_stride /
|
||||
etna_screen_get_tile_size(ctx->screen, src_lev->ts_mode),
|
||||
});
|
||||
|
||||
etna_submit_rs_state(ctx, ©_to_screen);
|
||||
|
||||
@@ -109,4 +109,16 @@ struct pipe_screen *
|
||||
etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
|
||||
struct renderonly *ro);
|
||||
|
||||
static inline size_t
|
||||
etna_screen_get_tile_size(struct etna_screen *screen, uint8_t ts_mode)
|
||||
{
|
||||
if (!VIV_FEATURE(screen, chipMinorFeatures6, CACHE128B256BPERLINE))
|
||||
return 64;
|
||||
|
||||
if (ts_mode == TS_MODE_256B)
|
||||
return 256;
|
||||
else
|
||||
return 128;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user