#define call_size_with_slots(type, num_slots) size_to_slots( \
sizeof(struct type) + sizeof(((struct type*)NULL)->slot[0]) * (num_slots))
+/* Assign src to dst while dst is uninitialized. */
+static inline void
+tc_set_resource_reference(struct pipe_resource **dst, struct pipe_resource *src)
+{
+ *dst = src;
+ pipe_reference(NULL, &src->reference); /* only increment refcount */
+}
+
+/* Unreference dst but don't touch the dst pointer. */
+static inline void
+tc_drop_resource_reference(struct pipe_resource *dst)
+{
+ if (pipe_reference(&dst->reference, NULL)) /* only decrement refcount */
+ pipe_resource_destroy(dst);
+}
+
+/* Unreference dst but don't touch the dst pointer. */
+static inline void
+tc_drop_surface_reference(struct pipe_surface *dst)
+{
+ if (pipe_reference(&dst->reference, NULL)) /* only decrement refcount */
+ dst->context->surface_destroy(dst->context, dst);
+}
+
+/* Unreference dst but don't touch the dst pointer. */
+static inline void
+tc_drop_sampler_view_reference(struct pipe_sampler_view *dst)
+{
+ if (pipe_reference(&dst->reference, NULL)) /* only decrement refcount */
+ dst->context->sampler_view_destroy(dst->context, dst);
+}
+
+/* Unreference dst but don't touch the dst pointer. */
+static inline void
+tc_drop_so_target_reference(struct pipe_stream_output_target *dst)
+{
+ if (pipe_reference(&dst->reference, NULL)) /* only decrement refcount */
+ dst->context->stream_output_target_destroy(dst->context, dst);
+}
+
/* We don't want to read or write min_index and max_index, because
* it shouldn't be needed by drivers at this point.
*/
multi[1].index_bias = next->index_bias;
if (next->info.index_size)
- pipe_resource_reference(&next->info.index.resource, NULL);
+ tc_drop_resource_reference(next->info.index.resource);
/* Find how many other draws can be merged. */
next++;
index_bias_varies |= first->index_bias != next->index_bias;
if (next->info.index_size)
- pipe_resource_reference(&next->info.index.resource, NULL);
+ tc_drop_resource_reference(next->info.index.resource);
}
first->info.index_bias_varies = index_bias_varies;
pipe->draw_vbo(pipe, &first->info, 0, NULL, multi, num_draws);
if (first->info.index_size)
- pipe_resource_reference(&first->info.index.resource, NULL);
+ tc_drop_resource_reference(first->info.index.resource);
iter = (uint64_t*)next;
continue;
}
}
}
-static void
-tc_set_resource_reference(struct pipe_resource **dst, struct pipe_resource *src)
-{
- *dst = NULL;
- pipe_resource_reference(dst, src);
-}
-
void
threaded_resource_init(struct pipe_resource *res)
{
pipe->get_query_result_resource(pipe, p->query, p->wait, p->result_type,
p->index, p->resource, p->offset);
- pipe_resource_reference(&p->resource, NULL);
+ tc_drop_resource_reference(p->resource);
}
static void
unsigned nr_cbufs = p->nr_cbufs;
for (unsigned i = 0; i < nr_cbufs; i++)
- pipe_surface_reference(&p->cbufs[i], NULL);
- pipe_surface_reference(&p->zsbuf, NULL);
+ tc_drop_surface_reference(p->cbufs[i]);
+ tc_drop_surface_reference(p->zsbuf);
}
static void
pipe->set_sampler_views(pipe, p->shader, p->start, p->count,
p->unbind_num_trailing_slots, p->slot);
for (unsigned i = 0; i < count; i++)
- pipe_sampler_view_reference(&p->slot[i], NULL);
+ tc_drop_sampler_view_reference(p->slot[i]);
}
static void
p->unbind_num_trailing_slots, p->slot);
for (unsigned i = 0; i < count; i++)
- pipe_resource_reference(&p->slot[i].resource, NULL);
+ tc_drop_resource_reference(p->slot[i].resource);
}
static void
p->writable_bitmask);
for (unsigned i = 0; i < count; i++)
- pipe_resource_reference(&p->slot[i].buffer, NULL);
+ tc_drop_resource_reference(p->slot[i].buffer);
}
static void
pipe->set_stream_output_targets(pipe, count, p->targets, p->offsets);
for (unsigned i = 0; i < count; i++)
- pipe_so_target_reference(&p->targets[i], NULL);
+ tc_drop_so_target_reference(p->targets[i]);
}
static void
(struct tc_replace_buffer_storage *)call;
p->func(pipe, p->dst, p->src);
- pipe_resource_reference(&p->dst, NULL);
- pipe_resource_reference(&p->src, NULL);
+ tc_drop_resource_reference(p->dst);
+ tc_drop_resource_reference(p->src);
}
static bool
/* Nothing to do except keeping track of staging uploads */
assert(tres->pending_staging_uploads > 0);
p_atomic_dec(&tres->pending_staging_uploads);
- pipe_resource_reference(&p->resource, NULL);
+ tc_drop_resource_reference(p->resource);
return;
}
pipe->transfer_unmap(pipe, p->transfer);
if (ttrans->staging) {
was_staging_transfer = true;
- pipe_resource_reference(&ttrans->staging, NULL);
- pipe_resource_reference(&ttrans->b.resource, NULL);
+ tc_drop_resource_reference(ttrans->staging);
+ tc_drop_resource_reference(ttrans->b.resource);
slab_free(&tc->pool_transfers, ttrans);
}
}
pipe->buffer_subdata(pipe, p->resource, p->usage, p->offset, p->size,
p->slot);
- pipe_resource_reference(&p->resource, NULL);
+ tc_drop_resource_reference(p->resource);
}
static void
pipe->texture_subdata(pipe, p->resource, p->level, p->usage, &p->box,
p->slot, p->stride, p->layer_stride);
- pipe_resource_reference(&p->resource, NULL);
+ tc_drop_resource_reference(p->resource);
}
static void
pipe->draw_vbo(pipe, &info->info, 0, NULL, &draw, 1);
if (info->info.index_size)
- pipe_resource_reference(&info->info.index.resource, NULL);
+ tc_drop_resource_reference(info->info.index.resource);
}
struct tc_draw_indirect {
pipe->draw_vbo(pipe, &info->info, 0, &info->indirect, &info->draw, 1);
if (info->info.index_size)
- pipe_resource_reference(&info->info.index.resource, NULL);
+ tc_drop_resource_reference(info->info.index.resource);
- pipe_resource_reference(&info->indirect.buffer, NULL);
- pipe_resource_reference(&info->indirect.indirect_draw_count, NULL);
- pipe_so_target_reference(&info->indirect.count_from_stream_output, NULL);
+ tc_drop_resource_reference(info->indirect.buffer);
+ tc_drop_resource_reference(info->indirect.indirect_draw_count);
+ tc_drop_so_target_reference(info->indirect.count_from_stream_output);
}
struct tc_draw_multi {
pipe->draw_vbo(pipe, &info->info, 0, NULL, info->slot, info->num_draws);
if (info->info.index_size)
- pipe_resource_reference(&info->info.index.resource, NULL);
+ tc_drop_resource_reference(info->info.index.resource);
}
#define DRAW_INFO_SIZE_WITHOUT_INDEXBUF_AND_MIN_MAX_INDEX \
struct pipe_grid_info *p = &((struct tc_launch_grid_call *)call)->info;
pipe->launch_grid(pipe, p);
- pipe_resource_reference(&p->indirect, NULL);
+ tc_drop_resource_reference(p->indirect);
}
static void
pipe->resource_copy_region(pipe, p->dst, p->dst_level, p->dstx, p->dsty,
p->dstz, p->src, p->src_level, &p->src_box);
- pipe_resource_reference(&p->dst, NULL);
- pipe_resource_reference(&p->src, NULL);
+ tc_drop_resource_reference(p->dst);
+ tc_drop_resource_reference(p->src);
}
static void
struct pipe_blit_info *blit = &((struct tc_blit_call*)call)->info;
pipe->blit(pipe, blit);
- pipe_resource_reference(&blit->dst.resource, NULL);
- pipe_resource_reference(&blit->src.resource, NULL);
+ tc_drop_resource_reference(blit->dst.resource);
+ tc_drop_resource_reference(blit->src.resource);
}
static void
p->first_layer,
p->last_layer);
assert(result);
- pipe_resource_reference(&p->res, NULL);
+ tc_drop_resource_reference(p->res);
}
static bool
struct pipe_resource *resource = ((struct tc_resource_call*)call)->resource;
pipe->flush_resource(pipe, resource);
- pipe_resource_reference(&resource, NULL);
+ tc_drop_resource_reference(resource);
}
static void
struct pipe_resource *resource = ((struct tc_resource_call*)call)->resource;
pipe->invalidate_resource(pipe, resource);
- pipe_resource_reference(&resource, NULL);
+ tc_drop_resource_reference(resource);
}
static void
pipe->clear_buffer(pipe, p->res, p->offset, p->size, p->clear_value,
p->clear_value_size);
- pipe_resource_reference(&p->res, NULL);
+ tc_drop_resource_reference(p->res);
}
static void
struct tc_clear_texture *p = (struct tc_clear_texture *)call;
pipe->clear_texture(pipe, p->res, p->level, &p->box, p->data);
- pipe_resource_reference(&p->res, NULL);
+ tc_drop_resource_reference(p->res);
}
static void
struct tc_resource_commit *p = (struct tc_resource_commit *)call;
pipe->resource_commit(pipe, p->res, p->level, &p->box, p->commit);
- pipe_resource_reference(&p->res, NULL);
+ tc_drop_resource_reference(p->res);
}
static bool