etnaviv: blt: stop using etna_surface
Use pipe_surface to get the necessary information for the various clears. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Reviewed-by: Christian Gmeiner <cgmeiner@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35406>
This commit is contained in:
@@ -32,7 +32,6 @@
|
||||
#include "etnaviv_emit.h"
|
||||
#include "etnaviv_format.h"
|
||||
#include "etnaviv_resource.h"
|
||||
#include "etnaviv_surface.h"
|
||||
#include "etnaviv_translate.h"
|
||||
|
||||
#include "util/u_math.h"
|
||||
@@ -225,32 +224,32 @@ etna_blit_clear_color_blt(struct pipe_context *pctx, unsigned idx,
|
||||
const union pipe_color_union *color)
|
||||
{
|
||||
struct etna_context *ctx = etna_context(pctx);
|
||||
struct pipe_surface *dst = ctx->fb_cbufs[idx];
|
||||
struct etna_surface *surf = etna_surface(dst);
|
||||
uint64_t new_clear_value = etna_clear_blit_pack_rgba(surf->base.format, color);
|
||||
struct pipe_surface *dst = &ctx->framebuffer_s.cbufs[idx];
|
||||
struct etna_resource *dst_res = etna_resource_get_render_compatible(pctx, dst->texture);
|
||||
struct etna_resource_level *dst_level = &dst_res->levels[dst->level];
|
||||
uint64_t new_clear_value = etna_clear_blit_pack_rgba(dst->format, color);
|
||||
int msaa_xscale = 1, msaa_yscale = 1;
|
||||
|
||||
translate_samples_to_xyscale(surf->base.texture->nr_samples,
|
||||
translate_samples_to_xyscale(dst->texture->nr_samples,
|
||||
&msaa_xscale, &msaa_yscale);
|
||||
|
||||
struct etna_resource *res = etna_resource(surf->base.texture);
|
||||
struct blt_clear_op clr = {};
|
||||
clr.dest.addr.bo = res->bo;
|
||||
clr.dest.addr.offset = surf->level->offset + surf->base.first_layer * surf->level->layer_stride;
|
||||
clr.dest.addr.bo = dst_res->bo;
|
||||
clr.dest.addr.offset = dst_level->offset + dst->first_layer * dst_level->layer_stride;
|
||||
clr.dest.addr.flags = ETNA_RELOC_WRITE;
|
||||
clr.dest.bpp = util_format_get_blocksize(surf->base.format);
|
||||
clr.dest.stride = surf->level->stride;
|
||||
clr.dest.tiling = res->layout;
|
||||
clr.dest.bpp = util_format_get_blocksize(dst->format);
|
||||
clr.dest.stride = dst_level->stride;
|
||||
clr.dest.tiling = dst_res->layout;
|
||||
|
||||
if (surf->level->ts_size) {
|
||||
if (dst_level->ts_size) {
|
||||
clr.dest.use_ts = 1;
|
||||
clr.dest.ts_addr.bo = res->ts_bo;
|
||||
clr.dest.ts_addr.offset = surf->level->ts_offset;
|
||||
clr.dest.ts_addr.bo = dst_res->ts_bo;
|
||||
clr.dest.ts_addr.offset = dst_level->ts_offset;
|
||||
clr.dest.ts_addr.flags = ETNA_RELOC_WRITE;
|
||||
clr.dest.ts_clear_value[0] = new_clear_value;
|
||||
clr.dest.ts_clear_value[1] = new_clear_value >> 32;
|
||||
clr.dest.ts_mode = surf->level->ts_mode;
|
||||
clr.dest.ts_compress_fmt = surf->level->ts_compress_fmt;
|
||||
clr.dest.ts_mode = dst_level->ts_mode;
|
||||
clr.dest.ts_compress_fmt = dst_level->ts_compress_fmt;
|
||||
}
|
||||
|
||||
clr.clear_value[0] = new_clear_value;
|
||||
@@ -259,13 +258,13 @@ etna_blit_clear_color_blt(struct pipe_context *pctx, unsigned idx,
|
||||
clr.clear_bits[1] = 0xffffffff;
|
||||
clr.rect_x = 0; /* What about scissors? */
|
||||
clr.rect_y = 0;
|
||||
clr.rect_w = surf->level->width * msaa_xscale;
|
||||
clr.rect_h = surf->level->height * msaa_yscale;
|
||||
clr.rect_w = dst_level->width * msaa_xscale;
|
||||
clr.rect_h = dst_level->height * msaa_yscale;
|
||||
|
||||
emit_blt_clearimage(ctx->stream, &clr);
|
||||
|
||||
/* This made the TS valid */
|
||||
if (surf->level->ts_size) {
|
||||
if (dst_level->ts_size) {
|
||||
if (idx == 0) {
|
||||
ctx->framebuffer.TS_COLOR_CLEAR_VALUE = new_clear_value;
|
||||
ctx->framebuffer.TS_COLOR_CLEAR_VALUE_EXT = new_clear_value >> 32;
|
||||
@@ -275,18 +274,18 @@ etna_blit_clear_color_blt(struct pipe_context *pctx, unsigned idx,
|
||||
}
|
||||
|
||||
/* update clear color in SW meta area of the buffer if TS is exported */
|
||||
if (unlikely(new_clear_value != surf->level->clear_value &&
|
||||
if (unlikely(new_clear_value != dst_level->clear_value &&
|
||||
etna_resource_ext_ts(etna_resource(dst->texture))))
|
||||
surf->level->ts_meta->v0.clear_value = new_clear_value;
|
||||
dst_level->ts_meta->v0.clear_value = new_clear_value;
|
||||
|
||||
etna_resource_level_ts_mark_valid(surf->level);
|
||||
etna_resource_level_mark_unflushed(surf->level);
|
||||
etna_resource_level_ts_mark_valid(dst_level);
|
||||
etna_resource_level_mark_unflushed(dst_level);
|
||||
ctx->dirty |= ETNA_DIRTY_TS | ETNA_DIRTY_DERIVE_TS;
|
||||
}
|
||||
|
||||
surf->level->clear_value = new_clear_value;
|
||||
resource_written(ctx, surf->base.texture);
|
||||
etna_resource_level_mark_changed(surf->level);
|
||||
dst_level->clear_value = new_clear_value;
|
||||
resource_written(ctx, &dst_res->base);
|
||||
etna_resource_level_mark_changed(dst_level);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -294,16 +293,17 @@ etna_blit_clear_zs_blt(struct pipe_context *pctx, struct pipe_surface *dst,
|
||||
unsigned buffers, double depth, unsigned stencil)
|
||||
{
|
||||
struct etna_context *ctx = etna_context(pctx);
|
||||
struct etna_surface *surf = etna_surface(dst);
|
||||
uint32_t new_clear_value = translate_clear_depth_stencil(surf->base.format, depth, stencil);
|
||||
struct etna_resource *dst_res = etna_resource_get_render_compatible(pctx, dst->texture);
|
||||
struct etna_resource_level *dst_level = &dst_res->levels[dst->level];
|
||||
uint32_t new_clear_value = translate_clear_depth_stencil(dst->format, depth, stencil);
|
||||
uint32_t new_clear_bits = 0, clear_bits_depth, clear_bits_stencil;
|
||||
int msaa_xscale = 1, msaa_yscale = 1;
|
||||
|
||||
translate_samples_to_xyscale(surf->base.texture->nr_samples,
|
||||
translate_samples_to_xyscale(dst->texture->nr_samples,
|
||||
&msaa_xscale, &msaa_yscale);
|
||||
|
||||
/* Get the channels to clear */
|
||||
switch (surf->base.format) {
|
||||
switch (dst->format) {
|
||||
case PIPE_FORMAT_Z16_UNORM:
|
||||
case PIPE_FORMAT_X8Z24_UNORM:
|
||||
clear_bits_depth = 0xffffffff;
|
||||
@@ -325,27 +325,26 @@ etna_blit_clear_zs_blt(struct pipe_context *pctx, struct pipe_surface *dst,
|
||||
|
||||
/* if all bits are cleared, update TS clear value */
|
||||
if (new_clear_bits == 0xffffffff)
|
||||
surf->level->clear_value = new_clear_value;
|
||||
dst_level->clear_value = new_clear_value;
|
||||
|
||||
/* TODO unduplicate this */
|
||||
struct etna_resource *res = etna_resource(surf->base.texture);
|
||||
struct blt_clear_op clr = {};
|
||||
clr.dest.addr.bo = res->bo;
|
||||
clr.dest.addr.offset = surf->level->offset + surf->base.first_layer * surf->level->layer_stride;
|
||||
clr.dest.addr.bo = dst_res->bo;
|
||||
clr.dest.addr.offset = dst_level->offset + dst->first_layer * dst_level->layer_stride;
|
||||
clr.dest.addr.flags = ETNA_RELOC_WRITE;
|
||||
clr.dest.bpp = util_format_get_blocksize(surf->base.format);
|
||||
clr.dest.stride = surf->level->stride;
|
||||
clr.dest.tiling = res->layout;
|
||||
clr.dest.bpp = util_format_get_blocksize(dst->format);
|
||||
clr.dest.stride = dst_level->stride;
|
||||
clr.dest.tiling = dst_res->layout;
|
||||
|
||||
if (surf->level->ts_size) {
|
||||
if (dst_level->ts_size) {
|
||||
clr.dest.use_ts = 1;
|
||||
clr.dest.ts_addr.bo = res->ts_bo;
|
||||
clr.dest.ts_addr.offset = surf->level->ts_offset;
|
||||
clr.dest.ts_addr.bo = dst_res->ts_bo;
|
||||
clr.dest.ts_addr.offset = dst_level->ts_offset;
|
||||
clr.dest.ts_addr.flags = ETNA_RELOC_WRITE;
|
||||
clr.dest.ts_clear_value[0] = surf->level->clear_value;
|
||||
clr.dest.ts_clear_value[1] = surf->level->clear_value;
|
||||
clr.dest.ts_mode = surf->level->ts_mode;
|
||||
clr.dest.ts_compress_fmt = surf->level->ts_compress_fmt;
|
||||
clr.dest.ts_clear_value[0] = dst_level->clear_value;
|
||||
clr.dest.ts_clear_value[1] = dst_level->clear_value;
|
||||
clr.dest.ts_mode = dst_level->ts_mode;
|
||||
clr.dest.ts_compress_fmt = dst_level->ts_compress_fmt;
|
||||
}
|
||||
|
||||
clr.clear_value[0] = new_clear_value;
|
||||
@@ -354,21 +353,21 @@ etna_blit_clear_zs_blt(struct pipe_context *pctx, struct pipe_surface *dst,
|
||||
clr.clear_bits[1] = new_clear_bits;
|
||||
clr.rect_x = 0; /* What about scissors? */
|
||||
clr.rect_y = 0;
|
||||
clr.rect_w = surf->level->width * msaa_xscale;
|
||||
clr.rect_h = surf->level->height * msaa_yscale;
|
||||
clr.rect_w = dst_level->width * msaa_xscale;
|
||||
clr.rect_h = dst_level->height * msaa_yscale;
|
||||
|
||||
emit_blt_clearimage(ctx->stream, &clr);
|
||||
|
||||
/* This made the TS valid */
|
||||
if (surf->level->ts_size) {
|
||||
ctx->framebuffer.TS_DEPTH_CLEAR_VALUE = surf->level->clear_value;
|
||||
etna_resource_level_ts_mark_valid(surf->level);
|
||||
etna_resource_level_mark_unflushed(surf->level);
|
||||
if (dst_level->ts_size) {
|
||||
ctx->framebuffer.TS_DEPTH_CLEAR_VALUE = dst_level->clear_value;
|
||||
etna_resource_level_ts_mark_valid(dst_level);
|
||||
etna_resource_level_mark_unflushed(dst_level);
|
||||
ctx->dirty |= ETNA_DIRTY_TS | ETNA_DIRTY_DERIVE_TS;
|
||||
}
|
||||
|
||||
resource_written(ctx, surf->base.texture);
|
||||
etna_resource_level_mark_changed(surf->level);
|
||||
resource_written(ctx, &dst_res->base);
|
||||
etna_resource_level_mark_changed(dst_level);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -385,20 +384,20 @@ etna_clear_blt(struct pipe_context *pctx, unsigned buffers, const struct pipe_sc
|
||||
|
||||
if (buffers & PIPE_CLEAR_COLOR) {
|
||||
for (int idx = 0; idx < ctx->framebuffer_s.nr_cbufs; ++idx) {
|
||||
struct etna_surface *surf = etna_surface(ctx->fb_cbufs[idx]);
|
||||
struct pipe_surface *psurf = &ctx->framebuffer_s.cbufs[idx];
|
||||
|
||||
if (!surf)
|
||||
if (!psurf->texture)
|
||||
continue;
|
||||
|
||||
etna_blit_clear_color_blt(pctx, idx, color);
|
||||
|
||||
if (!etna_resource(surf->prsc)->explicit_flush)
|
||||
etna_context_add_flush_resource(ctx, surf->prsc);
|
||||
if (!etna_resource(psurf->texture)->explicit_flush)
|
||||
etna_context_add_flush_resource(ctx, psurf->texture);
|
||||
}
|
||||
}
|
||||
|
||||
if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && ctx->framebuffer_s.zsbuf.texture != NULL)
|
||||
etna_blit_clear_zs_blt(pctx, ctx->fb_zsbuf, buffers, depth, stencil);
|
||||
etna_blit_clear_zs_blt(pctx, &ctx->framebuffer_s.zsbuf, buffers, depth, stencil);
|
||||
|
||||
etna_stall(ctx->stream, SYNC_RECIPIENT_RA, SYNC_RECIPIENT_BLT);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user