gfxstream: guest: plumb descriptor all the way through the HostConnection

A descriptor is an int32_t number.  Anything >= 0
is considered a valid descriptor.  It essentially like
a fd, but it will be used with kumquat testing.

Reviewed-by: Aaron Ruby <aruby@blackberry.com>
Acked-by: Yonggang Luo <luoyonggang@gmail.com>
Acked-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27246>
This commit is contained in:
Gurchetan Singh
2024-08-01 15:42:41 -07:00
committed by Marge Bot
parent 6785aae717
commit 0f7101a5dc
5 changed files with 33 additions and 28 deletions

View File

@@ -23,7 +23,7 @@ static VirtGpuDevice* sDevice = nullptr;
} // namespace
VirtGpuDevice* VirtGpuDevice::getInstance(enum VirtGpuCapset capset) {
VirtGpuDevice* VirtGpuDevice::getInstance(enum VirtGpuCapset capset, int32_t descriptor) {
// If kCapsetNone is passed, we return a device that was created with any capset.
// Otherwise, the created device's capset must match the requested capset.
// We could support multiple capsets with a map of devices but that case isn't needed
@@ -34,7 +34,7 @@ VirtGpuDevice* VirtGpuDevice::getInstance(enum VirtGpuCapset capset) {
return nullptr;
}
if (!sDevice) {
sDevice = createPlatformVirtGpuDevice(capset);
sDevice = createPlatformVirtGpuDevice(capset, descriptor);
}
return sDevice;
}

View File

@@ -95,11 +95,10 @@ int FuchsiaVirtGpuDevice::execBuffer(struct VirtGpuExecBuffer& execbuffer,
struct VirtGpuCaps FuchsiaVirtGpuDevice::getCaps(void) { return {}; }
VirtGpuDevice* createPlatformVirtGpuDevice(enum VirtGpuCapset capset, int fd) {
VirtGpuDevice* createPlatformVirtGpuDevice(enum VirtGpuCapset capset, int32_t descriptor) {
// We don't handle the VirtioGpuPipeStream case.
if (fd >= 0) {
if (descriptor >= 0) {
ALOGE("Fuchsia: fd not handled");
abort();
return nullptr;
}

View File

@@ -141,6 +141,8 @@ struct VirtGpuCaps {
struct composerCapset composerCapset;
};
#define INVALID_DESCRIPTOR -1
class VirtGpuResourceMapping;
class VirtGpuResource;
using VirtGpuResourcePtr = std::shared_ptr<VirtGpuResource>;
@@ -177,28 +179,29 @@ class VirtGpuResourceMapping {
class VirtGpuDevice {
public:
static VirtGpuDevice* getInstance(enum VirtGpuCapset capset = kCapsetNone);
static void resetInstance();
static VirtGpuDevice* getInstance(enum VirtGpuCapset capset = kCapsetNone,
int32_t descriptor = INVALID_DESCRIPTOR);
static void resetInstance();
VirtGpuDevice(enum VirtGpuCapset capset) : mCapset(capset) {}
virtual ~VirtGpuDevice() {}
VirtGpuDevice(enum VirtGpuCapset capset) : mCapset(capset) {}
virtual ~VirtGpuDevice() {}
enum VirtGpuCapset capset() { return mCapset; }
enum VirtGpuCapset capset() { return mCapset; }
virtual int64_t getDeviceHandle(void) = 0;
virtual int64_t getDeviceHandle(void) = 0;
virtual struct VirtGpuCaps getCaps(void) = 0;
virtual struct VirtGpuCaps getCaps(void) = 0;
virtual VirtGpuResourcePtr createBlob(const struct VirtGpuCreateBlob& blobCreate) = 0;
virtual VirtGpuResourcePtr createResource(uint32_t width, uint32_t height, uint32_t stride,
uint32_t size, uint32_t virglFormat, uint32_t target,
uint32_t bind) = 0;
virtual VirtGpuResourcePtr importBlob(const struct VirtGpuExternalHandle& handle) = 0;
virtual VirtGpuResourcePtr createBlob(const struct VirtGpuCreateBlob& blobCreate) = 0;
virtual VirtGpuResourcePtr createResource(uint32_t width, uint32_t height, uint32_t stride,
uint32_t size, uint32_t virglFormat, uint32_t target,
uint32_t bind) = 0;
virtual VirtGpuResourcePtr importBlob(const struct VirtGpuExternalHandle& handle) = 0;
virtual int execBuffer(struct VirtGpuExecBuffer& execbuffer, const VirtGpuResource* blob) = 0;
virtual int execBuffer(struct VirtGpuExecBuffer& execbuffer, const VirtGpuResource* blob) = 0;
private:
enum VirtGpuCapset mCapset;
private:
enum VirtGpuCapset mCapset;
};
VirtGpuDevice* createPlatformVirtGpuDevice(enum VirtGpuCapset capset = kCapsetNone, int fd = -1);

View File

@@ -32,7 +32,8 @@
static inline uint32_t align_up(uint32_t n, uint32_t a) { return ((n + a - 1) / a) * a; }
VirtGpuKumquatDevice::VirtGpuKumquatDevice(enum VirtGpuCapset capset, int) : VirtGpuDevice(capset) {
VirtGpuKumquatDevice::VirtGpuKumquatDevice(enum VirtGpuCapset capset, int32_t descriptor)
: VirtGpuDevice(capset) {
struct VirtGpuParam params[] = {
PARAM(VIRTGPU_KUMQUAT_PARAM_3D_FEATURES),
PARAM(VIRTGPU_KUMQUAT_PARAM_CAPSET_QUERY_FIX),
@@ -46,6 +47,7 @@ VirtGpuKumquatDevice::VirtGpuKumquatDevice(enum VirtGpuCapset capset, int) : Vir
PARAM(VIRTGPU_KUMQUAT_PARAM_CREATE_GUEST_HANDLE),
};
(void)descriptor;
int ret;
struct drm_kumquat_get_caps get_caps = {0};
struct drm_kumquat_context_init init = {0};
@@ -240,6 +242,6 @@ int VirtGpuKumquatDevice::execBuffer(struct VirtGpuExecBuffer& execbuffer,
return 0;
}
VirtGpuDevice* createPlatformVirtGpuDevice(enum VirtGpuCapset capset, int fd) {
return new VirtGpuKumquatDevice(capset, fd);
VirtGpuDevice* createPlatformVirtGpuDevice(enum VirtGpuCapset capset, int32_t descriptor) {
return new VirtGpuKumquatDevice(capset, descriptor);
}

View File

@@ -39,7 +39,8 @@
static inline uint32_t align_up(uint32_t n, uint32_t a) { return ((n + a - 1) / a) * a; }
LinuxVirtGpuDevice::LinuxVirtGpuDevice(enum VirtGpuCapset capset, int fd) : VirtGpuDevice(capset) {
LinuxVirtGpuDevice::LinuxVirtGpuDevice(enum VirtGpuCapset capset, int32_t descriptor)
: VirtGpuDevice(capset) {
struct VirtGpuParam params[] = {
PARAM(VIRTGPU_PARAM_3D_FEATURES), PARAM(VIRTGPU_PARAM_CAPSET_QUERY_FIX),
PARAM(VIRTGPU_PARAM_RESOURCE_BLOB), PARAM(VIRTGPU_PARAM_HOST_VISIBLE),
@@ -61,14 +62,14 @@ LinuxVirtGpuDevice::LinuxVirtGpuDevice(enum VirtGpuCapset capset, int fd) : Virt
processName = getprogname();
#endif
if (fd < 0) {
if (descriptor < 0) {
mDeviceHandle = static_cast<int64_t>(drmOpenRender(128));
if (mDeviceHandle < 0) {
ALOGE("Failed to open rendernode: %s", strerror(errno));
return;
}
} else {
mDeviceHandle = dup(fd);
mDeviceHandle = dup(descriptor);
if (mDeviceHandle < 0) {
ALOGE("Failed to dup rendernode: %s", strerror(errno));
return;
@@ -257,6 +258,6 @@ int LinuxVirtGpuDevice::execBuffer(struct VirtGpuExecBuffer& execbuffer,
return 0;
}
VirtGpuDevice* createPlatformVirtGpuDevice(enum VirtGpuCapset capset, int fd) {
return new LinuxVirtGpuDevice(capset, fd);
VirtGpuDevice* createPlatformVirtGpuDevice(enum VirtGpuCapset capset, int32_t descriptor) {
return new LinuxVirtGpuDevice(capset, descriptor);
}