1bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai#ifndef ANDROID_DVR_SURFACE_H_
2bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai#define ANDROID_DVR_SURFACE_H_
3bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
42251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <stdbool.h>
52251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <stddef.h>
62251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <stdint.h>
72251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <sys/cdefs.h>
82251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
936d23803882c64b1006cd3b8a47e00a4193a9b49Okan Arikan#include <dvr/dvr_api.h>
10bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai#include <dvr/dvr_buffer.h>
1174cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai#include <dvr/dvr_buffer_queue.h>
122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <dvr/dvr_display_types.h>
13bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka__BEGIN_DECLS
15bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Attribute types. The values are one-hot encoded to support singluar types or
172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// masks of supported types.
182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaenum {
192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DVR_SURFACE_ATTRIBUTE_TYPE_NONE = 0,
202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DVR_SURFACE_ATTRIBUTE_TYPE_INT32 = (1 << 0),
212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DVR_SURFACE_ATTRIBUTE_TYPE_INT64 = (1 << 1),
222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DVR_SURFACE_ATTRIBUTE_TYPE_BOOL = (1 << 2),
232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT = (1 << 3),
242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT2 = (1 << 4),
252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT3 = (1 << 5),
262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT4 = (1 << 6),
272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT8 = (1 << 7),
282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT16 = (1 << 8),
292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka};
302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef uint64_t DvrSurfaceAttributeType;
322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef int32_t DvrSurfaceAttributeKey;
332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrSurfaceAttributeValue {
352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DvrSurfaceAttributeType type;
362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  union {
372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    int32_t int32_value;
382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    int64_t int64_value;
392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    bool bool_value;
402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    float float_value;
412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    float float2_value[2];
422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    float float3_value[3];
432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    float float4_value[4];
442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    float float8_value[8];
452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    float float16_value[16];
462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  };
472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} DvrSurfaceAttributeValue;
482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrSurfaceAttribute {
502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DvrSurfaceAttributeKey key;
512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  DvrSurfaceAttributeValue value;
522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} DvrSurfaceAttribute;
53bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Creates a new display surface with the given attributes.
552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// @return 0 on success. Otherwise returns a negative error value.
562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceCreate(const DvrSurfaceAttribute* attributes,
572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                     size_t attribute_count, DvrSurface** surface_out);
5874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai
592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Destroys the display surface.
602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrSurfaceDestroy(DvrSurface* surface);
612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Gets the DisplayService global id for this surface.
632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceGetId(DvrSurface* surface);
642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Sets attributes on the given display surface.
662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// @return 0 on success. Otherwise returns a negative error value.
672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceSetAttributes(DvrSurface* surface,
682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                            const DvrSurfaceAttribute* attributes,
692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                            size_t attribute_count);
702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Creates a new write-side buffer queue on the given surface. Direct surfaces
722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// may only have one queue, the latest call replacing any prior queue. Replaced
732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// queues are still referenced and should be destryoed using the queue destroy
742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// API.
752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// @return 0 on success. Otherwise returns a negative error value.
762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrSurfaceCreateWriteBufferQueue(DvrSurface* surface, uint32_t width,
772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                     uint32_t height, uint32_t format,
78108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                                     uint32_t layer_count, uint64_t usage,
79532e529ec8f87578d024da0c5b71d4b12da21862Jiwen 'Steve' Cai                                     size_t capacity, size_t metadata_size,
802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                                     DvrWriteBufferQueue** queue_out);
812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
8299c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka// Sets up a named buffer for shared memory data transfer between display
8399c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka// clients and the system. Protected API that may only be called with sufficient
8499c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka// privilege.
8599c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka// @return 0 on success. Otherwise returns a negative error value.
8699c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabakaint dvrSetupGlobalBuffer(DvrGlobalBufferKey key, size_t size, uint64_t usage,
8799c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka                         DvrBuffer** buffer_out);
8899c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka
8999c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka// Deletes a named buffer. WARNING: This is dangerous because any existing
9099c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka// clients of this buffer will not be notified and will remain attached to
9199c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka// the old buffer. This is useful for tests, but probably not for production
9299c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka// code.
9399c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka// @return 0 on success. Otherwise returns a negative error value.
9499c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabakaint dvrDeleteGlobalBuffer(DvrGlobalBufferKey key);
9599c2d73588dad4a4d12a17d37354237b8c11a16aCorey Tabaka
9636d23803882c64b1006cd3b8a47e00a4193a9b49Okan Arikan// Get a global buffer from the display service.
972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// @return 0 on success. Otherwise returns a negative error value.
9836d23803882c64b1006cd3b8a47e00a4193a9b49Okan Arikanint dvrGetGlobalBuffer(DvrGlobalBufferKey key, DvrBuffer** out_buffer);
9974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai
1006c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazyk// Read the native device display metrics as reported by the hardware composer.
1016c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazyk// This is useful as otherwise the device metrics are only reported as
1026c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazyk// relative to the current device orientation.
1036c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazyk// @param sizeof_metrics the size of the passed in metrics struct. This is used
1046c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazyk//   to ensure we don't break each other during active development.
1056c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazyk// @param metrics on success holds the retrieved device metrics.
1066c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazyk// @return 0 on success. Otherwise returns a negative error value (typically
1076c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazyk//   this means the display service is not available).
1086c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazykint dvrGetNativeDisplayMetrics(size_t metrics_struct_size,
1096c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazyk                               DvrNativeDisplayMetrics* metrics);
1106c5a92f142b5fa1907ff91a7dce4d09ddcb554c6Stephen Kiazyk
1112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka__END_DECLS
112bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
113bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai#endif  // ANDROID_DVR_SURFACE_H_
114