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    Kristiangsberg <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