gallium/radeon: eliminate fast color clear before sharing
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -249,6 +249,17 @@ static void r600_texture_init_metadata(struct r600_texture *rtex,
|
||||
metadata->scanout = (surface->flags & RADEON_SURF_SCANOUT) != 0;
|
||||
}
|
||||
|
||||
static void r600_eliminate_fast_color_clear(struct r600_common_screen *rscreen,
|
||||
struct r600_texture *rtex)
|
||||
{
|
||||
struct pipe_context *ctx = rscreen->aux_context;
|
||||
|
||||
pipe_mutex_lock(rscreen->aux_context_lock);
|
||||
ctx->flush_resource(ctx, &rtex->resource.b.b);
|
||||
ctx->flush(ctx, NULL, 0);
|
||||
pipe_mutex_unlock(rscreen->aux_context_lock);
|
||||
}
|
||||
|
||||
static boolean r600_texture_get_handle(struct pipe_screen* screen,
|
||||
struct pipe_resource *resource,
|
||||
struct winsys_handle *whandle,
|
||||
@@ -271,6 +282,11 @@ static boolean r600_texture_get_handle(struct pipe_screen* screen,
|
||||
res->external_usage = usage;
|
||||
|
||||
if (resource->target != PIPE_BUFFER) {
|
||||
if (!(usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH)) {
|
||||
/* Eliminate fast clear (both CMASK and DCC) */
|
||||
r600_eliminate_fast_color_clear(rscreen, rtex);
|
||||
}
|
||||
|
||||
r600_texture_init_metadata(rtex, &metadata);
|
||||
rscreen->ws->buffer_set_metadata(res->buf, &metadata);
|
||||
}
|
||||
|
@@ -761,7 +761,7 @@ static void si_flush_resource(struct pipe_context *ctx,
|
||||
|
||||
assert(res->target != PIPE_BUFFER);
|
||||
|
||||
if (!rtex->is_depth && rtex->cmask.size) {
|
||||
if (!rtex->is_depth && (rtex->cmask.size || rtex->dcc_buffer)) {
|
||||
si_blit_decompress_color(ctx, rtex, 0, res->last_level,
|
||||
0, util_max_layer(res, 0));
|
||||
}
|
||||
|
Reference in New Issue
Block a user