etnaviv: Pass npu to etna_screen_create in a separate parameter
Allow to pass both gpu and npu to etna_screen_create() separately, in preparetion for devices with both 3D GPU and NPU. Iterate over all cores or until both GPU and NPU are found. If no 3D GPU was found, screen->gpu will be set to the npu as well, so nothing changes for NPU-only devices. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Reviewed-by: Christian Gmeiner <cgmeiner@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28921>
This commit is contained in:
@@ -106,6 +106,9 @@ etna_screen_destroy(struct pipe_screen *pscreen)
|
||||
if (screen->pipe)
|
||||
etna_pipe_del(screen->pipe);
|
||||
|
||||
if (screen->npu && screen->npu != screen->gpu)
|
||||
etna_gpu_del(screen->npu);
|
||||
|
||||
if (screen->gpu)
|
||||
etna_gpu_del(screen->gpu);
|
||||
|
||||
@@ -1059,7 +1062,7 @@ etna_screen_get_fd(struct pipe_screen *pscreen)
|
||||
|
||||
struct pipe_screen *
|
||||
etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
|
||||
struct renderonly *ro)
|
||||
struct etna_gpu *npu, struct renderonly *ro)
|
||||
{
|
||||
struct etna_screen *screen = CALLOC_STRUCT(etna_screen);
|
||||
struct pipe_screen *pscreen;
|
||||
@@ -1067,9 +1070,13 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
|
||||
if (!screen)
|
||||
return NULL;
|
||||
|
||||
if (!gpu)
|
||||
gpu = npu;
|
||||
|
||||
pscreen = &screen->base;
|
||||
screen->dev = dev;
|
||||
screen->gpu = gpu;
|
||||
screen->npu = npu;
|
||||
screen->ro = ro;
|
||||
screen->info = etna_gpu_get_core_info(gpu);
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@ struct etna_screen {
|
||||
|
||||
struct etna_device *dev;
|
||||
struct etna_gpu *gpu;
|
||||
struct etna_gpu *npu;
|
||||
struct etna_pipe *pipe;
|
||||
struct etna_perfmon *perfmon;
|
||||
struct renderonly *ro;
|
||||
@@ -90,7 +91,7 @@ etna_screen_bo_from_handle(struct pipe_screen *pscreen,
|
||||
|
||||
struct pipe_screen *
|
||||
etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
|
||||
struct renderonly *ro);
|
||||
struct etna_gpu *npu, struct renderonly *ro);
|
||||
|
||||
static inline size_t
|
||||
etna_screen_get_tile_size(struct etna_screen *screen, uint8_t ts_mode,
|
||||
|
||||
@@ -38,7 +38,8 @@ static struct pipe_screen *
|
||||
screen_create(int gpu_fd, const struct pipe_screen_config *config, struct renderonly *ro)
|
||||
{
|
||||
struct etna_device *dev;
|
||||
struct etna_gpu *gpu;
|
||||
struct etna_gpu *gpu = NULL;
|
||||
struct etna_gpu *npu = NULL;
|
||||
int i;
|
||||
|
||||
dev = etna_device_new_dup(gpu_fd);
|
||||
@@ -47,21 +48,41 @@ screen_create(int gpu_fd, const struct pipe_screen_config *config, struct render
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0;; i++) {
|
||||
gpu = etna_gpu_new(dev, i);
|
||||
if (!gpu) {
|
||||
fprintf(stderr, "Error creating gpu\n");
|
||||
return NULL;
|
||||
}
|
||||
for (i = 0; !gpu || !npu; i++) {
|
||||
struct etna_core_info *info;
|
||||
struct etna_gpu *core = etna_gpu_new(dev, i);
|
||||
|
||||
/* Look for a 3D capable GPU */
|
||||
if (etna_core_has_feature(etna_gpu_get_core_info(gpu), ETNA_FEATURE_PIPE_3D))
|
||||
if (!core)
|
||||
break;
|
||||
|
||||
etna_gpu_del(gpu);
|
||||
info = etna_gpu_get_core_info(core);
|
||||
switch (info->type) {
|
||||
case ETNA_CORE_GPU:
|
||||
/* Look for a 3D capable GPU */
|
||||
if (!gpu && etna_core_has_feature(info, ETNA_FEATURE_PIPE_3D)) {
|
||||
gpu = core;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case ETNA_CORE_NPU:
|
||||
if (!npu) {
|
||||
npu = core;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
unreachable("invalid core type");
|
||||
}
|
||||
|
||||
etna_gpu_del(core);
|
||||
}
|
||||
|
||||
return etna_screen_create(dev, gpu, ro);
|
||||
if (!gpu && !npu) {
|
||||
fprintf(stderr, "Error creating gpu or npu\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return etna_screen_create(dev, gpu, npu, ro);
|
||||
}
|
||||
|
||||
struct pipe_screen *
|
||||
|
||||
Reference in New Issue
Block a user