1#ifndef ANDROID_DVR_SURFACE_H_
2#define ANDROID_DVR_SURFACE_H_
3
4#include <stdbool.h>
5#include <stddef.h>
6#include <stdint.h>
7#include <sys/cdefs.h>
8
9#include <dvr/dvr_buffer.h>
10#include <dvr/dvr_buffer_queue.h>
11#include <dvr/dvr_display_types.h>
12
13__BEGIN_DECLS
14
15typedef struct DvrBuffer DvrBuffer;
16typedef struct DvrSurface DvrSurface;
17typedef struct DvrWriteBufferQueue DvrWriteBufferQueue;
18
19// Attribute types. The values are one-hot encoded to support singluar types or
20// masks of supported types.
21enum {
22  DVR_SURFACE_ATTRIBUTE_TYPE_NONE = 0,
23  DVR_SURFACE_ATTRIBUTE_TYPE_INT32 = (1 << 0),
24  DVR_SURFACE_ATTRIBUTE_TYPE_INT64 = (1 << 1),
25  DVR_SURFACE_ATTRIBUTE_TYPE_BOOL = (1 << 2),
26  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT = (1 << 3),
27  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT2 = (1 << 4),
28  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT3 = (1 << 5),
29  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT4 = (1 << 6),
30  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT8 = (1 << 7),
31  DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT16 = (1 << 8),
32};
33
34typedef uint64_t DvrSurfaceAttributeType;
35typedef int32_t DvrSurfaceAttributeKey;
36
37typedef struct DvrSurfaceAttributeValue {
38  DvrSurfaceAttributeType type;
39  union {
40    int32_t int32_value;
41    int64_t int64_value;
42    bool bool_value;
43    float float_value;
44    float float2_value[2];
45    float float3_value[3];
46    float float4_value[4];
47    float float8_value[8];
48    float float16_value[16];
49  };
50} DvrSurfaceAttributeValue;
51
52typedef struct DvrSurfaceAttribute {
53  DvrSurfaceAttributeKey key;
54  DvrSurfaceAttributeValue value;
55} DvrSurfaceAttribute;
56
57// Creates a new display surface with the given attributes.
58// @return 0 on success. Otherwise returns a negative error value.
59int dvrSurfaceCreate(const DvrSurfaceAttribute* attributes,
60                     size_t attribute_count, DvrSurface** surface_out);
61
62// Destroys the display surface.
63void dvrSurfaceDestroy(DvrSurface* surface);
64
65// Gets the DisplayService global id for this surface.
66int dvrSurfaceGetId(DvrSurface* surface);
67
68// Sets attributes on the given display surface.
69// @return 0 on success. Otherwise returns a negative error value.
70int dvrSurfaceSetAttributes(DvrSurface* surface,
71                            const DvrSurfaceAttribute* attributes,
72                            size_t attribute_count);
73
74// Creates a new write-side buffer queue on the given surface. Direct surfaces
75// may only have one queue, the latest call replacing any prior queue. Replaced
76// queues are still referenced and should be destryoed using the queue destroy
77// API.
78// @return 0 on success. Otherwise returns a negative error value.
79int dvrSurfaceCreateWriteBufferQueue(DvrSurface* surface, uint32_t width,
80                                     uint32_t height, uint32_t format,
81                                     uint32_t layer_count, uint64_t usage,
82                                     size_t capacity,
83                                     DvrWriteBufferQueue** queue_out);
84
85// Get a named buffer from the display service.
86// @return 0 on success. Otherwise returns a negative error value.
87int dvrGetNamedBuffer(const char* name, DvrBuffer** out_buffer);
88
89__END_DECLS
90
91#endif  // ANDROID_DVR_SURFACE_H_
92