gallium/radeon: add separate stencil level dirty flags
We will only do depth-only or stencil-only decompress blits, whichever is needed by textures, instead of always doing both. Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
This commit is contained in:
parent
cc92b90375
commit
5804c6adf8
|
@ -3375,11 +3375,11 @@ static void evergreen_dma_copy(struct pipe_context *ctx,
|
|||
}
|
||||
|
||||
if (src->format != dst->format || src_box->depth > 1 ||
|
||||
rdst->dirty_level_mask != 0) {
|
||||
(rdst->dirty_level_mask | rdst->stencil_dirty_level_mask) & (1 << dst_level)) {
|
||||
goto fallback;
|
||||
}
|
||||
|
||||
if (rsrc->dirty_level_mask) {
|
||||
if (rsrc->dirty_level_mask & (1 << src_level)) {
|
||||
ctx->flush_resource(ctx, src);
|
||||
}
|
||||
|
||||
|
|
|
@ -1779,6 +1779,9 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
|
|||
struct r600_texture *rtex = (struct r600_texture *)surf->texture;
|
||||
|
||||
rtex->dirty_level_mask |= 1 << surf->u.tex.level;
|
||||
|
||||
if (rtex->surface.flags & RADEON_SURF_SBUFFER)
|
||||
rtex->stencil_dirty_level_mask |= 1 << surf->u.tex.level;
|
||||
}
|
||||
if (rctx->framebuffer.compressed_cb_mask) {
|
||||
struct pipe_surface *surf;
|
||||
|
|
|
@ -205,6 +205,7 @@ struct r600_texture {
|
|||
unsigned pitch_override;
|
||||
bool is_depth;
|
||||
unsigned dirty_level_mask; /* each bit says if that mipmap is compressed */
|
||||
unsigned stencil_dirty_level_mask; /* each bit says if that mipmap is compressed */
|
||||
struct r600_texture *flushed_depth_texture;
|
||||
boolean is_flushing_texture;
|
||||
struct radeon_surf surface;
|
||||
|
|
|
@ -242,7 +242,7 @@ void cik_sdma_copy(struct pipe_context *ctx,
|
|||
|
||||
if (src->format != dst->format ||
|
||||
rdst->surface.nsamples > 1 || rsrc->surface.nsamples > 1 ||
|
||||
rdst->dirty_level_mask & (1 << dst_level)) {
|
||||
(rdst->dirty_level_mask | rdst->stencil_dirty_level_mask) & (1 << dst_level)) {
|
||||
goto fallback;
|
||||
}
|
||||
|
||||
|
|
|
@ -246,13 +246,13 @@ void si_dma_copy(struct pipe_context *ctx,
|
|||
goto fallback;
|
||||
|
||||
if (src->format != dst->format || src_box->depth > 1 ||
|
||||
rdst->dirty_level_mask != 0 ||
|
||||
(rdst->dirty_level_mask | rdst->stencil_dirty_level_mask) & (1 << dst_level) ||
|
||||
rdst->cmask.size || rdst->fmask.size ||
|
||||
rsrc->cmask.size || rsrc->fmask.size) {
|
||||
goto fallback;
|
||||
}
|
||||
|
||||
if (rsrc->dirty_level_mask) {
|
||||
if (rsrc->dirty_level_mask & (1 << src_level)) {
|
||||
ctx->flush_resource(ctx, src);
|
||||
}
|
||||
|
||||
|
|
|
@ -858,6 +858,9 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
|
|||
struct r600_texture *rtex = (struct r600_texture *)surf->texture;
|
||||
|
||||
rtex->dirty_level_mask |= 1 << surf->u.tex.level;
|
||||
|
||||
if (rtex->surface.flags & RADEON_SURF_SBUFFER)
|
||||
rtex->stencil_dirty_level_mask |= 1 << surf->u.tex.level;
|
||||
}
|
||||
if (sctx->framebuffer.compressed_cb_mask) {
|
||||
struct pipe_surface *surf;
|
||||
|
|
Loading…
Reference in New Issue