1b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergName 2b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 3b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg MESA_drm_image 4b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 5b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergName Strings 6b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 7b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_MESA_drm_image 8b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 9b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergContact 10b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 11b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Kristian Høgsberg <krh@bitplanet.net> 12b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 13b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergStatus 14b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 15b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Proposal 16b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 17b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergVersion 18b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 19b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Version 2, August 25, 2010 20b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 21b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergNumber 22b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 23b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL Extension #not assigned 24b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 25b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergDependencies 26b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 27ae5776c41f12515bb73c07ee2a0aed56cdd1a1efNicolas Kaiser Requires EGL 1.4 or later. This extension is written against the 28b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg wording of the EGL 1.4 specification. 29b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 30b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_KHR_base_image is required. 31b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 32b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergOverview 33b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 34b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg This extension provides entry points for integrating EGLImage with the 35b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Linux DRM mode setting and memory management drivers. The extension 36b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg lets applications create EGLImages without a client API resource and 37b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg lets the application get the DRM buffer handles. 38b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 39b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergIP Status 40b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 41b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Open-source; freely implementable. 42b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 43b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergNew Procedures and Functions 44b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 45b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLImageKHR eglCreateDRMImageMESA(EGLDisplay dpy, 46b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg const EGLint *attrib_list); 47b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 48b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLBoolean eglExportDRMImageMESA(EGLDisplay dpy, 49b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLImageKHR image, 50b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLint *name, 51b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLint *handle, 52b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLint *stride); 53b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 54b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergNew Tokens 55b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 56b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Accepted in the <attrib_list> parameter of eglCreateDRMImageMESA: 57b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 58b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 59b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_USE_MESA 0x31D1 60b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 61b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Accepted as values for the EGL_IMAGE_FORMAT_MESA attribute: 62b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 63b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 64b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 65b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Bits accepted in EGL_DRM_BUFFER_USE_MESA: 66b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 67b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x0001 68b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_USE_SHARE_MESA 0x0002 69e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg EGL_DRM_BUFFER_USE_CURSOR_MESA 0x0004 70b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 71b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Accepted in the <target> parameter of eglCreateImageKHR: 72b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 73b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_MESA 0x31D3 74b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 75b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Use when importing drm buffer: 76b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 77b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 78b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 79b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 80b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergAdditions to the EGL 1.4 Specification: 81b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 82b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg To create a DRM EGLImage, call 83b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 84b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLImageKHR eglCreateDRMImageMESA(EGLDisplay dpy, 85b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg const EGLint *attrib_list); 86b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 877db49853f07dc62d76c7f00ab19b672e16604260Kristian Høgsberg In the attribute list, pass EGL_WIDTH, EGL_HEIGHT and format and 88b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg use in the attrib list using EGL_DRM_BUFFER_FORMAT_MESA and 89b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_USE_MESA. The only format specified by this 90b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg extension is EGL_DRM_BUFFER_FORMAT_ARGB32_MESA, where each pixel 91b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg is a CPU-endian, 32-bit quantity, with alpha in the upper 8 bits, 92b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg then red, then green, then blue. The bit values accepted by 93e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg EGL_DRM_BUFFER_USE_MESA are EGL_DRM_BUFFER_USE_SCANOUT_MESA, 94e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg EGL_DRM_BUFFER_USE_SHARE_MESA and EGL_DRM_BUFFER_USE_CURSOR_MESA. 95e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg EGL_DRM_BUFFER_USE_SCANOUT_MESA requests that the created EGLImage 96e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg should be usable as a scanout buffer with the DRM kernel 97e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg modesetting API. EGL_DRM_BUFFER_USE_SHARE_MESA requests that the 98e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg EGLImage can be shared with other processes by passing the 99e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg underlying DRM buffer name. EGL_DRM_BUFFER_USE_CURSOR_MESA 100e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg requests that the image must be usable as a cursor with KMS. When 101e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg EGL_DRM_BUFFER_USE_CURSOR_MESA is set, width and height must both 102e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg be 64. 103b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 104b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg To create a process local handle or a global DRM name for a 105b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg buffer, call 106b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 107b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLBoolean eglExportDRMImageMESA(EGLDisplay dpy, 108b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLImageKHR image, 109b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLint *name, 110b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLint *handle, 111b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLint *stride); 112b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 113b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg If <name> is non-NULL, a global name is assigned to the image and 114b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg written to <name>, the handle (local to the DRM file descriptor, 115b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg for use with DRM kernel modesetting API) is written to <handle> if 116b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg non-NULL and the stride (in bytes) is written to <stride>, if 117b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg non-NULL. 118b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 119b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Import a shared buffer by calling eglCreateImageKHR with 120b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_MESA as the target, using EGL_WIDTH, EGL_HEIGHT, 121b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_STRIDE_MESA 122b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg in the attrib list. 123b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 124b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergIssues 125b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 126b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1. Why don't we use eglCreateImageKHR with a target that 127b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg indicates that we want to create an EGLImage from scratch? 128b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 129b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg RESOLVED: The eglCreateImageKHR entry point is reserved for 130b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg creating an EGLImage from an already existing client API 131b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg resource. This is fine when we're creating the EGLImage from 132b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg an existing DRM buffer name, it doesn't seem right to overload 133b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg the function to also allocate the underlying resource. 134b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 135b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 2. Why don't we use an eglQueryImageMESA type functions for 136b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg querying the DRM EGLImage attributes (name, handle, and stride)? 137b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 138b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg RESOLVED: The eglQueryImage function has been proposed often, 139b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg but it goes against the EGLImage design. EGLImages are opaque 140b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg handles to a 2D array of pixels, which can be passed between 141ae5776c41f12515bb73c07ee2a0aed56cdd1a1efNicolas Kaiser client APIs. By referencing an EGLImage in a client API, the 142b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLImage target (a texture, a renderbuffer or such) can be 143b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg used to query the attributes of the EGLImage. We don't have a 144b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg full client API for creating and querying DRM buffers, though, 145b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg so we use a new EGL extension entry point instead. 146b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 147b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergRevision History 148b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 149b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Version 1, June 3, 2010 150b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Initial draft (Kristian Høgsberg) 151b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Version 2, August 25, 2010 152b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg Flesh out the extension a bit, add final EGL tokens, capture 153b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg some of the original discussion in the issues section. 154