blob: a04ed50f5f83f0597ee7e7d075fbef479eaf1f97 [file] [log] [blame]
Jiwen 'Steve' Caibdcee792017-03-22 16:59:53 -07001#include "include/dvr/dvr_surface.h"
2
3#include <private/dvr/display_client.h>
4
5using namespace android;
6
Jiwen 'Steve' Cai74cf0842017-03-23 18:53:16 -07007struct DvrSurface {
8 std::unique_ptr<dvr::DisplaySurfaceClient> display_surface_;
9};
10
Jiwen 'Steve' Caibdcee792017-03-22 16:59:53 -070011extern "C" {
12
Jiwen 'Steve' Cai74cf0842017-03-23 18:53:16 -070013int dvrSurfaceCreate(int width, int height, int format, uint64_t usage0,
14 uint64_t usage1, int flags, DvrSurface** out_surface) {
15 if (out_surface == nullptr) {
16 ALOGE("dvrSurfaceCreate: invalid inputs: out_surface=%p.", out_surface);
17 return -EINVAL;
18 }
19
20 int error;
21 auto client = dvr::DisplayClient::Create(&error);
22 if (!client) {
23 ALOGE("Failed to create display client!");
24 return error;
25 }
26
27 // TODO(hendrikw): When we move to gralloc1, pass both usage0 and usage1 down.
28 std::unique_ptr<dvr::DisplaySurfaceClient> surface =
29 client->CreateDisplaySurface(
30 width, height, static_cast<int>(usage0 | usage1), format, flags);
31
32 DvrSurface* dvr_surface = new DvrSurface;
33 dvr_surface->display_surface_ = std::move(surface);
34 *out_surface = dvr_surface;
35 return 0;
36}
37
38int dvrSurfaceGetWriteBufferQueue(DvrSurface* surface,
39 DvrWriteBufferQueue** out_writer) {
40 if (surface == nullptr || out_writer == nullptr) {
41 ALOGE(
42 "dvrSurfaceGetWriteBufferQueue: Invalid inputs: surface=%p, "
43 "out_writer=%p.",
44 surface, out_writer);
45 return -EINVAL;
46 }
47 DvrWriteBufferQueue* buffer_writer = new DvrWriteBufferQueue;
48 buffer_writer->producer_queue_ =
49 surface->display_surface_->GetProducerQueue();
50 if (buffer_writer->producer_queue_ == nullptr) {
51 ALOGE(
52 "dvrSurfaceGetWriteBufferQueue: Failed to get producer queue from "
53 "display surface.");
54 return -ENOMEM;
55 }
56
57 *out_writer = buffer_writer;
58 return 0;
59}
60
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070061int dvrGetNamedBuffer(const char* name, DvrBuffer** out_buffer) {
Jiwen 'Steve' Caibdcee792017-03-22 16:59:53 -070062 auto client = android::dvr::DisplayClient::Create();
63 if (!client) {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070064 ALOGE("dvrGetNamedBuffer: Failed to create display client!");
Jiwen 'Steve' Caibdcee792017-03-22 16:59:53 -070065 return -ECOMM;
66 }
67
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070068 if (out_buffer == nullptr || name == nullptr) {
69 ALOGE("dvrGetNamedBuffer: Invalid inputs: name=%p, out_buffer=%p.", name,
70 out_buffer);
71 return -EINVAL;
72 }
73
74 auto named_buffer = client->GetNamedBuffer(name);
75 if (!named_buffer) {
76 ALOGE("dvrGetNamedBuffer: Failed to find named buffer: %s.", name);
77 return -EINVAL;
78 }
79 *out_buffer = CreateDvrBufferFromIonBuffer(std::move(named_buffer));
Jiwen 'Steve' Caibdcee792017-03-22 16:59:53 -070080 return 0;
81}
82
83} // extern "C"