intel: prepare for primary node support
We will be able to support primary nodes once we know how to talk to an X
server.
diff --git a/icd/intel/gpu.c b/icd/intel/gpu.c
index a840a9d..93333e9 100644
--- a/icd/intel/gpu.c
+++ b/icd/intel/gpu.c
@@ -36,6 +36,41 @@
#include "queue.h"
#include "gpu.h"
+static int gpu_open_primary_node(struct intel_gpu *gpu)
+{
+ /* cannot not open gpu->primary_node directly */
+ return gpu->primary_fd_internal;
+}
+
+static void gpu_close_primary_node(struct intel_gpu *gpu)
+{
+ if (gpu->primary_fd_internal >= 0) {
+ close(gpu->primary_fd_internal);
+ gpu->primary_fd_internal = -1;
+ }
+}
+
+static int gpu_open_render_node(struct intel_gpu *gpu)
+{
+ if (gpu->render_fd_internal < 0 && gpu->render_node) {
+ gpu->render_fd_internal = open(gpu->render_node, O_RDWR);
+ if (gpu->render_fd_internal < 0) {
+ icd_log(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0,
+ 0, "failed to open %s", gpu->render_node);
+ }
+ }
+
+ return gpu->render_fd_internal;
+}
+
+static void gpu_close_render_node(struct intel_gpu *gpu)
+{
+ if (gpu->render_fd_internal >= 0) {
+ close(gpu->render_fd_internal);
+ gpu->render_fd_internal = -1;
+ }
+}
+
static const char *gpu_get_name(const struct intel_gpu *gpu)
{
const char *name = NULL;
@@ -71,31 +106,12 @@
return name;
}
-static int gpu_open_internal(struct intel_gpu *gpu)
-{
- if (gpu->fd_internal < 0) {
- gpu->fd_internal = open(gpu->path, O_RDWR);
- if (gpu->fd_internal < 0) {
- icd_log(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0,
- 0, "failed to open %s", gpu->path);
- }
- }
-
- return gpu->fd_internal;
-}
-
-static void gpu_close_internal(struct intel_gpu *gpu)
-{
- if (gpu->fd_internal >= 0) {
- close(gpu->fd_internal);
- gpu->fd_internal = -1;
- }
-}
-
-static struct intel_gpu *gpu_create(int gen, int devid, const char *path)
+static struct intel_gpu *gpu_create(int gen, int devid,
+ const char *primary_node,
+ const char *render_node)
{
struct intel_gpu *gpu;
- size_t path_len;
+ size_t primary_len, render_len;
gpu = icd_alloc(sizeof(*gpu), 0, XGL_SYSTEM_ALLOC_API_OBJECT);
if (!gpu)
@@ -108,13 +124,22 @@
gpu->devid = devid;
- path_len = strlen(path);
- gpu->path = icd_alloc(path_len + 1, 0, XGL_SYSTEM_ALLOC_INTERNAL);
- if (!gpu->path) {
+ primary_len = strlen(primary_node);
+ render_len = (render_node) ? strlen(render_node) : 0;
+
+ gpu->primary_node = icd_alloc(primary_len + 1 +
+ ((render_len) ? (render_len + 1) : 0), 0, XGL_SYSTEM_ALLOC_INTERNAL);
+ if (!gpu->primary_node) {
icd_free(gpu);
return NULL;
}
- memcpy(gpu->path, path, path_len + 1);
+
+ memcpy(gpu->primary_node, primary_node, primary_len + 1);
+
+ if (render_node) {
+ gpu->render_node = gpu->primary_node + primary_len + 1;
+ memcpy(gpu->render_node, render_node, render_len + 1);
+ }
gpu->gen_opaque = gen;
@@ -137,16 +162,18 @@
gpu->batch_buffer_reloc_count =
gpu->max_batch_buffer_size / sizeof(uint32_t) / 2 - 2;
- gpu->fd_internal = -1;
- gpu->fd = -1;
+ gpu->primary_fd_internal = -1;
+ gpu->render_fd_internal = -1;
+
+ gpu->device_fd = -1;
return gpu;
}
static void gpu_destroy(struct intel_gpu *gpu)
{
- gpu_close_internal(gpu);
- icd_free(gpu->path);
+ intel_gpu_close(gpu);
+ icd_free(gpu->primary_node);
icd_free(gpu);
}
@@ -189,8 +216,8 @@
return gen;
}
-XGL_RESULT intel_gpu_add(int devid, const char *path,
- struct intel_gpu **gpu_ret)
+XGL_RESULT intel_gpu_add(int devid, const char *primary_node,
+ const char *render_node, struct intel_gpu **gpu_ret)
{
const int gen = devid_to_gen(devid);
struct intel_gpu *gpu;
@@ -201,7 +228,7 @@
return XGL_ERROR_INITIALIZATION_FAILED;
}
- gpu = gpu_create(gen, devid, path);
+ gpu = gpu_create(gen, devid, primary_node, render_node);
if (!gpu)
return XGL_ERROR_OUT_OF_MEMORY;
@@ -318,15 +345,18 @@
XGL_RESULT intel_gpu_open(struct intel_gpu *gpu)
{
- gpu->fd = gpu_open_internal(gpu);
+ gpu->device_fd = gpu_open_primary_node(gpu);
+ if (gpu->device_fd < 0)
+ gpu->device_fd = gpu_open_render_node(gpu);
- return (gpu->fd >= 0) ? XGL_SUCCESS : XGL_ERROR_UNKNOWN;
+ return (gpu->device_fd >= 0) ? XGL_SUCCESS : XGL_ERROR_UNKNOWN;
}
void intel_gpu_close(struct intel_gpu *gpu)
{
- gpu->fd = -1;
- gpu_close_internal(gpu);
+ gpu_close_primary_node(gpu);
+ gpu_close_render_node(gpu);
+ gpu->device_fd = -1;
}
bool intel_gpu_has_extension(const struct intel_gpu *gpu, const char *ext)