brw_cache_new_bo(struct brw_cache *cache, uint32_t new_size)
{
struct brw_context *brw = cache->brw;
- drm_bacon_bo *new_bo;
+ struct brw_bo *new_bo;
+ void *llc_map;
- new_bo = drm_bacon_bo_alloc(brw->bufmgr, "program cache", new_size, 64);
+ new_bo = brw_bo_alloc(brw->bufmgr, "program cache", new_size, 64);
+ if (can_do_exec_capture(brw->screen))
+ new_bo->kflags = EXEC_OBJECT_CAPTURE;
if (brw->has_llc)
- drm_bacon_gem_bo_map_unsynchronized(new_bo);
+ llc_map = brw_bo_map(brw, new_bo, MAP_READ | MAP_ASYNC);
/* Copy any existing data that needs to be saved. */
if (cache->next_offset != 0) {
if (brw->has_llc) {
- memcpy(new_bo->virtual, cache->bo->virtual, cache->next_offset);
+ memcpy(llc_map, cache->map, cache->next_offset);
} else {
- drm_bacon_bo_map(cache->bo, false);
- drm_bacon_bo_subdata(new_bo, 0, cache->next_offset,
- cache->bo->virtual);
- drm_bacon_bo_unmap(cache->bo);
+ void *map = brw_bo_map(brw, cache->bo, MAP_READ);
+ brw_bo_subdata(new_bo, 0, cache->next_offset, map);
+ brw_bo_unmap(cache->bo);
}
}
if (brw->has_llc)
- drm_bacon_bo_unmap(cache->bo);
- drm_bacon_bo_unreference(cache->bo);
+ brw_bo_unmap(cache->bo);
+ brw_bo_unreference(cache->bo);
cache->bo = new_bo;
+ cache->map = brw->has_llc ? llc_map : NULL;
cache->bo_used_by_gpu = false;
/* Since we have a new BO in place, we need to signal the units
enum brw_cache_id cache_id,
const void *data, unsigned data_size)
{
- const struct brw_context *brw = cache->brw;
+ struct brw_context *brw = cache->brw;
unsigned i;
const struct brw_cache_item *item;
if (item->cache_id != cache_id || item->size != data_size)
continue;
+ void *map;
if (!brw->has_llc)
- drm_bacon_bo_map(cache->bo, false);
- ret = memcmp(cache->bo->virtual + item->offset, data, item->size);
+ map = brw_bo_map(brw, cache->bo, MAP_READ);
+ else
+ map = cache->map;
+
+ ret = memcmp(map + item->offset, data, item->size);
if (!brw->has_llc)
- drm_bacon_bo_unmap(cache->bo);
+ brw_bo_unmap(cache->bo);
if (ret)
continue;
/* Copy data to the buffer */
if (brw->has_llc) {
- memcpy((char *)cache->bo->virtual + item->offset, data, data_size);
+ memcpy(cache->map + item->offset, data, data_size);
} else {
- drm_bacon_bo_subdata(cache->bo, item->offset, data_size, data);
+ brw_bo_subdata(cache->bo, item->offset, data_size, data);
}
}
cache->items =
calloc(cache->size, sizeof(struct brw_cache_item *));
- cache->bo = drm_bacon_bo_alloc(brw->bufmgr, "program cache", 4096, 64);
+ cache->bo = brw_bo_alloc(brw->bufmgr, "program cache", 4096, 64);
+ if (can_do_exec_capture(brw->screen))
+ cache->bo->kflags = EXEC_OBJECT_CAPTURE;
if (brw->has_llc)
- drm_bacon_gem_bo_map_unsynchronized(cache->bo);
+ cache->map = brw_bo_map(brw, cache->bo, MAP_READ | MAP_WRITE | MAP_ASYNC);
}
static void
DBG("%s\n", __func__);
- if (brw->has_llc)
- drm_bacon_bo_unmap(cache->bo);
- drm_bacon_bo_unreference(cache->bo);
- cache->bo = NULL;
+ /* This can be NULL if context creation failed early on */
+ if (cache->bo) {
+ if (brw->has_llc)
+ brw_bo_unmap(cache->bo);
+ brw_bo_unreference(cache->bo);
+ cache->bo = NULL;
+ cache->map = NULL;
+ }
brw_clear_cache(brw, cache);
free(cache->items);
cache->items = NULL;
{
const struct brw_cache *cache = &brw->cache;
struct brw_cache_item *item;
+ void *map;
if (!brw->has_llc)
- drm_bacon_bo_map(cache->bo, false);
+ map = brw_bo_map(brw, cache->bo, MAP_READ);
+ else
+ map = cache->map;
for (unsigned i = 0; i < cache->size; i++) {
for (item = cache->items[i]; item; item = item->next) {
fprintf(stderr, "%s:\n", cache_name(i));
- brw_disassemble(&brw->screen->devinfo, cache->bo->virtual,
+ brw_disassemble(&brw->screen->devinfo, map,
item->offset, item->size, stderr);
}
}
if (!brw->has_llc)
- drm_bacon_bo_unmap(cache->bo);
+ brw_bo_unmap(cache->bo);
}