Loading libs/nativewindow/include/android/hardware_buffer.h +172 −66 Original line number Diff line number Diff line Loading @@ -15,12 +15,31 @@ */ /** * @addtogroup NativeActivity Native Activity * @{ * @file hardware_buffer.h * @brief API for native hardware buffers. */ /** * @file hardware_buffer.h * @defgroup AHardwareBuffer Native Hardware Buffer * * AHardwareBuffer objects represent chunks of memory that can be * accessed by various hardware components in the system. It can be * easily converted to the Java counterpart * android.hardware.HardwareBuffer and passed between processes using * Binder. All operations involving AHardwareBuffer and HardwareBuffer * are zero-copy, i.e., passing AHardwareBuffer to another process * creates a shared view of the same region of memory. * * AHardwareBuffers can be bound to EGL/OpenGL and Vulkan primitives. * For EGL, use the extension function eglGetNativeClientBufferANDROID * to obtain an EGLClientBuffer and pass it directly to * eglCreateImageKHR. Refer to the EGL extensions * EGL_ANDROID_get_native_client_buffer and * EGL_ANDROID_image_native_buffer for more information. In Vulkan, * the contents of the AHardwareBuffer can be accessed as external * memory. See the VK_ANDROID_external_memory_android_hardware_buffer * extension for details. * * @{ */ #ifndef ANDROID_HARDWARE_BUFFER_H Loading @@ -37,7 +56,7 @@ __BEGIN_DECLS /** * Buffer pixel formats. */ enum { enum AHardwareBuffer_Format { /** * Corresponding formats: * Vulkan: VK_FORMAT_R8G8B8A8_UNORM Loading Loading @@ -83,8 +102,10 @@ enum { AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM = 0x2b, /** * An opaque binary blob format that must have height 1, with width equal to * the buffer size in bytes. * Opaque binary blob format. * Must have height 1 and one layer, with width equal to the buffer * size in bytes. Corresponds to Vulkan buffers and OpenGL buffer * objects. Can be bound to the latter using GL_EXT_external_buffer. */ AHARDWAREBUFFER_FORMAT_BLOB = 0x21, Loading Loading @@ -134,21 +155,39 @@ enum { /** * Buffer usage flags, specifying how the buffer will be accessed. */ enum { /// The buffer will never be read by the CPU. enum AHardwareBuffer_UsageFlags { /// The buffer will never be locked for direct CPU reads using the /// AHardwareBuffer_lock() function. Note that reading the buffer /// using OpenGL or Vulkan functions or memory mappings is still /// allowed. AHARDWAREBUFFER_USAGE_CPU_READ_NEVER = 0UL, /// The buffer will sometimes be read by the CPU. /// The buffer will sometimes be locked for direct CPU reads using /// the AHardwareBuffer_lock() function. Note that reading the /// buffer using OpenGL or Vulkan functions or memory mappings /// does not require the presence of this flag. AHARDWAREBUFFER_USAGE_CPU_READ_RARELY = 2UL, /// The buffer will often be read by the CPU. /// The buffer will often be locked for direct CPU reads using /// the AHardwareBuffer_lock() function. Note that reading the /// buffer using OpenGL or Vulkan functions or memory mappings /// does not require the presence of this flag. AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN = 3UL, /// CPU read value mask. AHARDWAREBUFFER_USAGE_CPU_READ_MASK = 0xFUL, /// The buffer will never be written by the CPU. /// The buffer will never be locked for direct CPU writes using the /// AHardwareBuffer_lock() function. Note that writing the buffer /// using OpenGL or Vulkan functions or memory mappings is still /// allowed. AHARDWAREBUFFER_USAGE_CPU_WRITE_NEVER = 0UL << 4, /// The buffer will sometimes be written to by the CPU. /// The buffer will sometimes be locked for direct CPU writes using /// the AHardwareBuffer_lock() function. Note that writing the /// buffer using OpenGL or Vulkan functions or memory mappings /// does not require the presence of this flag. AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY = 2UL << 4, /// The buffer will often be written to by the CPU. /// The buffer will often be locked for direct CPU writes using /// the AHardwareBuffer_lock() function. Note that writing the /// buffer using OpenGL or Vulkan functions or memory mappings /// does not require the presence of this flag. AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN = 3UL << 4, /// CPU write value mask. AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK = 0xFUL << 4, Loading @@ -156,24 +195,51 @@ enum { /// The buffer will be read from by the GPU as a texture. AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE = 1UL << 8, /** * The buffer will be written to by the GPU as a framebuffer attachment. * Note that the name of this flag is somewhat misleading: it does not imply * that the buffer contains a color format. A buffer with depth or stencil * format that will be used as a framebuffer attachment should also have * this flag. * The buffer will be written to by the GPU as a framebuffer * attachment. * * Note that the name of this flag is somewhat misleading: it does * not imply that the buffer contains a color format. A buffer with * depth or stencil format that will be used as a framebuffer * attachment should also have this flag. */ AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT = 1UL << 9, /// The buffer must not be used outside of a protected hardware path. /** * The buffer is protected from direct CPU access or being read by * non-secure hardware, such as video encoders. * * This flag is incompatible with CPU read and write flags. It is * mainly used when handling DRM video. Refer to the EGL extension * EGL_EXT_protected_content and GL extension * GL_EXT_protected_textures for more information on how these * buffers are expected to behave. */ AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT = 1UL << 14, /// The buffer will be read by a hardware video encoder. AHARDWAREBUFFER_USAGE_VIDEO_ENCODE = 1UL << 16, /// The buffer will be used for direct writes from sensors. /** * The buffer will be used for direct writes from sensors. * When this flag is present, the format must be AHARDWAREBUFFER_FORMAT_BLOB. */ AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA = 1UL << 23, /// The buffer will be used as a shader storage or uniform buffer object. /** * The buffer will be used as a shader storage or uniform buffer object. * When this flag is present, the format must be AHARDWAREBUFFER_FORMAT_BLOB. */ AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER = 1UL << 24, /// The buffer will be used as a cube map texture. /** * The buffer will be used as a cube map texture. * When this flag is present, the buffer must have a layer count * that is a multiple of 6. Note that buffers with this flag must be * bound to OpenGL textures using the extension * GL_EXT_EGL_image_storage instead of GL_KHR_EGL_image. */ AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP = 1UL << 25, /// The buffer contains a complete mipmap hierarchy. /** * The buffer contains a complete mipmap hierarchy. * Note that buffers with this flag must be bound to OpenGL textures using * the extension GL_EXT_EGL_image_storage instead of GL_KHR_EGL_image. */ AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE = 1UL << 26, AHARDWAREBUFFER_USAGE_VENDOR_0 = 1ULL << 28, Loading @@ -199,27 +265,42 @@ enum { }; /** * Buffer description. Used for allocating new buffers and querying parameters * of existing ones. * Buffer description. Used for allocating new buffers and querying * parameters of existing ones. */ typedef struct AHardwareBuffer_Desc { uint32_t width; ///< Width in pixels. uint32_t height; ///< Height in pixels. uint32_t layers; ///< Number of images in an image array. uint32_t format; ///< One of AHARDWAREBUFFER_FORMAT_* uint64_t usage; ///< Combination of AHARDWAREBUFFER_USAGE_* /** * Number of images in an image array. AHardwareBuffers with one * layer correspond to regular 2D textures. AHardwareBuffers with * more than layer correspond to texture arrays. If the layer count * is a multiple of 6 and the usage flag * AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP is present, the buffer is * a cube map or a cube map array. */ uint32_t layers; uint32_t format; ///< One of AHardwareBuffer_Format. uint64_t usage; ///< Combination of AHardwareBuffer_UsageFlags. uint32_t stride; ///< Row stride in pixels, ignored for AHardwareBuffer_allocate() uint32_t rfu0; ///< Initialize to zero, reserved for future use. uint64_t rfu1; ///< Initialize to zero, reserved for future use. } AHardwareBuffer_Desc; /** * Opaque handle for a native hardware buffer. */ typedef struct AHardwareBuffer AHardwareBuffer; #if __ANDROID_API__ >= 26 /** * Allocates a buffer that backs an AHardwareBuffer using the passed * AHardwareBuffer_Desc. * Allocates a buffer that matches the passed AHardwareBuffer_Desc. * * If allocation succeeds, the buffer can be used according to the * usage flags specified in its description. If a buffer is used in ways * not compatible with its usage flags, the results are undefined and * may include program termination. * * \return 0 on success, or an error number of the allocation fails for * any reason. The returned buffer has a reference count of 1. Loading @@ -227,14 +308,16 @@ typedef struct AHardwareBuffer AHardwareBuffer; int AHardwareBuffer_allocate(const AHardwareBuffer_Desc* desc, AHardwareBuffer** outBuffer) __INTRODUCED_IN(26); /** * Acquire a reference on the given AHardwareBuffer object. This prevents the * object from being deleted until the last reference is removed. * Acquire a reference on the given AHardwareBuffer object. * * This prevents the object from being deleted until the last reference * is removed. */ void AHardwareBuffer_acquire(AHardwareBuffer* buffer) __INTRODUCED_IN(26); /** * Remove a reference that was previously acquired with * AHardwareBuffer_acquire(). * AHardwareBuffer_acquire() or AHardwareBuffer_allocate(). */ void AHardwareBuffer_release(AHardwareBuffer* buffer) __INTRODUCED_IN(26); Loading @@ -246,50 +329,73 @@ void AHardwareBuffer_describe(const AHardwareBuffer* buffer, AHardwareBuffer_Desc* outDesc) __INTRODUCED_IN(26); /** * Lock the AHardwareBuffer for reading or writing, depending on the usage flags * passed. This call may block if the hardware needs to finish rendering or if * CPU caches need to be synchronized, or possibly for other implementation- * specific reasons. If fence is not negative, then it specifies a fence file * descriptor that will be signaled when the buffer is locked, otherwise the * caller will block until the buffer is available. * Lock the AHardwareBuffer for direct CPU access. * * If \a rect is not NULL, the caller promises to modify only data in the area * specified by rect. If rect is NULL, the caller may modify the contents of the * entire buffer. * This function can lock the buffer for either reading or writing. * It may block if the hardware needs to finish rendering, if CPU caches * need to be synchronized, or possibly for other implementation- * specific reasons. * * The content of the buffer outside of the specified rect is NOT modified * by this call. * The passed AHardwareBuffer must have one layer, otherwise the call * will fail. * * The \a usage parameter may only specify AHARDWAREBUFFER_USAGE_CPU_*. If set, * then outVirtualAddress is filled with the address of the buffer in virtual * memory. * If \a fence is not negative, it specifies a fence file descriptor on * which to wait before locking the buffer. If it's negative, the caller * is responsible for ensuring that writes to the buffer have completed * before calling this function. Using this parameter is more efficient * than waiting on the fence and then calling this function. * * The \a usage parameter may only specify AHARDWAREBUFFER_USAGE_CPU_*. * If set, then outVirtualAddress is filled with the address of the * buffer in virtual memory. The flags must also be compatible with * usage flags specified at buffer creation: if a read flag is passed, * the buffer must have been created with * AHARDWAREBUFFER_USAGE_CPU_READ_RARELY or * AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN. If a write flag is passed, it * must have been created with AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY or * AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN. * * THREADING CONSIDERATIONS: * If \a rect is not NULL, the caller promises to modify only data in * the area specified by rect. If rect is NULL, the caller may modify * the contents of the entire buffer. The content of the buffer outside * of the specified rect is NOT modified by this call. * * It is legal for several different threads to lock a buffer for read access; * none of the threads are blocked. * It is legal for several different threads to lock a buffer for read * access; none of the threads are blocked. * * Locking a buffer simultaneously for write or read/write is undefined, but * will neither terminate the process nor block the caller; AHardwareBuffer_lock * may return an error or leave the buffer's content into an indeterminate * state. * Locking a buffer simultaneously for write or read/write is undefined, * but will neither terminate the process nor block the caller. * AHardwareBuffer_lock may return an error or leave the buffer's * content in an indeterminate state. * * \return 0 on success, -EINVAL if \a buffer is NULL or if the usage * flags are not a combination of AHARDWAREBUFFER_USAGE_CPU_*, or an error * number of the lock fails for any reason. * If the buffer has AHARDWAREBUFFER_FORMAT_BLOB, it is legal lock it * for reading and writing in multiple threads and/or processes * simultaneously, and the contents of the buffer behave like shared * memory. * * \return 0 on success. -EINVAL if \a buffer is NULL, the usage flags * are not a combination of AHARDWAREBUFFER_USAGE_CPU_*, or the buffer * has more than one layer. Error number if the lock fails for any other * reason. */ int AHardwareBuffer_lock(AHardwareBuffer* buffer, uint64_t usage, int32_t fence, const ARect* rect, void** outVirtualAddress) __INTRODUCED_IN(26); /** * Unlock the AHardwareBuffer; must be called after all changes to the buffer * are completed by the caller. If fence is not NULL then it will be set to a * file descriptor that is signaled when all pending work on the buffer is * completed. The caller is responsible for closing the fence when it is no * longer needed. * Unlock the AHardwareBuffer from direct CPU access. * * \return 0 on success, -EINVAL if \a buffer is NULL, or an error * number if the unlock fails for any reason. * Must be called after all changes to the buffer are completed by the * caller. If \a fence is NULL, the function will block until all work * is completed. Otherwise, \a fence will be set either to a valid file * descriptor or to -1. The file descriptor will become signaled once * the unlocking is complete and buffer contents are updated. * The caller is responsible for closing the file descriptor once it's * no longer needed. The value -1 indicates that unlocking has already * completed before the function returned and no further operations are * necessary. * * \return 0 on success. -EINVAL if \a buffer is NULL. Error number if * the unlock fails for any reason. */ int AHardwareBuffer_unlock(AHardwareBuffer* buffer, int32_t* fence) __INTRODUCED_IN(26); Loading @@ -302,7 +408,7 @@ int AHardwareBuffer_unlock(AHardwareBuffer* buffer, int32_t* fence) __INTRODUCED int AHardwareBuffer_sendHandleToUnixSocket(const AHardwareBuffer* buffer, int socketFd) __INTRODUCED_IN(26); /** * Receive the AHardwareBuffer from an AF_UNIX socket. * Receive an AHardwareBuffer from an AF_UNIX socket. * * \return 0 on success, -EINVAL if \a outBuffer is NULL, or an error * number if the operation fails for any reason. Loading libs/nativewindow/include/android/native_window.h +10 −4 Original line number Diff line number Diff line Loading @@ -15,7 +15,13 @@ */ /** * @addtogroup NativeActivity Native Activity * @defgroup ANativeWindow Native Window * * ANativeWindow represents the producer end of an image queue. * It is the C counterpart of the android.view.Surface object in Java, * and can be converted both ways. Depending on the consumer, images * submitted to ANativeWindow can be shown on the display or sent to * other consumers, such as video encoders. * @{ */ Loading @@ -41,7 +47,7 @@ extern "C" { * Legacy window pixel format names, kept for backwards compatibility. * New code and APIs should use AHARDWAREBUFFER_FORMAT_*. */ enum { enum ANativeWindow_LegacyFormat { // NOTE: these values must match the values from graphics/common/x.x/types.hal /** Red: 8 bits, Green: 8 bits, Blue: 8 bits, Alpha: 8 bits. **/ Loading Loading @@ -95,7 +101,7 @@ typedef struct ANativeWindow_Buffer { /// memory. This may be >= width. int32_t stride; /// The format of the buffer. One of AHARDWAREBUFFER_FORMAT_* /// The format of the buffer. One of AHardwareBuffer_Format. int32_t format; /// The actual bits. Loading Loading @@ -151,7 +157,7 @@ int32_t ANativeWindow_getFormat(ANativeWindow* window); * * \param width width of the buffers in pixels. * \param height height of the buffers in pixels. * \param format one of AHARDWAREBUFFER_FORMAT_* constants. * \param format one of the AHardwareBuffer_Format constants. * \return 0 for success, or a negative value on error. */ int32_t ANativeWindow_setBuffersGeometry(ANativeWindow* window, Loading Loading
libs/nativewindow/include/android/hardware_buffer.h +172 −66 Original line number Diff line number Diff line Loading @@ -15,12 +15,31 @@ */ /** * @addtogroup NativeActivity Native Activity * @{ * @file hardware_buffer.h * @brief API for native hardware buffers. */ /** * @file hardware_buffer.h * @defgroup AHardwareBuffer Native Hardware Buffer * * AHardwareBuffer objects represent chunks of memory that can be * accessed by various hardware components in the system. It can be * easily converted to the Java counterpart * android.hardware.HardwareBuffer and passed between processes using * Binder. All operations involving AHardwareBuffer and HardwareBuffer * are zero-copy, i.e., passing AHardwareBuffer to another process * creates a shared view of the same region of memory. * * AHardwareBuffers can be bound to EGL/OpenGL and Vulkan primitives. * For EGL, use the extension function eglGetNativeClientBufferANDROID * to obtain an EGLClientBuffer and pass it directly to * eglCreateImageKHR. Refer to the EGL extensions * EGL_ANDROID_get_native_client_buffer and * EGL_ANDROID_image_native_buffer for more information. In Vulkan, * the contents of the AHardwareBuffer can be accessed as external * memory. See the VK_ANDROID_external_memory_android_hardware_buffer * extension for details. * * @{ */ #ifndef ANDROID_HARDWARE_BUFFER_H Loading @@ -37,7 +56,7 @@ __BEGIN_DECLS /** * Buffer pixel formats. */ enum { enum AHardwareBuffer_Format { /** * Corresponding formats: * Vulkan: VK_FORMAT_R8G8B8A8_UNORM Loading Loading @@ -83,8 +102,10 @@ enum { AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM = 0x2b, /** * An opaque binary blob format that must have height 1, with width equal to * the buffer size in bytes. * Opaque binary blob format. * Must have height 1 and one layer, with width equal to the buffer * size in bytes. Corresponds to Vulkan buffers and OpenGL buffer * objects. Can be bound to the latter using GL_EXT_external_buffer. */ AHARDWAREBUFFER_FORMAT_BLOB = 0x21, Loading Loading @@ -134,21 +155,39 @@ enum { /** * Buffer usage flags, specifying how the buffer will be accessed. */ enum { /// The buffer will never be read by the CPU. enum AHardwareBuffer_UsageFlags { /// The buffer will never be locked for direct CPU reads using the /// AHardwareBuffer_lock() function. Note that reading the buffer /// using OpenGL or Vulkan functions or memory mappings is still /// allowed. AHARDWAREBUFFER_USAGE_CPU_READ_NEVER = 0UL, /// The buffer will sometimes be read by the CPU. /// The buffer will sometimes be locked for direct CPU reads using /// the AHardwareBuffer_lock() function. Note that reading the /// buffer using OpenGL or Vulkan functions or memory mappings /// does not require the presence of this flag. AHARDWAREBUFFER_USAGE_CPU_READ_RARELY = 2UL, /// The buffer will often be read by the CPU. /// The buffer will often be locked for direct CPU reads using /// the AHardwareBuffer_lock() function. Note that reading the /// buffer using OpenGL or Vulkan functions or memory mappings /// does not require the presence of this flag. AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN = 3UL, /// CPU read value mask. AHARDWAREBUFFER_USAGE_CPU_READ_MASK = 0xFUL, /// The buffer will never be written by the CPU. /// The buffer will never be locked for direct CPU writes using the /// AHardwareBuffer_lock() function. Note that writing the buffer /// using OpenGL or Vulkan functions or memory mappings is still /// allowed. AHARDWAREBUFFER_USAGE_CPU_WRITE_NEVER = 0UL << 4, /// The buffer will sometimes be written to by the CPU. /// The buffer will sometimes be locked for direct CPU writes using /// the AHardwareBuffer_lock() function. Note that writing the /// buffer using OpenGL or Vulkan functions or memory mappings /// does not require the presence of this flag. AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY = 2UL << 4, /// The buffer will often be written to by the CPU. /// The buffer will often be locked for direct CPU writes using /// the AHardwareBuffer_lock() function. Note that writing the /// buffer using OpenGL or Vulkan functions or memory mappings /// does not require the presence of this flag. AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN = 3UL << 4, /// CPU write value mask. AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK = 0xFUL << 4, Loading @@ -156,24 +195,51 @@ enum { /// The buffer will be read from by the GPU as a texture. AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE = 1UL << 8, /** * The buffer will be written to by the GPU as a framebuffer attachment. * Note that the name of this flag is somewhat misleading: it does not imply * that the buffer contains a color format. A buffer with depth or stencil * format that will be used as a framebuffer attachment should also have * this flag. * The buffer will be written to by the GPU as a framebuffer * attachment. * * Note that the name of this flag is somewhat misleading: it does * not imply that the buffer contains a color format. A buffer with * depth or stencil format that will be used as a framebuffer * attachment should also have this flag. */ AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT = 1UL << 9, /// The buffer must not be used outside of a protected hardware path. /** * The buffer is protected from direct CPU access or being read by * non-secure hardware, such as video encoders. * * This flag is incompatible with CPU read and write flags. It is * mainly used when handling DRM video. Refer to the EGL extension * EGL_EXT_protected_content and GL extension * GL_EXT_protected_textures for more information on how these * buffers are expected to behave. */ AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT = 1UL << 14, /// The buffer will be read by a hardware video encoder. AHARDWAREBUFFER_USAGE_VIDEO_ENCODE = 1UL << 16, /// The buffer will be used for direct writes from sensors. /** * The buffer will be used for direct writes from sensors. * When this flag is present, the format must be AHARDWAREBUFFER_FORMAT_BLOB. */ AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA = 1UL << 23, /// The buffer will be used as a shader storage or uniform buffer object. /** * The buffer will be used as a shader storage or uniform buffer object. * When this flag is present, the format must be AHARDWAREBUFFER_FORMAT_BLOB. */ AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER = 1UL << 24, /// The buffer will be used as a cube map texture. /** * The buffer will be used as a cube map texture. * When this flag is present, the buffer must have a layer count * that is a multiple of 6. Note that buffers with this flag must be * bound to OpenGL textures using the extension * GL_EXT_EGL_image_storage instead of GL_KHR_EGL_image. */ AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP = 1UL << 25, /// The buffer contains a complete mipmap hierarchy. /** * The buffer contains a complete mipmap hierarchy. * Note that buffers with this flag must be bound to OpenGL textures using * the extension GL_EXT_EGL_image_storage instead of GL_KHR_EGL_image. */ AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE = 1UL << 26, AHARDWAREBUFFER_USAGE_VENDOR_0 = 1ULL << 28, Loading @@ -199,27 +265,42 @@ enum { }; /** * Buffer description. Used for allocating new buffers and querying parameters * of existing ones. * Buffer description. Used for allocating new buffers and querying * parameters of existing ones. */ typedef struct AHardwareBuffer_Desc { uint32_t width; ///< Width in pixels. uint32_t height; ///< Height in pixels. uint32_t layers; ///< Number of images in an image array. uint32_t format; ///< One of AHARDWAREBUFFER_FORMAT_* uint64_t usage; ///< Combination of AHARDWAREBUFFER_USAGE_* /** * Number of images in an image array. AHardwareBuffers with one * layer correspond to regular 2D textures. AHardwareBuffers with * more than layer correspond to texture arrays. If the layer count * is a multiple of 6 and the usage flag * AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP is present, the buffer is * a cube map or a cube map array. */ uint32_t layers; uint32_t format; ///< One of AHardwareBuffer_Format. uint64_t usage; ///< Combination of AHardwareBuffer_UsageFlags. uint32_t stride; ///< Row stride in pixels, ignored for AHardwareBuffer_allocate() uint32_t rfu0; ///< Initialize to zero, reserved for future use. uint64_t rfu1; ///< Initialize to zero, reserved for future use. } AHardwareBuffer_Desc; /** * Opaque handle for a native hardware buffer. */ typedef struct AHardwareBuffer AHardwareBuffer; #if __ANDROID_API__ >= 26 /** * Allocates a buffer that backs an AHardwareBuffer using the passed * AHardwareBuffer_Desc. * Allocates a buffer that matches the passed AHardwareBuffer_Desc. * * If allocation succeeds, the buffer can be used according to the * usage flags specified in its description. If a buffer is used in ways * not compatible with its usage flags, the results are undefined and * may include program termination. * * \return 0 on success, or an error number of the allocation fails for * any reason. The returned buffer has a reference count of 1. Loading @@ -227,14 +308,16 @@ typedef struct AHardwareBuffer AHardwareBuffer; int AHardwareBuffer_allocate(const AHardwareBuffer_Desc* desc, AHardwareBuffer** outBuffer) __INTRODUCED_IN(26); /** * Acquire a reference on the given AHardwareBuffer object. This prevents the * object from being deleted until the last reference is removed. * Acquire a reference on the given AHardwareBuffer object. * * This prevents the object from being deleted until the last reference * is removed. */ void AHardwareBuffer_acquire(AHardwareBuffer* buffer) __INTRODUCED_IN(26); /** * Remove a reference that was previously acquired with * AHardwareBuffer_acquire(). * AHardwareBuffer_acquire() or AHardwareBuffer_allocate(). */ void AHardwareBuffer_release(AHardwareBuffer* buffer) __INTRODUCED_IN(26); Loading @@ -246,50 +329,73 @@ void AHardwareBuffer_describe(const AHardwareBuffer* buffer, AHardwareBuffer_Desc* outDesc) __INTRODUCED_IN(26); /** * Lock the AHardwareBuffer for reading or writing, depending on the usage flags * passed. This call may block if the hardware needs to finish rendering or if * CPU caches need to be synchronized, or possibly for other implementation- * specific reasons. If fence is not negative, then it specifies a fence file * descriptor that will be signaled when the buffer is locked, otherwise the * caller will block until the buffer is available. * Lock the AHardwareBuffer for direct CPU access. * * If \a rect is not NULL, the caller promises to modify only data in the area * specified by rect. If rect is NULL, the caller may modify the contents of the * entire buffer. * This function can lock the buffer for either reading or writing. * It may block if the hardware needs to finish rendering, if CPU caches * need to be synchronized, or possibly for other implementation- * specific reasons. * * The content of the buffer outside of the specified rect is NOT modified * by this call. * The passed AHardwareBuffer must have one layer, otherwise the call * will fail. * * The \a usage parameter may only specify AHARDWAREBUFFER_USAGE_CPU_*. If set, * then outVirtualAddress is filled with the address of the buffer in virtual * memory. * If \a fence is not negative, it specifies a fence file descriptor on * which to wait before locking the buffer. If it's negative, the caller * is responsible for ensuring that writes to the buffer have completed * before calling this function. Using this parameter is more efficient * than waiting on the fence and then calling this function. * * The \a usage parameter may only specify AHARDWAREBUFFER_USAGE_CPU_*. * If set, then outVirtualAddress is filled with the address of the * buffer in virtual memory. The flags must also be compatible with * usage flags specified at buffer creation: if a read flag is passed, * the buffer must have been created with * AHARDWAREBUFFER_USAGE_CPU_READ_RARELY or * AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN. If a write flag is passed, it * must have been created with AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY or * AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN. * * THREADING CONSIDERATIONS: * If \a rect is not NULL, the caller promises to modify only data in * the area specified by rect. If rect is NULL, the caller may modify * the contents of the entire buffer. The content of the buffer outside * of the specified rect is NOT modified by this call. * * It is legal for several different threads to lock a buffer for read access; * none of the threads are blocked. * It is legal for several different threads to lock a buffer for read * access; none of the threads are blocked. * * Locking a buffer simultaneously for write or read/write is undefined, but * will neither terminate the process nor block the caller; AHardwareBuffer_lock * may return an error or leave the buffer's content into an indeterminate * state. * Locking a buffer simultaneously for write or read/write is undefined, * but will neither terminate the process nor block the caller. * AHardwareBuffer_lock may return an error or leave the buffer's * content in an indeterminate state. * * \return 0 on success, -EINVAL if \a buffer is NULL or if the usage * flags are not a combination of AHARDWAREBUFFER_USAGE_CPU_*, or an error * number of the lock fails for any reason. * If the buffer has AHARDWAREBUFFER_FORMAT_BLOB, it is legal lock it * for reading and writing in multiple threads and/or processes * simultaneously, and the contents of the buffer behave like shared * memory. * * \return 0 on success. -EINVAL if \a buffer is NULL, the usage flags * are not a combination of AHARDWAREBUFFER_USAGE_CPU_*, or the buffer * has more than one layer. Error number if the lock fails for any other * reason. */ int AHardwareBuffer_lock(AHardwareBuffer* buffer, uint64_t usage, int32_t fence, const ARect* rect, void** outVirtualAddress) __INTRODUCED_IN(26); /** * Unlock the AHardwareBuffer; must be called after all changes to the buffer * are completed by the caller. If fence is not NULL then it will be set to a * file descriptor that is signaled when all pending work on the buffer is * completed. The caller is responsible for closing the fence when it is no * longer needed. * Unlock the AHardwareBuffer from direct CPU access. * * \return 0 on success, -EINVAL if \a buffer is NULL, or an error * number if the unlock fails for any reason. * Must be called after all changes to the buffer are completed by the * caller. If \a fence is NULL, the function will block until all work * is completed. Otherwise, \a fence will be set either to a valid file * descriptor or to -1. The file descriptor will become signaled once * the unlocking is complete and buffer contents are updated. * The caller is responsible for closing the file descriptor once it's * no longer needed. The value -1 indicates that unlocking has already * completed before the function returned and no further operations are * necessary. * * \return 0 on success. -EINVAL if \a buffer is NULL. Error number if * the unlock fails for any reason. */ int AHardwareBuffer_unlock(AHardwareBuffer* buffer, int32_t* fence) __INTRODUCED_IN(26); Loading @@ -302,7 +408,7 @@ int AHardwareBuffer_unlock(AHardwareBuffer* buffer, int32_t* fence) __INTRODUCED int AHardwareBuffer_sendHandleToUnixSocket(const AHardwareBuffer* buffer, int socketFd) __INTRODUCED_IN(26); /** * Receive the AHardwareBuffer from an AF_UNIX socket. * Receive an AHardwareBuffer from an AF_UNIX socket. * * \return 0 on success, -EINVAL if \a outBuffer is NULL, or an error * number if the operation fails for any reason. Loading
libs/nativewindow/include/android/native_window.h +10 −4 Original line number Diff line number Diff line Loading @@ -15,7 +15,13 @@ */ /** * @addtogroup NativeActivity Native Activity * @defgroup ANativeWindow Native Window * * ANativeWindow represents the producer end of an image queue. * It is the C counterpart of the android.view.Surface object in Java, * and can be converted both ways. Depending on the consumer, images * submitted to ANativeWindow can be shown on the display or sent to * other consumers, such as video encoders. * @{ */ Loading @@ -41,7 +47,7 @@ extern "C" { * Legacy window pixel format names, kept for backwards compatibility. * New code and APIs should use AHARDWAREBUFFER_FORMAT_*. */ enum { enum ANativeWindow_LegacyFormat { // NOTE: these values must match the values from graphics/common/x.x/types.hal /** Red: 8 bits, Green: 8 bits, Blue: 8 bits, Alpha: 8 bits. **/ Loading Loading @@ -95,7 +101,7 @@ typedef struct ANativeWindow_Buffer { /// memory. This may be >= width. int32_t stride; /// The format of the buffer. One of AHARDWAREBUFFER_FORMAT_* /// The format of the buffer. One of AHardwareBuffer_Format. int32_t format; /// The actual bits. Loading Loading @@ -151,7 +157,7 @@ int32_t ANativeWindow_getFormat(ANativeWindow* window); * * \param width width of the buffers in pixels. * \param height height of the buffers in pixels. * \param format one of AHARDWAREBUFFER_FORMAT_* constants. * \param format one of the AHardwareBuffer_Format constants. * \return 0 for success, or a negative value on error. */ int32_t ANativeWindow_setBuffersGeometry(ANativeWindow* window, Loading