blob: 361488e671bb6cc4a2e5747ee3602399d7b1c2e0 [file] [log] [blame]
#ifndef ANDROID_DVR_SURFACE_H_
#define ANDROID_DVR_SURFACE_H_
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <sys/cdefs.h>
#include <dvr/dvr_buffer.h>
#include <dvr/dvr_buffer_queue.h>
#include <dvr/dvr_display_types.h>
__BEGIN_DECLS
typedef struct DvrBuffer DvrBuffer;
typedef struct DvrSurface DvrSurface;
typedef struct DvrWriteBufferQueue DvrWriteBufferQueue;
// Attribute types. The values are one-hot encoded to support singluar types or
// masks of supported types.
enum {
DVR_SURFACE_ATTRIBUTE_TYPE_NONE = 0,
DVR_SURFACE_ATTRIBUTE_TYPE_INT32 = (1 << 0),
DVR_SURFACE_ATTRIBUTE_TYPE_INT64 = (1 << 1),
DVR_SURFACE_ATTRIBUTE_TYPE_BOOL = (1 << 2),
DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT = (1 << 3),
DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT2 = (1 << 4),
DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT3 = (1 << 5),
DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT4 = (1 << 6),
DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT8 = (1 << 7),
DVR_SURFACE_ATTRIBUTE_TYPE_FLOAT16 = (1 << 8),
};
typedef uint64_t DvrSurfaceAttributeType;
typedef int32_t DvrSurfaceAttributeKey;
typedef struct DvrSurfaceAttributeValue {
DvrSurfaceAttributeType type;
union {
int32_t int32_value;
int64_t int64_value;
bool bool_value;
float float_value;
float float2_value[2];
float float3_value[3];
float float4_value[4];
float float8_value[8];
float float16_value[16];
};
} DvrSurfaceAttributeValue;
typedef struct DvrSurfaceAttribute {
DvrSurfaceAttributeKey key;
DvrSurfaceAttributeValue value;
} DvrSurfaceAttribute;
// Creates a new display surface with the given attributes.
// @return 0 on success. Otherwise returns a negative error value.
int dvrSurfaceCreate(const DvrSurfaceAttribute* attributes,
size_t attribute_count, DvrSurface** surface_out);
// Destroys the display surface.
void dvrSurfaceDestroy(DvrSurface* surface);
// Gets the DisplayService global id for this surface.
int dvrSurfaceGetId(DvrSurface* surface);
// Sets attributes on the given display surface.
// @return 0 on success. Otherwise returns a negative error value.
int dvrSurfaceSetAttributes(DvrSurface* surface,
const DvrSurfaceAttribute* attributes,
size_t attribute_count);
// Creates a new write-side buffer queue on the given surface. Direct surfaces
// may only have one queue, the latest call replacing any prior queue. Replaced
// queues are still referenced and should be destryoed using the queue destroy
// API.
// @return 0 on success. Otherwise returns a negative error value.
int dvrSurfaceCreateWriteBufferQueue(DvrSurface* surface, uint32_t width,
uint32_t height, uint32_t format,
uint32_t layer_count, uint64_t usage,
size_t capacity,
DvrWriteBufferQueue** queue_out);
// Get a named buffer from the display service.
// @return 0 on success. Otherwise returns a negative error value.
int dvrGetNamedBuffer(const char* name, DvrBuffer** out_buffer);
__END_DECLS
#endif // ANDROID_DVR_SURFACE_H_