svga: stop using u_resource_vtbl::resource_destroy

Acked-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10659>
This commit is contained in:
Marek Olšák 2021-05-05 14:07:18 -04:00 committed by Marge Bot
parent bee4236606
commit 8b2c0e725a
4 changed files with 60 additions and 58 deletions

View File

@ -139,6 +139,6 @@ svga_init_screen_resource_functions(struct svga_screen *is)
is->screen.resource_create = svga_resource_create;
is->screen.resource_from_handle = svga_resource_from_handle;
is->screen.resource_get_handle = svga_resource_get_handle;
is->screen.resource_destroy = u_resource_destroy_vtbl;
is->screen.resource_destroy = svga_resource_destroy;
is->screen.can_create_resource = svga_can_create_resource;
}

View File

@ -37,6 +37,8 @@
#include "svga_screen.h"
#include "svga_resource_buffer.h"
#include "svga_resource_buffer_upload.h"
#include "svga_resource_texture.h"
#include "svga_sampler_view.h"
#include "svga_winsys.h"
#include "svga_debug.h"
@ -388,43 +390,73 @@ svga_buffer_transfer_unmap(struct pipe_context *pipe,
}
static void
svga_buffer_destroy(struct pipe_screen *screen,
struct pipe_resource *buf)
void
svga_resource_destroy(struct pipe_screen *screen,
struct pipe_resource *buf)
{
struct svga_screen *ss = svga_screen(screen);
struct svga_buffer *sbuf = svga_buffer(buf);
if (buf->target == PIPE_BUFFER) {
struct svga_screen *ss = svga_screen(screen);
struct svga_buffer *sbuf = svga_buffer(buf);
assert(!p_atomic_read(&buf->reference.count));
assert(!p_atomic_read(&buf->reference.count));
assert(!sbuf->dma.pending);
assert(!sbuf->dma.pending);
if (sbuf->handle)
svga_buffer_destroy_host_surface(ss, sbuf);
if (sbuf->handle)
svga_buffer_destroy_host_surface(ss, sbuf);
if (sbuf->uploaded.buffer)
pipe_resource_reference(&sbuf->uploaded.buffer, NULL);
if (sbuf->uploaded.buffer)
pipe_resource_reference(&sbuf->uploaded.buffer, NULL);
if (sbuf->hwbuf)
svga_buffer_destroy_hw_storage(ss, sbuf);
if (sbuf->hwbuf)
svga_buffer_destroy_hw_storage(ss, sbuf);
if (sbuf->swbuf && !sbuf->user)
align_free(sbuf->swbuf);
if (sbuf->swbuf && !sbuf->user)
align_free(sbuf->swbuf);
pipe_resource_reference(&sbuf->translated_indices.buffer, NULL);
pipe_resource_reference(&sbuf->translated_indices.buffer, NULL);
ss->hud.total_resource_bytes -= sbuf->size;
assert(ss->hud.num_resources > 0);
if (ss->hud.num_resources > 0)
ss->hud.num_resources--;
ss->hud.total_resource_bytes -= sbuf->size;
assert(ss->hud.num_resources > 0);
if (ss->hud.num_resources > 0)
ss->hud.num_resources--;
FREE(sbuf);
FREE(sbuf);
} else {
struct svga_screen *ss = svga_screen(screen);
struct svga_texture *tex = svga_texture(buf);
ss->texture_timestamp++;
svga_sampler_view_reference(&tex->cached_view, NULL);
/*
DBG("%s deleting %p\n", __FUNCTION__, (void *) tex);
*/
SVGA_DBG(DEBUG_DMA, "unref sid %p (texture)\n", tex->handle);
svga_screen_surface_destroy(ss, &tex->key, &tex->handle);
/* Destroy the backed surface handle if exists */
if (tex->backed_handle)
svga_screen_surface_destroy(ss, &tex->backed_key, &tex->backed_handle);
ss->hud.total_resource_bytes -= tex->size;
FREE(tex->defined);
FREE(tex->rendered_to);
FREE(tex->dirty);
FREE(tex);
assert(ss->hud.num_resources > 0);
if (ss->hud.num_resources > 0)
ss->hud.num_resources--;
}
}
struct u_resource_vtbl svga_buffer_vtbl =
{
svga_buffer_destroy, /* resource_destroy */
NULL, /* resource_destroy */
svga_buffer_transfer_map, /* transfer_map */
svga_buffer_transfer_unmap, /* transfer_unmap */
};

View File

@ -378,4 +378,8 @@ svga_buffer_transfer_flush_region(struct pipe_context *pipe,
struct pipe_transfer *transfer,
const struct pipe_box *box);
void
svga_resource_destroy(struct pipe_screen *screen,
struct pipe_resource *buf);
#endif /* SVGA_BUFFER_H */

View File

@ -220,40 +220,6 @@ svga_resource_get_handle(struct pipe_screen *screen,
}
static void
svga_texture_destroy(struct pipe_screen *screen,
struct pipe_resource *pt)
{
struct svga_screen *ss = svga_screen(screen);
struct svga_texture *tex = svga_texture(pt);
ss->texture_timestamp++;
svga_sampler_view_reference(&tex->cached_view, NULL);
/*
DBG("%s deleting %p\n", __FUNCTION__, (void *) tex);
*/
SVGA_DBG(DEBUG_DMA, "unref sid %p (texture)\n", tex->handle);
svga_screen_surface_destroy(ss, &tex->key, &tex->handle);
/* Destroy the backed surface handle if exists */
if (tex->backed_handle)
svga_screen_surface_destroy(ss, &tex->backed_key, &tex->backed_handle);
ss->hud.total_resource_bytes -= tex->size;
FREE(tex->defined);
FREE(tex->rendered_to);
FREE(tex->dirty);
FREE(tex);
assert(ss->hud.num_resources > 0);
if (ss->hud.num_resources > 0)
ss->hud.num_resources--;
}
/**
* Determine if we need to read back a texture image before mapping it.
*/
@ -877,7 +843,7 @@ format_has_depth(enum pipe_format format)
struct u_resource_vtbl svga_texture_vtbl =
{
svga_texture_destroy, /* resource_destroy */
NULL, /* resource_destroy */
svga_texture_transfer_map, /* transfer_map */
svga_texture_transfer_unmap, /* transfer_unmap */
};