GBM and EGL are separate libraries. v2: - don't fallback if drm fd specified (@davidriley) - close fd on failure (@davidriley) v3: - if drm fd is specified, assume caller retains ownership (@davidriley) v4: - add comments (@davidriley) Reviewed-by: David Riley <davidriley@chromium.org> Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>macos/master
parent
4253b10072
commit
4cade493dc
@ -0,0 +1,127 @@ |
|||||||
|
/**************************************************************************
|
||||||
|
* |
||||||
|
* Copyright (C) 2019 Chromium. |
||||||
|
* |
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a |
||||||
|
* copy of this software and associated documentation files (the "Software"), |
||||||
|
* to deal in the Software without restriction, including without limitation |
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the |
||||||
|
* Software is furnished to do so, subject to the following conditions: |
||||||
|
* |
||||||
|
* The above copyright notice and this permission notice shall be included |
||||||
|
* in all copies or substantial portions of the Software. |
||||||
|
* |
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||||
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
||||||
|
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||||
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
||||||
|
* OTHER DEALINGS IN THE SOFTWARE. |
||||||
|
* |
||||||
|
**************************************************************************/ |
||||||
|
|
||||||
|
#ifndef _GNU_SOURCE |
||||||
|
#define _GNU_SOURCE 1 |
||||||
|
#endif |
||||||
|
|
||||||
|
#include <stdio.h> |
||||||
|
#include <dirent.h> |
||||||
|
#include <fcntl.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <string.h> |
||||||
|
#include <xf86drm.h> |
||||||
|
#include <unistd.h> |
||||||
|
|
||||||
|
#include "virgl_gbm.h" |
||||||
|
#include "virgl_hw.h" |
||||||
|
#include "vrend_debug.h" |
||||||
|
|
||||||
|
static int rendernode_open(void) |
||||||
|
{ |
||||||
|
DIR *dir; |
||||||
|
struct dirent *dir_ent; |
||||||
|
int ret, fd; |
||||||
|
char *rendernode_name; |
||||||
|
dir = opendir("/dev/dri"); |
||||||
|
if (!dir) |
||||||
|
return -1; |
||||||
|
|
||||||
|
fd = -1; |
||||||
|
while ((dir_ent = readdir(dir))) { |
||||||
|
if (dir_ent->d_type != DT_CHR) |
||||||
|
continue; |
||||||
|
|
||||||
|
if (strncmp(dir_ent->d_name, "renderD", 7)) |
||||||
|
continue; |
||||||
|
|
||||||
|
ret = asprintf(&rendernode_name, "/dev/dri/%s", dir_ent->d_name); |
||||||
|
if (ret < 0) |
||||||
|
return -1; |
||||||
|
|
||||||
|
fd = open(rendernode_name, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK); |
||||||
|
if (fd < 0){ |
||||||
|
free(rendernode_name); |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
free(rendernode_name); |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
closedir(dir); |
||||||
|
if (fd < 0) |
||||||
|
return -1; |
||||||
|
return fd; |
||||||
|
} |
||||||
|
|
||||||
|
struct virgl_gbm *virgl_gbm_init(int fd) |
||||||
|
{ |
||||||
|
struct virgl_gbm *gbm = calloc(1, sizeof(struct virgl_gbm)); |
||||||
|
if (!gbm) |
||||||
|
return NULL; |
||||||
|
|
||||||
|
gbm->fd = -1; |
||||||
|
if (fd < 0) { |
||||||
|
gbm->fd = rendernode_open(); |
||||||
|
if (gbm->fd < 0) |
||||||
|
goto out_error; |
||||||
|
|
||||||
|
gbm->device = gbm_create_device(gbm->fd); |
||||||
|
if (!gbm->device) { |
||||||
|
close(gbm->fd); |
||||||
|
goto out_error; |
||||||
|
} |
||||||
|
} else { |
||||||
|
gbm->device = gbm_create_device(fd); |
||||||
|
if (!gbm->device) |
||||||
|
goto out_error; |
||||||
|
} |
||||||
|
|
||||||
|
return gbm; |
||||||
|
|
||||||
|
out_error: |
||||||
|
free(gbm); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
|
||||||
|
void virgl_gbm_fini(struct virgl_gbm *gbm) |
||||||
|
{ |
||||||
|
gbm_device_destroy(gbm->device); |
||||||
|
if (gbm->fd >= 0) |
||||||
|
close(gbm->fd); |
||||||
|
free(gbm); |
||||||
|
} |
||||||
|
|
||||||
|
uint32_t virgl_gbm_convert_format(uint32_t virgl_format) |
||||||
|
{ |
||||||
|
switch (virgl_format) { |
||||||
|
case VIRGL_FORMAT_B8G8R8X8_UNORM: |
||||||
|
case VIRGL_FORMAT_B8G8R8A8_UNORM: |
||||||
|
return GBM_FORMAT_ARGB8888; |
||||||
|
default: |
||||||
|
vrend_printf("unsupported virgl format: %u\n", virgl_format); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
/**************************************************************************
|
||||||
|
* |
||||||
|
* Copyright (C) 2019 Chromium. |
||||||
|
* |
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a |
||||||
|
* copy of this software and associated documentation files (the "Software"), |
||||||
|
* to deal in the Software without restriction, including without limitation |
||||||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||||
|
* and/or sell copies of the Software, and to permit persons to whom the |
||||||
|
* Software is furnished to do so, subject to the following conditions: |
||||||
|
* |
||||||
|
* The above copyright notice and this permission notice shall be included |
||||||
|
* in all copies or substantial portions of the Software. |
||||||
|
* |
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||||||
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||||
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
||||||
|
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||||||
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
||||||
|
* OTHER DEALINGS IN THE SOFTWARE. |
||||||
|
* |
||||||
|
**************************************************************************/ |
||||||
|
|
||||||
|
#ifndef VIRGL_GBM_H |
||||||
|
#define VIRGL_GBM_H |
||||||
|
|
||||||
|
#include <gbm.h> |
||||||
|
|
||||||
|
/*
|
||||||
|
* If fd >= 0, virglrenderer owns the fd since it was opened via a rendernode |
||||||
|
* query. If fd < 0, the gbm device was opened with the fd provided by the |
||||||
|
* (*get_drm_fd) hook. |
||||||
|
*/ |
||||||
|
struct virgl_gbm { |
||||||
|
int fd; |
||||||
|
struct gbm_device *device; |
||||||
|
}; |
||||||
|
|
||||||
|
struct virgl_gbm *virgl_gbm_init(int fd); |
||||||
|
|
||||||
|
void virgl_gbm_fini(struct virgl_gbm *gbm); |
||||||
|
|
||||||
|
uint32_t virgl_gbm_convert_format(uint32_t virgl_format); |
||||||
|
|
||||||
|
#endif |
Loading…
Reference in new issue