summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/zink/zink_cmdbuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/zink/zink_cmdbuf.c')
-rw-r--r--src/gallium/drivers/zink/zink_cmdbuf.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/gallium/drivers/zink/zink_cmdbuf.c b/src/gallium/drivers/zink/zink_cmdbuf.c
index aab898f84b1..44c4d941b8d 100644
--- a/src/gallium/drivers/zink/zink_cmdbuf.c
+++ b/src/gallium/drivers/zink/zink_cmdbuf.c
@@ -4,9 +4,11 @@
#include "zink_fence.h"
#include "zink_framebuffer.h"
#include "zink_render_pass.h"
+#include "zink_resource.h"
#include "zink_screen.h"
#include "util/u_debug.h"
+#include "util/set.h"
static void
reset_cmdbuf(struct zink_screen *screen, struct zink_cmdbuf *cmdbuf)
@@ -20,6 +22,13 @@ reset_cmdbuf(struct zink_screen *screen, struct zink_cmdbuf *cmdbuf)
zink_render_pass_reference(screen, &cmdbuf->rp, NULL);
zink_framebuffer_reference(screen, &cmdbuf->fb, NULL);
+
+ /* unref all used resources */
+ set_foreach(cmdbuf->resources, entry) {
+ struct pipe_resource *pres = (struct pipe_resource *)entry->key;
+ pipe_resource_reference(&pres, NULL);
+ }
+ _mesa_set_clear(cmdbuf->resources, NULL);
}
struct zink_cmdbuf *
@@ -79,3 +88,15 @@ zink_end_cmdbuf(struct zink_context *ctx, struct zink_cmdbuf *cmdbuf)
if (vkQueueWaitIdle(ctx->queue) != VK_SUCCESS)
debug_printf("vkQueueWaitIdle failed\n");
}
+
+void
+zink_cmdbuf_reference_resoure(struct zink_cmdbuf *cmdbuf,
+ struct zink_resource *res)
+{
+ struct set_entry *entry = _mesa_set_search(cmdbuf->resources, res);
+ if (!entry) {
+ struct pipe_resource *tmp = NULL;
+ entry = _mesa_set_add(cmdbuf->resources, res);
+ pipe_resource_reference(&tmp, &res->base);
+ }
+}