iris: replace vestiges of fence fds with newer exec_fence API

patch by me and Chris Wilson
This commit is contained in:
Kenneth Graunke 2018-11-08 14:42:00 -08:00
parent 11da219be9
commit 3455f57575
2 changed files with 55 additions and 34 deletions

View File

@ -61,6 +61,32 @@
static void static void
iris_batch_reset(struct iris_batch *batch); iris_batch_reset(struct iris_batch *batch);
static unsigned
num_fences(struct iris_batch *batch)
{
return util_dynarray_num_elements(&batch->exec_fences,
struct drm_i915_gem_exec_fence);
}
/**
* Debugging code to dump the fence list, used by INTEL_DEBUG=submit.
*/
static void
dump_fence_list(struct iris_batch *batch)
{
fprintf(stderr, "Fence list (length %u): ", num_fences(batch));
util_dynarray_foreach(&batch->exec_fences,
struct drm_i915_gem_exec_fence, f) {
fprintf(stderr, "%s%u%s ",
(f->flags & I915_EXEC_FENCE_WAIT) ? "..." : "",
f->handle,
(f->flags & I915_EXEC_FENCE_SIGNAL) ? "!" : "");
}
fprintf(stderr, "\n");
}
/** /**
* Debugging code to dump the validation list, used by INTEL_DEBUG=submit. * Debugging code to dump the validation list, used by INTEL_DEBUG=submit.
*/ */
@ -156,6 +182,8 @@ iris_init_batch(struct iris_batch *batch,
batch->hw_ctx_id = iris_create_hw_context(screen->bufmgr); batch->hw_ctx_id = iris_create_hw_context(screen->bufmgr);
assert(batch->hw_ctx_id); assert(batch->hw_ctx_id);
util_dynarray_init(&batch->exec_fences, ralloc_context(NULL));
batch->exec_count = 0; batch->exec_count = 0;
batch->exec_array_size = 100; batch->exec_array_size = 100;
batch->exec_bos = batch->exec_bos =
@ -345,6 +373,9 @@ iris_batch_free(struct iris_batch *batch)
} }
free(batch->exec_bos); free(batch->exec_bos);
free(batch->validation_list); free(batch->validation_list);
ralloc_free(batch->exec_fences.mem_ctx);
iris_bo_unreference(batch->bo); iris_bo_unreference(batch->bo);
batch->bo = NULL; batch->bo = NULL;
batch->map = NULL; batch->map = NULL;
@ -419,7 +450,7 @@ iris_finish_batch(struct iris_batch *batch)
* Submit the batch to the GPU via execbuffer2. * Submit the batch to the GPU via execbuffer2.
*/ */
static int static int
submit_batch(struct iris_batch *batch, int in_fence_fd, int *out_fence_fd) submit_batch(struct iris_batch *batch)
{ {
iris_bo_unmap(batch->bo); iris_bo_unmap(batch->bo);
@ -448,20 +479,16 @@ submit_batch(struct iris_batch *batch, int in_fence_fd, int *out_fence_fd)
.rsvd1 = batch->hw_ctx_id, /* rsvd1 is actually the context ID */ .rsvd1 = batch->hw_ctx_id, /* rsvd1 is actually the context ID */
}; };
unsigned long cmd = DRM_IOCTL_I915_GEM_EXECBUFFER2; if (num_fences(batch)) {
execbuf.flags |= I915_EXEC_FENCE_ARRAY;
if (in_fence_fd != -1) { execbuf.num_cliprects = num_fences(batch);
execbuf.rsvd2 = in_fence_fd; execbuf.cliprects_ptr =
execbuf.flags |= I915_EXEC_FENCE_IN; (uintptr_t)util_dynarray_begin(&batch->exec_fences);
} }
if (out_fence_fd != NULL) { int ret = drm_ioctl(batch->screen->fd,
cmd = DRM_IOCTL_I915_GEM_EXECBUFFER2_WR; DRM_IOCTL_I915_GEM_EXECBUFFER2,
*out_fence_fd = -1; &execbuf);
execbuf.flags |= I915_EXEC_FENCE_OUT;
}
int ret = drm_ioctl(batch->screen->fd, cmd, &execbuf);
if (ret != 0) { if (ret != 0) {
ret = -errno; ret = -errno;
DBG("execbuf FAILED: errno = %d\n", -ret); DBG("execbuf FAILED: errno = %d\n", -ret);
@ -478,9 +505,6 @@ submit_batch(struct iris_batch *batch, int in_fence_fd, int *out_fence_fd)
bo->index = -1; bo->index = -1;
} }
if (ret == 0 && out_fence_fd != NULL)
*out_fence_fd = execbuf.rsvd2 >> 32;
return ret; return ret;
} }
@ -494,13 +518,11 @@ submit_batch(struct iris_batch *batch, int in_fence_fd, int *out_fence_fd)
* \param out_fence_fd is ignored if NULL. Otherwise, the caller must * \param out_fence_fd is ignored if NULL. Otherwise, the caller must
* take ownership of the returned fd. * take ownership of the returned fd.
*/ */
int void
_iris_batch_flush_fence(struct iris_batch *batch, _iris_batch_flush(struct iris_batch *batch, const char *file, int line)
int in_fence_fd, int *out_fence_fd,
const char *file, int line)
{ {
if (iris_batch_bytes_used(batch) == 0) if (iris_batch_bytes_used(batch) == 0)
return 0; return;
iris_finish_batch(batch); iris_finish_batch(batch);
@ -518,6 +540,7 @@ _iris_batch_flush_fence(struct iris_batch *batch,
100.0f * bytes_for_commands / BATCH_SZ, 100.0f * bytes_for_commands / BATCH_SZ,
batch->exec_count, batch->exec_count,
(float) batch->aperture_space / (1024 * 1024)); (float) batch->aperture_space / (1024 * 1024));
dump_fence_list(batch);
dump_validation_list(batch); dump_validation_list(batch);
} }
@ -525,7 +548,7 @@ _iris_batch_flush_fence(struct iris_batch *batch,
decode_batch(batch); decode_batch(batch);
} }
int ret = submit_batch(batch, in_fence_fd, out_fence_fd); int ret = submit_batch(batch);
//throttle(iris); //throttle(iris);
@ -554,10 +577,10 @@ _iris_batch_flush_fence(struct iris_batch *batch,
batch->exec_count = 0; batch->exec_count = 0;
batch->aperture_space = 0; batch->aperture_space = 0;
util_dynarray_clear(&batch->exec_fences);
/* Start a new batch buffer. */ /* Start a new batch buffer. */
iris_batch_reset(batch); iris_batch_reset(batch);
return 0;
} }
/** /**

View File

@ -27,6 +27,9 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
#include "util/u_dynarray.h"
#include "i915_drm.h" #include "i915_drm.h"
#include "common/gen_decoder.h" #include "common/gen_decoder.h"
@ -76,6 +79,9 @@ struct iris_batch {
int exec_count; int exec_count;
int exec_array_size; int exec_array_size;
/** A list of drm_i915_exec_fences to have execbuf signal or wait on */
struct util_dynarray exec_fences;
/** The amount of aperture space (in bytes) used by all exec_bos */ /** The amount of aperture space (in bytes) used by all exec_bos */
int aperture_space; int aperture_space;
@ -118,16 +124,8 @@ void iris_chain_to_new_batch(struct iris_batch *batch);
void iris_batch_free(struct iris_batch *batch); void iris_batch_free(struct iris_batch *batch);
void iris_batch_maybe_flush(struct iris_batch *batch, unsigned estimate); void iris_batch_maybe_flush(struct iris_batch *batch, unsigned estimate);
int _iris_batch_flush_fence(struct iris_batch *batch, void _iris_batch_flush(struct iris_batch *batch, const char *file, int line);
int in_fence_fd, int *out_fence_fd, #define iris_batch_flush(batch) _iris_batch_flush((batch), __FILE__, __LINE__)
const char *file, int line);
#define iris_batch_flush_fence(batch, in_fence_fd, out_fence_fd) \
_iris_batch_flush_fence((batch), (in_fence_fd), (out_fence_fd), \
__FILE__, __LINE__)
#define iris_batch_flush(batch) iris_batch_flush_fence((batch), -1, NULL)
bool iris_batch_references(struct iris_batch *batch, struct iris_bo *bo); bool iris_batch_references(struct iris_batch *batch, struct iris_bo *bo);