hack
authorMateusz Majewski <m.majewski2@samsung.com>
Fri, 12 Apr 2024 12:42:56 +0000 (14:42 +0200)
committerMateusz Majewski <m.majewski2@samsung.com>
Fri, 12 Apr 2024 12:42:56 +0000 (14:42 +0200)
drivers/gpu/drm/virtio/virtgpu_drv.h
drivers/gpu/drm/virtio/virtgpu_ioctl.c
drivers/gpu/drm/virtio/virtgpu_object.c
include/uapi/drm/virtgpu_drm.h

index 6083966a34a6ef875de26a62c24c3edb29c974ea..1eca54c68ed0e45a7c6806ed792f74da6ece5a17 100644 (file)
@@ -95,6 +95,8 @@ struct virtio_gpu_object {
 
        int uuid_state;
        uuid_t uuid;
+
+       uint32_t width, height, format;
 };
 #define gem_to_virtio_gpu_obj(gobj) \
        container_of((gobj), struct virtio_gpu_object, base.base)
@@ -277,7 +279,7 @@ struct virtio_gpu_fpriv {
 };
 
 /* virtgpu_ioctl.c */
-#define DRM_VIRTIO_NUM_IOCTLS 12
+#define DRM_VIRTIO_NUM_IOCTLS 13
 extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS];
 void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file);
 
index bc8c1e9a845fde80d62c8ec821488ec3366112d7..d277f1160c7ea6e602cedd4e87858e53bf94997d 100644 (file)
@@ -856,6 +856,51 @@ out_unlock:
        return ret;
 }
 
+static int virtio_gpu_brutal_hack(struct drm_device *dev, void *data,
+                                         struct drm_file *file)
+{
+       struct drm_virtgpu_brutal_hack *bh = data;
+       struct drm_gem_object *gobj = NULL;
+       struct virtio_gpu_object *qobj = NULL;
+
+       printk("*** a\n");
+
+       gobj = drm_gem_object_lookup(file, bh->bo_handle);
+       if (gobj == NULL) {
+               printk("*** ENOENT\n");
+               return -ENOENT;
+       }
+
+       printk("*** b\n");
+
+       qobj = gem_to_virtio_gpu_obj(gobj);
+
+       bh->width = qobj->width;
+       bh->height = qobj->height;
+       bh->pitch = qobj->width * 4;
+       switch (qobj->format) {
+       case VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM:
+               bh->format = DRM_FORMAT_XRGB8888;
+               break;
+       case VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM:
+               bh->format = DRM_FORMAT_ARGB8888;
+               break;
+       case VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM:
+               bh->format = DRM_FORMAT_BGRX8888;
+               break;
+       case VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM:
+               bh->format = DRM_FORMAT_BGRA8888;
+               break;
+       default:
+               bh->format = 0;
+               break;
+       }
+
+       printk("*** c\n");
+       drm_gem_object_put(gobj);
+       return 0;
+}
+
 struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
        DRM_IOCTL_DEF_DRV(VIRTGPU_MAP, virtio_gpu_map_ioctl,
                          DRM_RENDER_ALLOW),
@@ -895,4 +940,7 @@ struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = {
 
        DRM_IOCTL_DEF_DRV(VIRTGPU_CONTEXT_INIT, virtio_gpu_context_init_ioctl,
                          DRM_RENDER_ALLOW),
+
+       DRM_IOCTL_DEF_DRV(VIRTGPU_BRUTAL_HACK, virtio_gpu_brutal_hack,
+                         DRM_RENDER_ALLOW),
 };
index c7e74cf130221bbed3aa447e416065b03bf3e2b4..26674db04b7036675bc6158ec09fbc2629e099af 100644 (file)
@@ -234,6 +234,16 @@ int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
                virtio_gpu_object_attach(vgdev, bo, ents, nents);
        }
 
+       if (!params->blob) {
+               bo->width = params->width;
+               bo->height = params->height;
+               bo->format = params->format;
+       } else {
+               bo->width = 0;
+               bo->height = 0;
+               bo->format = 0;
+       }
+
        *bo_ptr = bo;
        return 0;
 
index 7b158fcb02b4557f423470fe3bbf709d2355f5dd..75ef4b4b09c2ef9c5e5f457b23fe5de4f097d91f 100644 (file)
@@ -48,6 +48,7 @@ extern "C" {
 #define DRM_VIRTGPU_GET_CAPS  0x09
 #define DRM_VIRTGPU_RESOURCE_CREATE_BLOB 0x0a
 #define DRM_VIRTGPU_CONTEXT_INIT 0x0b
+#define DRM_VIRTGPU_BRUTAL_HACK 0x0c
 
 #define VIRTGPU_EXECBUF_FENCE_FD_IN    0x01
 #define VIRTGPU_EXECBUF_FENCE_FD_OUT   0x02
@@ -197,6 +198,14 @@ struct drm_virtgpu_context_init {
        __u64 ctx_set_params;
 };
 
+struct drm_virtgpu_brutal_hack {
+       __u32 bo_handle;
+       __u32 width;
+       __u32 height;
+       __u32 pitch;
+       __u32 format;
+};
+
 /*
  * Event code that's given when VIRTGPU_CONTEXT_PARAM_POLL_RINGS_MASK is in
  * effect.  The event size is sizeof(drm_event), since there is no additional
@@ -247,6 +256,10 @@ struct drm_virtgpu_context_init {
        DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_CONTEXT_INIT,           \
                struct drm_virtgpu_context_init)
 
+#define DRM_IOCTL_VIRTGPU_BRUTAL_HACK                                  \
+       DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_BRUTAL_HACK,            \
+               struct drm_virtgpu_brutal_hack)
+
 #if defined(__cplusplus)
 }
 #endif