diff options
Diffstat (limited to 'src/gallium/state_trackers/xa')
-rw-r--r-- | src/gallium/state_trackers/xa/xa_priv.h | 1 | ||||
-rw-r--r-- | src/gallium/state_trackers/xa/xa_tracker.c | 16 | ||||
-rw-r--r-- | src/gallium/state_trackers/xa/xa_tracker.h | 3 |
3 files changed, 18 insertions, 2 deletions
diff --git a/src/gallium/state_trackers/xa/xa_priv.h b/src/gallium/state_trackers/xa/xa_priv.h index 2ab11b82b26..ee182e79222 100644 --- a/src/gallium/state_trackers/xa/xa_priv.h +++ b/src/gallium/state_trackers/xa/xa_priv.h @@ -59,6 +59,7 @@ struct xa_format_descriptor { }; struct xa_surface { + int refcount; struct pipe_resource template; struct xa_tracker *xa; struct pipe_resource *tex; diff --git a/src/gallium/state_trackers/xa/xa_tracker.c b/src/gallium/state_trackers/xa/xa_tracker.c index 945ed36a292..cda6501fcd4 100644 --- a/src/gallium/state_trackers/xa/xa_tracker.c +++ b/src/gallium/state_trackers/xa/xa_tracker.c @@ -328,6 +328,7 @@ surface_create(struct xa_tracker *xa, if (!srf->tex) goto out_no_tex; + srf->refcount = 1; srf->xa = xa; srf->flags = flags; srf->fdesc = fdesc; @@ -451,9 +452,22 @@ xa_surface_redefine(struct xa_surface *srf, return XA_ERR_NONE; } +XA_EXPORT struct xa_surface* +xa_surface_ref(struct xa_surface *srf) +{ + if (srf == NULL) { + return NULL; + } + srf->refcount++; + return srf; +} + XA_EXPORT void -xa_surface_destroy(struct xa_surface *srf) +xa_surface_unref(struct xa_surface *srf) { + if (srf == NULL || --srf->refcount) { + return; + } pipe_resource_reference(&srf->tex, NULL); free(srf); } diff --git a/src/gallium/state_trackers/xa/xa_tracker.h b/src/gallium/state_trackers/xa/xa_tracker.h index 4d2452e9286..65a67bb58d7 100644 --- a/src/gallium/state_trackers/xa/xa_tracker.h +++ b/src/gallium/state_trackers/xa/xa_tracker.h @@ -176,7 +176,8 @@ extern struct xa_surface * xa_surface_from_handle(struct xa_tracker *xa, enum xa_formats xa_surface_format(const struct xa_surface *srf); -extern void xa_surface_destroy(struct xa_surface *srf); +extern struct xa_surface *xa_surface_ref(struct xa_surface *srf); +extern void xa_surface_unref(struct xa_surface *srf); extern int xa_surface_redefine(struct xa_surface *srf, int width, |