From f5216b25e0c2aa16653c5951089ca5f8dfb9b00c Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Mon, 3 Apr 2017 17:32:19 -0700 Subject: [PATCH] i965: Just use a uint32_t context handle rather than a malloc'd wrapper. drm_bacon_context is a malloc'd struct containing a uint32_t context ID and a pointer back to the bufmgr. The bufmgr pointer is pretty useless, as everybody already has brw->bufmgr. At that point...we may as well just use the ctx_id handle directly. A number of places already had to call drm_bacon_gem_context_get_id() to extract the ID anyway. Now they just have it. Reviewed-by: Chris Wilson Acked-by: Jason Ekstrand --- src/mesa/drivers/dri/i965/brw_bufmgr.h | 7 +-- src/mesa/drivers/dri/i965/brw_context.c | 4 +- src/mesa/drivers/dri/i965/brw_context.h | 2 +- src/mesa/drivers/dri/i965/brw_performance_query.c | 6 +-- src/mesa/drivers/dri/i965/brw_reset.c | 11 ++--- src/mesa/drivers/dri/i965/intel_batchbuffer.c | 9 ++-- src/mesa/drivers/dri/i965/intel_bufmgr_gem.c | 52 ++++------------------- 7 files changed, 21 insertions(+), 70 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.h b/src/mesa/drivers/dri/i965/brw_bufmgr.h index 026cc00..8989895 100644 --- a/src/mesa/drivers/dri/i965/brw_bufmgr.h +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.h @@ -46,7 +46,6 @@ extern "C" { struct gen_device_info; typedef struct _drm_bacon_bufmgr drm_bacon_bufmgr; -typedef struct _drm_bacon_context drm_bacon_context; typedef struct _drm_bacon_bo drm_bacon_bo; struct _drm_bacon_bo { @@ -304,10 +303,8 @@ void drm_bacon_gem_bo_start_gtt_access(drm_bacon_bo *bo, int write_enable); int drm_bacon_gem_bo_wait(drm_bacon_bo *bo, int64_t timeout_ns); -drm_bacon_context *drm_bacon_gem_context_create(drm_bacon_bufmgr *bufmgr); -int drm_bacon_gem_context_get_id(drm_bacon_context *ctx, - uint32_t *ctx_id); -void drm_bacon_gem_context_destroy(drm_bacon_context *ctx); +uint32_t brw_create_hw_context(drm_bacon_bufmgr *bufmgr); +void brw_destroy_hw_context(drm_bacon_bufmgr *bufmgr, uint32_t ctx_id); int drm_bacon_bo_gem_export_to_prime(drm_bacon_bo *bo, int *prime_fd); drm_bacon_bo *drm_bacon_bo_gem_create_from_prime(drm_bacon_bufmgr *bufmgr, diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 077a0ca..97fd9bd 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -1094,7 +1094,7 @@ brwCreateContext(gl_api api, * This is required for transform feedback buffer offsets, query objects, * and also allows us to reduce how much state we have to emit. */ - brw->hw_ctx = drm_bacon_gem_context_create(brw->bufmgr); + brw->hw_ctx = brw_create_hw_context(brw->bufmgr); if (!brw->hw_ctx) { fprintf(stderr, "Failed to create hardware context.\n"); @@ -1200,7 +1200,7 @@ intelDestroyContext(__DRIcontext * driContextPriv) if (brw->wm.base.scratch_bo) drm_bacon_bo_unreference(brw->wm.base.scratch_bo); - drm_bacon_gem_context_destroy(brw->hw_ctx); + brw_destroy_hw_context(brw->bufmgr, brw->hw_ctx); if (ctx->swrast_context) { _swsetup_DestroyContext(&brw->ctx); diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 186ce82..e6a0594 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -670,7 +670,7 @@ struct brw_context drm_bacon_bufmgr *bufmgr; - drm_bacon_context *hw_ctx; + uint32_t hw_ctx; /** BO for post-sync nonzero writes for gen6 workaround. */ drm_bacon_bo *workaround_bo; diff --git a/src/mesa/drivers/dri/i965/brw_performance_query.c b/src/mesa/drivers/dri/i965/brw_performance_query.c index c9ba4fe..a0f4d9b 100644 --- a/src/mesa/drivers/dri/i965/brw_performance_query.c +++ b/src/mesa/drivers/dri/i965/brw_performance_query.c @@ -948,12 +948,8 @@ brw_begin_perf_query(struct gl_context *ctx, /* If the OA counters aren't already on, enable them. */ if (brw->perfquery.oa_stream_fd == -1) { __DRIscreen *screen = brw->screen->driScrnPriv; - uint32_t ctx_id; int period_exponent; - if (drm_bacon_gem_context_get_id(brw->hw_ctx, &ctx_id) != 0) - return false; - /* The timestamp for HSW+ increments every 80ns * * The period_exponent gives a sampling period as follows: @@ -973,7 +969,7 @@ brw_begin_perf_query(struct gl_context *ctx, query->oa_format, period_exponent, screen->fd, /* drm fd */ - ctx_id)) + brw->hw_ctx)) return false; } else { assert(brw->perfquery.current_oa_metrics_set_id == diff --git a/src/mesa/drivers/dri/i965/brw_reset.c b/src/mesa/drivers/dri/i965/brw_reset.c index aa68102..ad8c44f 100644 --- a/src/mesa/drivers/dri/i965/brw_reset.c +++ b/src/mesa/drivers/dri/i965/brw_reset.c @@ -36,16 +36,13 @@ brw_get_graphics_reset_status(struct gl_context *ctx) { struct brw_context *brw = brw_context(ctx); __DRIscreen *dri_screen = brw->screen->driScrnPriv; - struct drm_i915_reset_stats stats; + struct drm_i915_reset_stats stats = { .ctx_id = brw->hw_ctx }; /* If hardware contexts are not being used (or * DRM_IOCTL_I915_GET_RESET_STATS is not supported), this function should * not be accessible. */ - assert(brw->hw_ctx != NULL); - - memset(&stats, 0, sizeof(stats)); - drm_bacon_gem_context_get_id(brw->hw_ctx, &stats.ctx_id); + assert(brw->hw_ctx != 0); /* A reset status other than NO_ERROR was returned last time. I915 returns * nonzero active/pending only if reset has been encountered and completed. @@ -81,9 +78,7 @@ void brw_check_for_reset(struct brw_context *brw) { __DRIscreen *dri_screen = brw->screen->driScrnPriv; - struct drm_i915_reset_stats stats; - memset(&stats, 0, sizeof(stats)); - drm_bacon_gem_context_get_id(brw->hw_ctx, &stats.ctx_id); + struct drm_i915_reset_stats stats = { .ctx_id = brw->hw_ctx }; if (drmIoctl(dri_screen->fd, DRM_IOCTL_I915_GET_RESET_STATS, &stats) != 0) return; diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c index 5681127..020c04b 100644 --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c @@ -384,7 +384,7 @@ brw_new_batch(struct brw_context *brw) * would otherwise be stored in the context (which for all intents and * purposes means everything). */ - if (brw->hw_ctx == NULL) + if (brw->hw_ctx == 0) brw->ctx.NewDriverState |= BRW_NEW_CONTEXT; brw->ctx.NewDriverState |= BRW_NEW_BATCH; @@ -538,15 +538,12 @@ add_exec_bo(struct intel_batchbuffer *batch, drm_bacon_bo *bo) static int execbuffer(int fd, struct intel_batchbuffer *batch, - drm_bacon_context *ctx, + uint32_t ctx_id, int used, int in_fence, int *out_fence, int flags) { - uint32_t ctx_id = 0; - drm_bacon_gem_context_get_id(ctx, &ctx_id); - struct drm_i915_gem_execbuffer2 execbuf = { .buffers_ptr = (uintptr_t) batch->exec_objects, .buffer_count = batch->exec_count, @@ -623,7 +620,7 @@ do_flush_locked(struct brw_context *brw, int in_fence_fd, int *out_fence_fd) flags |= I915_EXEC_GEN7_SOL_RESET; if (ret == 0) { - void *hw_ctx = batch->ring != RENDER_RING ? NULL : brw->hw_ctx; + uint32_t hw_ctx = batch->ring == RENDER_RING ? brw->hw_ctx : 0; /* Add the batch itself to the end of the validation list */ add_exec_bo(batch, batch->bo); diff --git a/src/mesa/drivers/dri/i965/intel_bufmgr_gem.c b/src/mesa/drivers/dri/i965/intel_bufmgr_gem.c index bb42ea8..e1119b7 100644 --- a/src/mesa/drivers/dri/i965/intel_bufmgr_gem.c +++ b/src/mesa/drivers/dri/i965/intel_bufmgr_gem.c @@ -90,11 +90,6 @@ atomic_add_unless(int *v, int add, int unless) return c == unless; } -struct _drm_bacon_context { - unsigned int ctx_id; - struct _drm_bacon_bufmgr *bufmgr; -}; - struct bo_cache_bucket { struct list_head head; unsigned long size; @@ -1417,62 +1412,33 @@ drm_bacon_bufmgr_gem_set_vma_cache_size(drm_bacon_bufmgr *bufmgr, int limit) bo_purge_vma_cache(bufmgr); } -drm_bacon_context * -drm_bacon_gem_context_create(drm_bacon_bufmgr *bufmgr) +uint32_t +brw_create_hw_context(drm_bacon_bufmgr *bufmgr) { struct drm_i915_gem_context_create create; - drm_bacon_context *context = NULL; int ret; - context = calloc(1, sizeof(*context)); - if (!context) - return NULL; - memclear(create); ret = drmIoctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create); if (ret != 0) { DBG("DRM_IOCTL_I915_GEM_CONTEXT_CREATE failed: %s\n", strerror(errno)); - free(context); - return NULL; + return 0; } - context->ctx_id = create.ctx_id; - context->bufmgr = bufmgr; - - return context; -} - -int -drm_bacon_gem_context_get_id(drm_bacon_context *ctx, uint32_t *ctx_id) -{ - if (ctx == NULL) - return -EINVAL; - - *ctx_id = ctx->ctx_id; - - return 0; + return create.ctx_id; } void -drm_bacon_gem_context_destroy(drm_bacon_context *ctx) +brw_destroy_hw_context(drm_bacon_bufmgr *bufmgr, uint32_t ctx_id) { - struct drm_i915_gem_context_destroy destroy; - int ret; - - if (ctx == NULL) - return; - - memclear(destroy); + struct drm_i915_gem_context_destroy d = { .ctx_id = ctx_id }; - destroy.ctx_id = ctx->ctx_id; - ret = drmIoctl(ctx->bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_DESTROY, - &destroy); - if (ret != 0) + if (ctx_id != 0 && + drmIoctl(bufmgr->fd, DRM_IOCTL_I915_GEM_CONTEXT_DESTROY, &d) != 0) { fprintf(stderr, "DRM_IOCTL_I915_GEM_CONTEXT_DESTROY failed: %s\n", strerror(errno)); - - free(ctx); + } } int -- 2.7.4