0012-implement-buffer-wrapping-interface-for-dispmanx.patch 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. From a09feea5ceb0af717c17a3a7df8a638f8e858f52 Mon Sep 17 00:00:00 2001
  2. From: Khem Raj <raj.khem@gmail.com>
  3. Date: Sat, 2 Apr 2016 10:54:59 -0700
  4. Subject: [PATCH 12/21] implement buffer wrapping interface for dispmanx
  5. Courtesy: Zan Dobersek
  6. Signed-off-by: Khem Raj <raj.khem@gmail.com>
  7. ---
  8. interface/khronos/ext/egl_wayland.c | 42 +++++++++++++++++++++++++++++
  9. interface/wayland/dispmanx.xml | 10 +++++++
  10. 2 files changed, 52 insertions(+)
  11. diff --git a/interface/khronos/ext/egl_wayland.c b/interface/khronos/ext/egl_wayland.c
  12. index 5730743..9ef89cd 100644
  13. --- a/interface/khronos/ext/egl_wayland.c
  14. +++ b/interface/khronos/ext/egl_wayland.c
  15. @@ -133,8 +133,50 @@ dispmanx_create_buffer(struct wl_client *client, struct wl_resource *resource,
  16. buffer->handle);
  17. }
  18. +static void
  19. +dispmanx_wrap_buffer(struct wl_client *client, struct wl_resource *resource,
  20. + uint32_t id, uint32_t handle, int32_t width, int32_t height,
  21. + uint32_t stride, uint32_t buffer_height, uint32_t format)
  22. +{
  23. + struct wl_dispmanx_server_buffer *buffer;
  24. + VC_IMAGE_TYPE_T vc_format = get_vc_format(format);
  25. + uint32_t dummy;
  26. +
  27. + if(vc_format == VC_IMAGE_MIN) {
  28. + wl_resource_post_error(resource,
  29. + WL_DISPMANX_ERROR_INVALID_FORMAT,
  30. + "invalid format");
  31. + return;
  32. + }
  33. +
  34. + buffer = calloc(1, sizeof *buffer);
  35. + if (buffer == NULL) {
  36. + wl_resource_post_no_memory(resource);
  37. + return;
  38. + }
  39. +
  40. + buffer->handle = handle;
  41. + buffer->width = width;
  42. + buffer->height = height;
  43. + buffer->format = format;
  44. +
  45. + buffer->resource = wl_resource_create(resource->client, &wl_buffer_interface,
  46. + 1, id);
  47. + if (!buffer->resource) {
  48. + wl_resource_post_no_memory(resource);
  49. + vc_dispmanx_resource_delete(buffer->handle);
  50. + free(buffer);
  51. + return;
  52. + }
  53. +
  54. + wl_resource_set_implementation(buffer->resource,
  55. + (void (**)(void)) &dispmanx_buffer_interface,
  56. + buffer, destroy_buffer);
  57. +}
  58. +
  59. static const struct wl_dispmanx_interface dispmanx_interface = {
  60. dispmanx_create_buffer,
  61. + dispmanx_wrap_buffer,
  62. };
  63. static void
  64. diff --git a/interface/wayland/dispmanx.xml b/interface/wayland/dispmanx.xml
  65. index c18626d..11ed1ef 100644
  66. --- a/interface/wayland/dispmanx.xml
  67. +++ b/interface/wayland/dispmanx.xml
  68. @@ -118,6 +118,16 @@
  69. <arg name="buffer" type="object" interface="wl_buffer"/>
  70. <arg name="handle" type="uint"/>
  71. </event>
  72. +
  73. + <request name="wrap_buffer">
  74. + <arg name="id" type="new_id" interface="wl_buffer"/>
  75. + <arg name="handle" type="uint"/>
  76. + <arg name="width" type="int"/>
  77. + <arg name="height" type="int"/>
  78. + <arg name="stride" type="uint"/>
  79. + <arg name="buffer_height" type="uint"/>
  80. + <arg name="format" type="uint"/>
  81. + </request>
  82. </interface>
  83. </protocol>
  84. --
  85. 2.27.0