From: Mateusz Majewski Date: Fri, 12 Apr 2024 12:42:56 +0000 (+0200) Subject: hack X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=48c0d14d2fd3951e739330d171aa27d11bad933f;p=sdk%2Femulator%2Femulator-kernel.git hack --- diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h index 6083966a34a6..1eca54c68ed0 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -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); diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index bc8c1e9a845f..d277f1160c7e 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -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), }; diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virtio/virtgpu_object.c index c7e74cf13022..26674db04b70 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c @@ -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; diff --git a/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/virtgpu_drm.h index 7b158fcb02b4..75ef4b4b09c2 100644 --- a/include/uapi/drm/virtgpu_drm.h +++ b/include/uapi/drm/virtgpu_drm.h @@ -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