blob: 74a68a16ee6f74c8dd38eaf2e156813cab1b3e7a [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_api.h>
#include <dvr/dvr_buffer.h>
#include <dvr/dvr_buffer_queue.h>
#include <dvr/dvr_display_types.h>
__BEGIN_DECLS
// 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, size_t metadata_size,
DvrWriteBufferQueue** queue_out);
// Sets up a named buffer for shared memory data transfer between display
// clients and the system. Protected API that may only be called with sufficient
// privilege.
// @return 0 on success. Otherwise returns a negative error value.
int dvrSetupGlobalBuffer(DvrGlobalBufferKey key, size_t size, uint64_t usage,
DvrBuffer** buffer_out);
// Deletes a named buffer. WARNING: This is dangerous because any existing
// clients of this buffer will not be notified and will remain attached to
// the old buffer. This is useful for tests, but probably not for production
// code.
// @return 0 on success. Otherwise returns a negative error value.
int dvrDeleteGlobalBuffer(DvrGlobalBufferKey key);
// Get a global buffer from the display service.
// @return 0 on success. Otherwise returns a negative error value.
int dvrGetGlobalBuffer(DvrGlobalBufferKey key, DvrBuffer** out_buffer);
// Read the native device display metrics as reported by the hardware composer.
// This is useful as otherwise the device metrics are only reported as
// relative to the current device orientation.
// @param sizeof_metrics the size of the passed in metrics struct. This is used
// to ensure we don't break each other during active development.
// @param metrics on success holds the retrieved device metrics.
// @return 0 on success. Otherwise returns a negative error value (typically
// this means the display service is not available).
int dvrGetNativeDisplayMetrics(size_t metrics_struct_size,
DvrNativeDisplayMetrics* metrics);
__END_DECLS
#endif // ANDROID_DVR_SURFACE_H_