| Name |
| |
| IMG_use_gralloc_ptr |
| |
| Name Strings |
| |
| cl_img_use_gralloc_ptr |
| |
| Contributors |
| |
| Robert Quill |
| |
| Contacts |
| |
| Rob Quill, Imagination Technologies (robert.quill 'at' imgtec.com) |
| |
| Status |
| |
| Unapproved. |
| |
| Version |
| |
| Revision: #8, Dec 16, 2013 |
| |
| Number |
| |
| OpenCL Extension #45 |
| |
| Dependencies |
| |
| Requires OpenCL version 1.2 or later. Android OS is required. |
| |
| This extension is written against the wording of the OpenCL 1.2 |
| Specification. |
| |
| Overview |
| |
| This extension extends the functionality provided by clCreateBuffer. |
| It allows applications to pass an Android gralloc memory allocation to these functions |
| and thus avoid having to copy data back and forth between the host and the device. |
| |
| Glossary |
| |
| See https://source.android.com/devices/graphics/architecture.html for a |
| description of the Android gralloc API. |
| |
| New Types |
| |
| None |
| |
| New Procedures and Functions |
| |
| cl_int clEnqueueAcquireGrallocObjectsIMG(cl_command_queue command_queue, |
| cl_uint num_objects, |
| const cl_mem *mem_objects, |
| cl_uint num_events_in_wait_list, |
| const cl_event *event_wait_list, |
| cl_event *event); |
| |
| cl_int clEnqueueReleaseGrallocObjectsIMG(cl_command_queue command_queue, |
| cl_uint num_objects, |
| const cl_mem *mem_objects, |
| cl_uint num_events_in_wait_list, |
| const cl_event *event_wait_list, |
| cl_event *event); |
| |
| New Tokens |
| |
| New error codes: |
| |
| CL_GRALLOC_RESOURCE_NOT_ACQUIRED_IMG 0x40D4 |
| CL_INVALID_GRALLOC_OBJECT_IMG 0x40D5 |
| |
| New command types: |
| |
| CL_COMMAND_ACQUIRE_GRALLOC_OBJECTS_IMG 0x40D2 |
| CL_COMMAND_RELEASE_GRALLOC_OBJECTS_IMG 0x40D3 |
| |
| |
| Additions to Chapter 5 of the OpenCL 1.2 Specification (Memory Objects) |
| |
| In Table 5.3, page 69, add the following text as a new row in the table: |
| |
| "CL_MEM_USE_GRALLOC_PTR_IMG |
| |
| This flag is only valid of <host_ptr> is non-NULL. The value given in |
| <host_ptr> is an Android buffer_handle_t. |
| |
| If this flag is specified it means that the application wants the |
| OpenCL implementation to use memory referenced by the buffer_handle_t |
| as the storage bits for the memory object. |
| |
| <size> must be 0 if this flag is set. The size of the buffer is determined |
| from the size of the gralloc allocation. |
| |
| This flag is only valid when using clCreateBuffer." |
| |
| Add the following error conditions to the list after this section: |
| |
| clCreateBuffer returns a valid non-zero buffer object and errcode_ret is set |
| to CL_SUCCESS if the buffer object is created successfully. Otherwise, it |
| returns a NULL value with one of the following error values returned in |
| errcode_ret: |
| |
| "CL_INVALID_BUUFER_SIZE |
| - if <size> is non-zero and <flags> contains CL_MEM_USE_GRALLOC_PTR_IMG" |
| |
| Replace the follow paragraph: |
| |
| "CL_INVALID_HOST_PTR if host_ptr is NULL and CL_MEM_USE_HOST_PTR or |
| CL_MEM_COPY_HOST_PTR are set in flags or if host_ptr is not NULL but |
| CL_MEM_COPY_HOST_PTR or CL_MEM_USE_HOST_PTR are not set in flags." |
| |
| with: |
| |
| "CL_INVALID_HOST_PTR if host_ptr is NULL and CL_MEM_USE_HOST_PTR, |
| CL_MEM_COPY_HOST_PTR or CL_MEM_USE_GRALLOC_PTR_IMG are set in flags |
| or if host_ptr is not NULL but CL_MEM_COPY_HOST_PTR, CL_MEM_USE_HOST_PTR |
| or CL_MEM_USE_GRALLOC_PTR_IMG are not set in flags." |
| |
| |
| Add: |
| |
| "9.19 Sharing OpenCL and gralloc objects |
| |
| 9.19.1 Synchronizing OpenCL and Android Access to Shared Gralloc Objects |
| |
| In order to ensure data integrity, the application is responsible for |
| synchronizing access to shared CL/gralloc objects by their respective APIs. |
| Failure to provide such synchronization may result in race conditions and |
| other undefined behavior including non-portability between implementations. |
| |
| Prior to calling clEnqueueAcquireGrallocObjectsIMG, the application must |
| ensure that any pending operations which access the objects specified in |
| mem_objects have completed. This may be accomplished in a portable way by |
| ceasing all client operations on the resource. Implementations may offer |
| more efficient synchronization methods, such as synchronisation primitives |
| or fence operations. |
| |
| Similarly, after calling clEnqueueReleaseGrallocObjectsIMG, the application |
| is responsible for ensuring that any pending OpenCL operations which access |
| the objects specified in mem_objects have completed prior to executing |
| subsequent commands in other APIs which reference these objects. This may |
| be accomplished in a portable way by calling clWaitForEvents with the event |
| object returned by clEnqueueReleaseGrallocObjects, or by calling clFinish. As |
| above, some implementations may offer more efficient methods. |
| |
| Attempting to access the data store of a gralloc allocation after it has |
| been acquired by OpenCL and before it has been released will result in |
| undefined behavior. Similarly, attempting to access a shared gralloc |
| object from OpenCL before it has been acquired by the OpenCL command queue |
| or after it has been released, will result in undefined behavior. |
| |
| |
| 9.19.2 Sharing memory objects created from gralloc resources with OpenCL contexts |
| |
| The function |
| |
| cl_int clEnqueueAcquireGrallocObjectsIMG( |
| cl_command_queue command_queue, |
| cl_uint num_objects, |
| const cl_mem *mem_objects, |
| cl_uint num_events_in_wait_list, |
| const cl_event *event_wait_list, |
| cl_event *event) |
| |
| is used to acquire OpenCL memory objects that have been created from |
| gralloc resources. The gralloc objects are acquired by the OpenCL context |
| associated with <command_queue> and can therefore be used by all |
| command-queues associated with the OpenCL context. |
| |
| OpenCL memory objects created from gralloc resources must be acquired |
| before they can be used by any OpenCL commands queued to a |
| command-queue. If an OpenCL memory object created from a gralloc |
| resource is used while it is not currently acquired by OpenCL, the |
| call attempting to use that OpenCL memory object will return |
| CL_GRALLOC_RESOURCE_NOT_ACQUIRED_IMG. |
| |
| This function has no affect on memory objects in <mem_objects> |
| that have already been acquired, ignoring them silently. The |
| function returns CL_SUCCESS even if all of the memory objects are |
| ignored in this way. |
| |
| <command_queue> is a valid command-queue. |
| |
| <num_objects> is the number of memory objects to be acquired in |
| <mem_objects>. |
| |
| <mem_objects> is a pointer to a list of OpenCL memory objects that |
| were created from gralloc resources, within the context associate with |
| <command_queue>. |
| |
| <event_wait_list> and <num_events_in_wait_list> specify events that |
| need to complete before this particular command can be executed. If |
| <event_wait_list> is NULL, then this particular command does not |
| wait on any event to complete. If <event_wait_list> is NULL, |
| <num_events_in_wait_list> must be 0. If <event_wait_list> is not |
| NULL, the list of events pointed to by <event_wait_list> must be |
| valid and <num_events_in_wait_list> must be greater than 0. The |
| events specified in <event_wait_list> act as synchronization points. |
| |
| <event> returns an event object that identifies this particular |
| command and can be used to query or queue a wait for this |
| particular command to complete. <event> can be NULL in which case it |
| will not be possible for the application to query the status of this |
| command or queue a wait for this command to complete. |
| |
| clEnqueueAcquireGrallocObjectsIMG returns CL_SUCCESS if the function is |
| executed successfully. If <num_objects> is 0 and <mem_objects> is |
| NULL then the function does nothing and returns CL_SUCCESS. Otherwise it |
| returns one of the following errors: |
| |
| * CL_INVALID_VALUE if <num_objects> is zero and <mem_objects> is |
| not a NULL value or if <num_objects> > 0 and <mem_objects> is |
| NULL. |
| |
| * CL_INVALID_MEM_OBJECT if memory objects in <mem_objects> are not |
| valid OpenCL memory objects in the context associated with |
| <command_queue>. |
| |
| * CL_INVALID_GRALLOC_OBJECT_IMG if memory objects in <mem_objects> have |
| not been created from gralloc resources. |
| |
| * CL_INVALID_COMMAND_QUEUE if <command_queue> is not a valid |
| command-queue. |
| |
| * CL_INVALID_EVENT_WAIT_LIST if <event_wait_list> is NULL and |
| <num_events_in_wait_list> > 0, or <event_wait_list> is not NULL |
| and <num_events_in_wait_list> is 0, or if event objects in |
| <event_wait_list> are not valid events. |
| |
| * CL_OUT_OF_RESOURCES if there is a failure to allocate resources |
| required by the OpenCL implementation on the device. |
| |
| * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources |
| required by the OpenCL implementation on the host. |
| |
| * CL_INVALID_OPERATION if the queue on which the command is enqueued |
| is associated with a device which does not support cl_img_use_gralloc_ptr. |
| |
| The function |
| |
| cl_int clEnqueueReleaseGrallocObjectsIMG( |
| cl_command_queue command_queue, |
| cl_uint num_objects, |
| const cl_mem *mem_objects, |
| cl_uint num_events_in_wait_list, |
| const cl_event *event_wait_list, |
| cl_event *event) |
| |
| is used to release OpenCL memory objects that have been created from |
| gralloc resources. The gralloc objects are released by the OpenCL context |
| associated with <command_queue>. |
| |
| OpenCL memory objects created from gralloc resources which have been |
| acquired by OpenCL must be released by OpenCL before they may be |
| accessed by Android client APIs. Accessing a gralloc resource |
| while its corresponding OpenCL memory object is acquired is in error |
| and will result in undefined behavior, including but not limited to |
| possible OpenCL errors, data corruption, and program termination. |
| |
| <command_queue> is a valid command-queue. |
| |
| <mem_objects> is a pointer to a list of OpenCL memory objects that |
| were created from gralloc resources, within the context associated with |
| <command_queue>. |
| |
| <event_wait_list> and <num_events_in_wait_list> specify events that |
| need to complete before this particular command can be executed. If |
| <event_wait_list> is NULL, then this particular command does not |
| wait on any event to complete. If <event_wait_list> is NULL, |
| <num_events_in_wait_list> must be 0. If <event_wait_list> is not |
| NULL, the list of events pointed to by <event_wait_list> must be |
| valid and <num_events_in_wait_list> must be greater than 0. |
| |
| <event> returns an event object that identifies this particular |
| command and can be used to query or queue a wait for this |
| particular command to complete. <event> can be NULL in which case it |
| will not be possible for the application to query the status of this |
| command or queue a wait for this command to complete. |
| |
| clEnqueueReleaseGrallocObjectsIMG returns CL_SUCCESS if the function |
| is executed successfully. If <num_objects> is 0 and <mem_objects> is |
| NULL the function does nothing and returns CL_SUCCESS. Otherwise it |
| returns one of the following errors: |
| |
| * CL_INVALID_VALUE if <num_objects> is zero and <mem_objects> is |
| not a NULL value or if <num_objects> > 0 and <mem_objects> is |
| NULL. |
| |
| * CL_INVALID_MEM_OBJECT if memory objects in <mem_objects> are not |
| valid OpenCL memory objects in the context associated with |
| <command_queue>. |
| |
| * CL_INVALID_GRALLOC_OBJECT_IMG if memory objects in <mem_objects> have |
| not been created from gralloc resources. |
| |
| * CL_INVALID_COMMAND_QUEUE if <command_queue> is not a valid |
| command-queue. |
| |
| * CL_GRALLOC_RESOURCE_NOT_ACQUIRED_IMG if memory objects in |
| <mem_objects> have not previously acquired with |
| clEnqueueAcquireGrallocObjectsIMG, or have been released using |
| clEnqueueReleaseGrallocObjectsIMG since the last time that they were |
| acquired. |
| |
| * CL_INVALID_EVENT_WAIT_LIST if <event_wait_list> is NULL and |
| <num_events_in_wait_list> > 0, or <event_wait_list> is not NULL |
| and <num_events_in_wait_list> is 0, or if event objects in |
| <event_wait_list> are not valid events. |
| |
| * CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the |
| OpenCL implementation on the device. |
| |
| * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources |
| required by the OpenCL implementation on the host. |
| " |
| |
| Issues |
| |
| 1. This extension does not support reference counting |
| of the images, so the onus is on the application to behave |
| sensibly and not release the underlying cl_mem object while the |
| gralloc object is still being used. |
| |
| 2. In order to ensure data integrity, the application is responsible for |
| synchronizing access to shared CL/gralloc objects by their respective |
| APIs. Failure to provide such synchronization may result in race |
| conditions and other undefined behavior. This may be accomplished by |
| calling clWaitForEvents with the event objects returned by any OpenCL |
| commands which use the shared image object or by calling clFinish. |
| |
| 3. Currently restricted to buffer objects. |
| |
| Revision History |
| |
| #1 - Initial revision. |