[magma] Cache buffer id to improve virtualization perf
Change-Id: Ieb2fe396140cda9a39c514298c1c8e967a644c93
Reviewed-on: https://fuchsia-review.googlesource.com/c/third_party/mesa/+/455417
Reviewed-by: John Bauman <jbauman@google.com>
diff --git a/src/intel/vulkan/anv_magma.c b/src/intel/vulkan/anv_magma.c
index a3ef534..6b29345 100644
--- a/src/intel/vulkan/anv_magma.c
+++ b/src/intel/vulkan/anv_magma.c
@@ -151,7 +151,7 @@
entry->buffer = AnvMagmaCreateBuffer(device->connection, buffer);
LOG_VERBOSE("magma_create_buffer size 0x%zx returning buffer %lu gem_handle %u", magma_size,
- magma_get_buffer_id(buffer), entry->gem_handle);
+ entry->buffer->id, entry->gem_handle);
return entry->gem_handle;
}
@@ -217,11 +217,11 @@
close(fd);
#else
- #error Unsupported
+#error Unsupported
#endif
LOG_VERBOSE("anv_gem_mmap gem_handle %u buffer %lu offset %lu size 0x%zx returning %p",
- gem_handle, magma_get_buffer_id(buffer), offset, size, addr);
+ gem_handle, entry->buffer->id, offset, size, addr);
return addr;
}
@@ -282,12 +282,11 @@
return -1;
}
- uint64_t buffer_id = magma_get_buffer_id(entry->buffer->buffer);
+ LOG_VERBOSE("anv_gem_wait gem_handle %u buffer_id %lu timeout_ns %lu", gem_handle,
+ entry->buffer->id, *timeout_ns);
- LOG_VERBOSE("anv_gem_wait gem_handle %u buffer_id %lu timeout_ns %lu", gem_handle, buffer_id,
- *timeout_ns);
-
- magma_status_t status = AnvMagmaConnectionWait(device->connection, buffer_id, *timeout_ns);
+ magma_status_t status =
+ AnvMagmaConnectionWait(device->connection, entry->buffer->id, *timeout_ns);
switch (status) {
case MAGMA_STATUS_OK:
break;
@@ -314,9 +313,8 @@
return -1;
}
- uint64_t buffer_id = magma_get_buffer_id(entry->buffer->buffer);
-
- magma_status_t status = AnvMagmaConnectionWait(device->connection, buffer_id, 0 /*timeout_ns*/);
+ magma_status_t status =
+ AnvMagmaConnectionWait(device->connection, entry->buffer->id, 0 /*timeout_ns*/);
switch (status) {
case MAGMA_STATUS_TIMED_OUT:
return 1;
diff --git a/src/intel/vulkan/anv_magma.h b/src/intel/vulkan/anv_magma.h
index d1a413d..a1f125f 100644
--- a/src/intel/vulkan/anv_magma.h
+++ b/src/intel/vulkan/anv_magma.h
@@ -32,16 +32,13 @@
#include <stdio.h>
-#define ANV_MAGMA_DRET(ret) \
- (ret != 0 \
- ? intel_loge("%s:%d Returning error %ld", __FILE__, __LINE__, (int64_t)ret), \
- ret : ret)
+#define ANV_MAGMA_DRET(ret) \
+ (ret != 0 ? intel_loge("%s:%d Returning error %ld", __FILE__, __LINE__, (int64_t)ret), ret : ret)
-#define ANV_MAGMA_DRET_MSG(ret, format, ...) \
- (ret != 0 \
- ? intel_loge("%s:%d Returning error %ld: " format, __FILE__, __LINE__, \
- (int64_t)ret, ##__VA_ARGS__), \
- ret : ret)
+#define ANV_MAGMA_DRET_MSG(ret, format, ...) \
+ (ret != 0 ? intel_loge("%s:%d Returning error %ld: " format, __FILE__, __LINE__, (int64_t)ret, \
+ ##__VA_ARGS__), \
+ ret : ret)
struct anv_connection {
magma_connection_t connection;
@@ -50,6 +47,7 @@
struct anv_magma_buffer {
magma_buffer_t buffer;
+ uint64_t id;
};
#ifdef __cplusplus
diff --git a/src/intel/vulkan/anv_magma_connection.cc b/src/intel/vulkan/anv_magma_connection.cc
index cc39b35..6e082ff 100644
--- a/src/intel/vulkan/anv_magma_connection.cc
+++ b/src/intel/vulkan/anv_magma_connection.cc
@@ -54,7 +54,11 @@
class Buffer : public anv_magma_buffer {
public:
- Buffer(magma_buffer_t buffer) { anv_magma_buffer::buffer = buffer; }
+ Buffer(magma_buffer_t buffer, uint64_t id)
+ {
+ anv_magma_buffer::buffer = buffer;
+ anv_magma_buffer::id = id;
+ }
~Buffer() { assert(!get()); }
@@ -190,12 +194,11 @@
for (uint32_t i = 0; i < execbuf->buffer_count; i++) {
auto buffer = reinterpret_cast<Buffer*>(exec_objects[i].handle);
- uint64_t buffer_id = magma_get_buffer_id(buffer->get());
uint64_t offset = exec_objects[i].rsvd1;
uint64_t length = exec_objects[i].rsvd2;
resources.push_back({
- .buffer_id = buffer_id,
+ .buffer_id = buffer->id,
.offset = offset,
.length = length,
});
@@ -222,7 +225,7 @@
if (!has_mapping) {
LOG_VERBOSE("mapping to gpu addr 0x%lx: id %lu page_offset %lu page_count %lu", gpu_addr,
- buffer_id, page_offset, page_count);
+ buffer->id, page_offset, page_count);
magma_map_buffer_gpu(Connection::cast(connection)->magma_connection(), buffer->get(),
page_offset, page_count, gpu_addr, 0);
@@ -272,7 +275,7 @@
anv_magma_buffer* AnvMagmaCreateBuffer(anv_connection* connection, magma_buffer_t buffer)
{
- return new Buffer(buffer);
+ return new Buffer(buffer, magma_get_buffer_id(buffer));
}
void AnvMagmaReleaseBuffer(anv_connection* connection, anv_magma_buffer* anv_buffer)