static void pb_debug_buffer_fence(struct pb_buffer *_buf, struct pipe_fence_handle *fence) { struct pb_debug_buffer *buf = pb_debug_buffer(_buf); pb_fence(buf->buffer, fence); }
static void pb_debug_buffer_unmap(struct pb_buffer *_buf) { struct pb_debug_buffer *buf = pb_debug_buffer(_buf); pb_unmap(buf->buffer); pb_debug_buffer_check(buf); }
static void pb_debug_buffer_get_base_buffer(struct pb_buffer *_buf, struct pb_buffer **base_buf, pb_size *offset) { struct pb_debug_buffer *buf = pb_debug_buffer(_buf); pb_get_base_buffer(buf->buffer, base_buf, offset); *offset += buf->underflow_size; }
static void pb_debug_buffer_destroy(struct pb_buffer *_buf) { struct pb_debug_buffer *buf = pb_debug_buffer(_buf); assert(!buf->base.base.refcount); pb_debug_buffer_check(buf); pb_reference(&buf->buffer, NULL); FREE(buf); }
static void pb_debug_buffer_unmap(struct pb_buffer *_buf) { struct pb_debug_buffer *buf = pb_debug_buffer(_buf); pipe_mutex_lock(buf->mutex); assert(buf->map_count); if(buf->map_count) --buf->map_count; pipe_mutex_unlock(buf->mutex); pb_unmap(buf->buffer); pb_debug_buffer_check(buf); }
static void * pb_debug_buffer_map(struct pb_buffer *_buf, unsigned flags) { struct pb_debug_buffer *buf = pb_debug_buffer(_buf); void *map; pb_debug_buffer_check(buf); map = pb_map(buf->buffer, flags); if(!map) return NULL; return (uint8_t *)map + buf->underflow_size; }
static enum pipe_error pb_debug_buffer_validate(struct pb_buffer *_buf, struct pb_validate *vl, unsigned flags) { struct pb_debug_buffer *buf = pb_debug_buffer(_buf); pipe_mutex_lock(buf->mutex); if(buf->map_count) { debug_printf("%s: attempting to validate a mapped buffer\n", __FUNCTION__); debug_printf("last map backtrace is\n"); debug_backtrace_dump(buf->map_backtrace, PB_DEBUG_MAP_BACKTRACE); } pipe_mutex_unlock(buf->mutex); pb_debug_buffer_check(buf); return pb_validate(buf->buffer, vl, flags); }
static void pb_debug_buffer_destroy(struct pb_buffer *_buf) { struct pb_debug_buffer *buf = pb_debug_buffer(_buf); struct pb_debug_manager *mgr = buf->mgr; assert(!pipe_is_referenced(&buf->base.base.reference)); pb_debug_buffer_check(buf); pipe_mutex_lock(mgr->mutex); LIST_DEL(&buf->head); pipe_mutex_unlock(mgr->mutex); pipe_mutex_destroy(buf->mutex); pb_reference(&buf->buffer, NULL); FREE(buf); }
static void * pb_debug_buffer_map(struct pb_buffer *_buf, unsigned flags, void *flush_ctx) { struct pb_debug_buffer *buf = pb_debug_buffer(_buf); void *map; pb_debug_buffer_check(buf); map = pb_map(buf->buffer, flags, flush_ctx); if (!map) return NULL; mtx_lock(&buf->mutex); ++buf->map_count; debug_backtrace_capture(buf->map_backtrace, 1, PB_DEBUG_MAP_BACKTRACE); mtx_unlock(&buf->mutex); return (uint8_t *)map + buf->underflow_size; }