1*d95af8dfSAndroid Build Coastguard Worker /*
2*d95af8dfSAndroid Build Coastguard Worker * Copyright 2017 The Chromium OS Authors. All rights reserved.
3*d95af8dfSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
4*d95af8dfSAndroid Build Coastguard Worker * found in the LICENSE file.
5*d95af8dfSAndroid Build Coastguard Worker */
6*d95af8dfSAndroid Build Coastguard Worker
7*d95af8dfSAndroid Build Coastguard Worker #include "cros_gralloc_buffer.h"
8*d95af8dfSAndroid Build Coastguard Worker
9*d95af8dfSAndroid Build Coastguard Worker #include <assert.h>
10*d95af8dfSAndroid Build Coastguard Worker #include <sys/mman.h>
11*d95af8dfSAndroid Build Coastguard Worker
12*d95af8dfSAndroid Build Coastguard Worker #include <cutils/native_handle.h>
13*d95af8dfSAndroid Build Coastguard Worker
14*d95af8dfSAndroid Build Coastguard Worker #include "cros_gralloc_buffer_metadata.h"
15*d95af8dfSAndroid Build Coastguard Worker
16*d95af8dfSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::BlendMode;
17*d95af8dfSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::Cta861_3;
18*d95af8dfSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::Dataspace;
19*d95af8dfSAndroid Build Coastguard Worker using aidl::android::hardware::graphics::common::Smpte2086;
20*d95af8dfSAndroid Build Coastguard Worker
21*d95af8dfSAndroid Build Coastguard Worker /*static*/
22*d95af8dfSAndroid Build Coastguard Worker std::unique_ptr<cros_gralloc_buffer>
create(struct bo * acquire_bo,const struct cros_gralloc_handle * borrowed_handle)23*d95af8dfSAndroid Build Coastguard Worker cros_gralloc_buffer::create(struct bo *acquire_bo,
24*d95af8dfSAndroid Build Coastguard Worker const struct cros_gralloc_handle *borrowed_handle)
25*d95af8dfSAndroid Build Coastguard Worker {
26*d95af8dfSAndroid Build Coastguard Worker auto acquire_hnd =
27*d95af8dfSAndroid Build Coastguard Worker reinterpret_cast<struct cros_gralloc_handle *>(native_handle_clone(borrowed_handle));
28*d95af8dfSAndroid Build Coastguard Worker if (!acquire_hnd) {
29*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to create cros_gralloc_buffer: failed to clone handle.");
30*d95af8dfSAndroid Build Coastguard Worker return {};
31*d95af8dfSAndroid Build Coastguard Worker }
32*d95af8dfSAndroid Build Coastguard Worker
33*d95af8dfSAndroid Build Coastguard Worker std::unique_ptr<cros_gralloc_buffer> buffer(
34*d95af8dfSAndroid Build Coastguard Worker new cros_gralloc_buffer(acquire_bo, acquire_hnd));
35*d95af8dfSAndroid Build Coastguard Worker if (!buffer) {
36*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to create cros_gralloc_buffer: failed to allocate.");
37*d95af8dfSAndroid Build Coastguard Worker native_handle_close(acquire_hnd);
38*d95af8dfSAndroid Build Coastguard Worker native_handle_delete(acquire_hnd);
39*d95af8dfSAndroid Build Coastguard Worker return {};
40*d95af8dfSAndroid Build Coastguard Worker }
41*d95af8dfSAndroid Build Coastguard Worker
42*d95af8dfSAndroid Build Coastguard Worker return buffer;
43*d95af8dfSAndroid Build Coastguard Worker }
44*d95af8dfSAndroid Build Coastguard Worker
45*d95af8dfSAndroid Build Coastguard Worker int32_t
initialize_metadata(const struct cros_gralloc_buffer_descriptor * descriptor)46*d95af8dfSAndroid Build Coastguard Worker cros_gralloc_buffer::initialize_metadata(const struct cros_gralloc_buffer_descriptor *descriptor)
47*d95af8dfSAndroid Build Coastguard Worker {
48*d95af8dfSAndroid Build Coastguard Worker struct cros_gralloc_buffer_metadata *metadata;
49*d95af8dfSAndroid Build Coastguard Worker
50*d95af8dfSAndroid Build Coastguard Worker int ret = get_metadata(&metadata);
51*d95af8dfSAndroid Build Coastguard Worker if (ret) {
52*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to initialize metadata: failed to get metadata region.");
53*d95af8dfSAndroid Build Coastguard Worker return ret;
54*d95af8dfSAndroid Build Coastguard Worker }
55*d95af8dfSAndroid Build Coastguard Worker
56*d95af8dfSAndroid Build Coastguard Worker if (metadata == nullptr) {
57*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to initialize metadata: invalid metadata address.");
58*d95af8dfSAndroid Build Coastguard Worker return -1;
59*d95af8dfSAndroid Build Coastguard Worker }
60*d95af8dfSAndroid Build Coastguard Worker
61*d95af8dfSAndroid Build Coastguard Worker new (metadata) cros_gralloc_buffer_metadata();
62*d95af8dfSAndroid Build Coastguard Worker
63*d95af8dfSAndroid Build Coastguard Worker snprintf(metadata->name, CROS_GRALLOC_BUFFER_METADATA_MAX_NAME_SIZE, "%s",
64*d95af8dfSAndroid Build Coastguard Worker descriptor->name.c_str());
65*d95af8dfSAndroid Build Coastguard Worker metadata->dataspace = descriptor->dataspace;
66*d95af8dfSAndroid Build Coastguard Worker metadata->blend_mode = descriptor->blend;
67*d95af8dfSAndroid Build Coastguard Worker return 0;
68*d95af8dfSAndroid Build Coastguard Worker }
69*d95af8dfSAndroid Build Coastguard Worker
cros_gralloc_buffer(struct bo * acquire_bo,struct cros_gralloc_handle * acquire_handle)70*d95af8dfSAndroid Build Coastguard Worker cros_gralloc_buffer::cros_gralloc_buffer(struct bo *acquire_bo,
71*d95af8dfSAndroid Build Coastguard Worker struct cros_gralloc_handle *acquire_handle)
72*d95af8dfSAndroid Build Coastguard Worker : bo_(acquire_bo), hnd_(acquire_handle)
73*d95af8dfSAndroid Build Coastguard Worker {
74*d95af8dfSAndroid Build Coastguard Worker assert(bo_);
75*d95af8dfSAndroid Build Coastguard Worker assert(hnd_);
76*d95af8dfSAndroid Build Coastguard Worker for (uint32_t plane = 0; plane < DRV_MAX_PLANES; plane++)
77*d95af8dfSAndroid Build Coastguard Worker lock_data_[plane] = nullptr;
78*d95af8dfSAndroid Build Coastguard Worker }
79*d95af8dfSAndroid Build Coastguard Worker
~cros_gralloc_buffer()80*d95af8dfSAndroid Build Coastguard Worker cros_gralloc_buffer::~cros_gralloc_buffer()
81*d95af8dfSAndroid Build Coastguard Worker {
82*d95af8dfSAndroid Build Coastguard Worker drv_bo_destroy(bo_);
83*d95af8dfSAndroid Build Coastguard Worker if (reserved_region_addr_) {
84*d95af8dfSAndroid Build Coastguard Worker munmap(reserved_region_addr_, hnd_->reserved_region_size);
85*d95af8dfSAndroid Build Coastguard Worker }
86*d95af8dfSAndroid Build Coastguard Worker native_handle_close(hnd_);
87*d95af8dfSAndroid Build Coastguard Worker native_handle_delete(hnd_);
88*d95af8dfSAndroid Build Coastguard Worker }
89*d95af8dfSAndroid Build Coastguard Worker
get_id() const90*d95af8dfSAndroid Build Coastguard Worker uint32_t cros_gralloc_buffer::get_id() const
91*d95af8dfSAndroid Build Coastguard Worker {
92*d95af8dfSAndroid Build Coastguard Worker return hnd_->id;
93*d95af8dfSAndroid Build Coastguard Worker }
94*d95af8dfSAndroid Build Coastguard Worker
get_width() const95*d95af8dfSAndroid Build Coastguard Worker uint32_t cros_gralloc_buffer::get_width() const
96*d95af8dfSAndroid Build Coastguard Worker {
97*d95af8dfSAndroid Build Coastguard Worker return hnd_->width;
98*d95af8dfSAndroid Build Coastguard Worker }
99*d95af8dfSAndroid Build Coastguard Worker
get_pixel_stride() const100*d95af8dfSAndroid Build Coastguard Worker uint32_t cros_gralloc_buffer::get_pixel_stride() const
101*d95af8dfSAndroid Build Coastguard Worker {
102*d95af8dfSAndroid Build Coastguard Worker return hnd_->pixel_stride;
103*d95af8dfSAndroid Build Coastguard Worker }
104*d95af8dfSAndroid Build Coastguard Worker
get_height() const105*d95af8dfSAndroid Build Coastguard Worker uint32_t cros_gralloc_buffer::get_height() const
106*d95af8dfSAndroid Build Coastguard Worker {
107*d95af8dfSAndroid Build Coastguard Worker return hnd_->height;
108*d95af8dfSAndroid Build Coastguard Worker }
109*d95af8dfSAndroid Build Coastguard Worker
get_format() const110*d95af8dfSAndroid Build Coastguard Worker uint32_t cros_gralloc_buffer::get_format() const
111*d95af8dfSAndroid Build Coastguard Worker {
112*d95af8dfSAndroid Build Coastguard Worker return hnd_->format;
113*d95af8dfSAndroid Build Coastguard Worker }
114*d95af8dfSAndroid Build Coastguard Worker
get_format_modifier() const115*d95af8dfSAndroid Build Coastguard Worker uint64_t cros_gralloc_buffer::get_format_modifier() const
116*d95af8dfSAndroid Build Coastguard Worker {
117*d95af8dfSAndroid Build Coastguard Worker return hnd_->format_modifier;
118*d95af8dfSAndroid Build Coastguard Worker }
119*d95af8dfSAndroid Build Coastguard Worker
get_total_size() const120*d95af8dfSAndroid Build Coastguard Worker uint64_t cros_gralloc_buffer::get_total_size() const
121*d95af8dfSAndroid Build Coastguard Worker {
122*d95af8dfSAndroid Build Coastguard Worker return hnd_->total_size;
123*d95af8dfSAndroid Build Coastguard Worker }
124*d95af8dfSAndroid Build Coastguard Worker
get_num_planes() const125*d95af8dfSAndroid Build Coastguard Worker uint32_t cros_gralloc_buffer::get_num_planes() const
126*d95af8dfSAndroid Build Coastguard Worker {
127*d95af8dfSAndroid Build Coastguard Worker return hnd_->num_planes;
128*d95af8dfSAndroid Build Coastguard Worker }
129*d95af8dfSAndroid Build Coastguard Worker
get_plane_offset(uint32_t plane) const130*d95af8dfSAndroid Build Coastguard Worker uint32_t cros_gralloc_buffer::get_plane_offset(uint32_t plane) const
131*d95af8dfSAndroid Build Coastguard Worker {
132*d95af8dfSAndroid Build Coastguard Worker return hnd_->offsets[plane];
133*d95af8dfSAndroid Build Coastguard Worker }
134*d95af8dfSAndroid Build Coastguard Worker
get_plane_stride(uint32_t plane) const135*d95af8dfSAndroid Build Coastguard Worker uint32_t cros_gralloc_buffer::get_plane_stride(uint32_t plane) const
136*d95af8dfSAndroid Build Coastguard Worker {
137*d95af8dfSAndroid Build Coastguard Worker return hnd_->strides[plane];
138*d95af8dfSAndroid Build Coastguard Worker }
139*d95af8dfSAndroid Build Coastguard Worker
get_plane_size(uint32_t plane) const140*d95af8dfSAndroid Build Coastguard Worker uint32_t cros_gralloc_buffer::get_plane_size(uint32_t plane) const
141*d95af8dfSAndroid Build Coastguard Worker {
142*d95af8dfSAndroid Build Coastguard Worker return hnd_->sizes[plane];
143*d95af8dfSAndroid Build Coastguard Worker }
144*d95af8dfSAndroid Build Coastguard Worker
get_android_format() const145*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::get_android_format() const
146*d95af8dfSAndroid Build Coastguard Worker {
147*d95af8dfSAndroid Build Coastguard Worker return hnd_->droid_format;
148*d95af8dfSAndroid Build Coastguard Worker }
149*d95af8dfSAndroid Build Coastguard Worker
get_android_usage() const150*d95af8dfSAndroid Build Coastguard Worker int64_t cros_gralloc_buffer::get_android_usage() const
151*d95af8dfSAndroid Build Coastguard Worker {
152*d95af8dfSAndroid Build Coastguard Worker return hnd_->usage;
153*d95af8dfSAndroid Build Coastguard Worker }
154*d95af8dfSAndroid Build Coastguard Worker
get_name(std::optional<std::string> * name) const155*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::get_name(std::optional<std::string> *name) const
156*d95af8dfSAndroid Build Coastguard Worker {
157*d95af8dfSAndroid Build Coastguard Worker const struct cros_gralloc_buffer_metadata *metadata;
158*d95af8dfSAndroid Build Coastguard Worker
159*d95af8dfSAndroid Build Coastguard Worker int ret = get_metadata(&metadata);
160*d95af8dfSAndroid Build Coastguard Worker if (ret) {
161*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to get_name: failed to get metadata.");
162*d95af8dfSAndroid Build Coastguard Worker return ret;
163*d95af8dfSAndroid Build Coastguard Worker }
164*d95af8dfSAndroid Build Coastguard Worker
165*d95af8dfSAndroid Build Coastguard Worker *name = metadata->name;
166*d95af8dfSAndroid Build Coastguard Worker return 0;
167*d95af8dfSAndroid Build Coastguard Worker }
168*d95af8dfSAndroid Build Coastguard Worker
get_blend_mode(std::optional<BlendMode> * blend_mode) const169*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::get_blend_mode(std::optional<BlendMode> *blend_mode) const
170*d95af8dfSAndroid Build Coastguard Worker {
171*d95af8dfSAndroid Build Coastguard Worker const struct cros_gralloc_buffer_metadata *metadata;
172*d95af8dfSAndroid Build Coastguard Worker
173*d95af8dfSAndroid Build Coastguard Worker int ret = get_metadata(&metadata);
174*d95af8dfSAndroid Build Coastguard Worker if (ret) {
175*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to get_blend_mode: failed to get metadata.");
176*d95af8dfSAndroid Build Coastguard Worker return ret;
177*d95af8dfSAndroid Build Coastguard Worker }
178*d95af8dfSAndroid Build Coastguard Worker
179*d95af8dfSAndroid Build Coastguard Worker *blend_mode = metadata->blend_mode;
180*d95af8dfSAndroid Build Coastguard Worker return 0;
181*d95af8dfSAndroid Build Coastguard Worker }
182*d95af8dfSAndroid Build Coastguard Worker
set_blend_mode(BlendMode blend_mode)183*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::set_blend_mode(BlendMode blend_mode)
184*d95af8dfSAndroid Build Coastguard Worker {
185*d95af8dfSAndroid Build Coastguard Worker struct cros_gralloc_buffer_metadata *metadata;
186*d95af8dfSAndroid Build Coastguard Worker
187*d95af8dfSAndroid Build Coastguard Worker int ret = get_metadata(&metadata);
188*d95af8dfSAndroid Build Coastguard Worker if (ret) {
189*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to set_blend_mode: failed to get metadata.");
190*d95af8dfSAndroid Build Coastguard Worker return ret;
191*d95af8dfSAndroid Build Coastguard Worker }
192*d95af8dfSAndroid Build Coastguard Worker
193*d95af8dfSAndroid Build Coastguard Worker metadata->blend_mode = blend_mode;
194*d95af8dfSAndroid Build Coastguard Worker return 0;
195*d95af8dfSAndroid Build Coastguard Worker }
196*d95af8dfSAndroid Build Coastguard Worker
get_dataspace(std::optional<Dataspace> * dataspace) const197*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::get_dataspace(std::optional<Dataspace> *dataspace) const
198*d95af8dfSAndroid Build Coastguard Worker {
199*d95af8dfSAndroid Build Coastguard Worker const struct cros_gralloc_buffer_metadata *metadata;
200*d95af8dfSAndroid Build Coastguard Worker
201*d95af8dfSAndroid Build Coastguard Worker int ret = get_metadata(&metadata);
202*d95af8dfSAndroid Build Coastguard Worker if (ret) {
203*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to get_dataspace: failed to get metadata.");
204*d95af8dfSAndroid Build Coastguard Worker return ret;
205*d95af8dfSAndroid Build Coastguard Worker }
206*d95af8dfSAndroid Build Coastguard Worker
207*d95af8dfSAndroid Build Coastguard Worker *dataspace = metadata->dataspace;
208*d95af8dfSAndroid Build Coastguard Worker return 0;
209*d95af8dfSAndroid Build Coastguard Worker }
210*d95af8dfSAndroid Build Coastguard Worker
set_dataspace(Dataspace dataspace)211*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::set_dataspace(Dataspace dataspace)
212*d95af8dfSAndroid Build Coastguard Worker {
213*d95af8dfSAndroid Build Coastguard Worker struct cros_gralloc_buffer_metadata *metadata;
214*d95af8dfSAndroid Build Coastguard Worker
215*d95af8dfSAndroid Build Coastguard Worker int ret = get_metadata(&metadata);
216*d95af8dfSAndroid Build Coastguard Worker if (ret) {
217*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to set_dataspace: failed to get metadata.");
218*d95af8dfSAndroid Build Coastguard Worker return ret;
219*d95af8dfSAndroid Build Coastguard Worker }
220*d95af8dfSAndroid Build Coastguard Worker
221*d95af8dfSAndroid Build Coastguard Worker metadata->dataspace = dataspace;
222*d95af8dfSAndroid Build Coastguard Worker return 0;
223*d95af8dfSAndroid Build Coastguard Worker }
224*d95af8dfSAndroid Build Coastguard Worker
get_cta861_3(std::optional<Cta861_3> * cta) const225*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::get_cta861_3(std::optional<Cta861_3> *cta) const
226*d95af8dfSAndroid Build Coastguard Worker {
227*d95af8dfSAndroid Build Coastguard Worker const struct cros_gralloc_buffer_metadata *metadata;
228*d95af8dfSAndroid Build Coastguard Worker
229*d95af8dfSAndroid Build Coastguard Worker int ret = get_metadata(&metadata);
230*d95af8dfSAndroid Build Coastguard Worker if (ret) {
231*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to get_cta861_3: failed to get metadata.");
232*d95af8dfSAndroid Build Coastguard Worker return ret;
233*d95af8dfSAndroid Build Coastguard Worker }
234*d95af8dfSAndroid Build Coastguard Worker
235*d95af8dfSAndroid Build Coastguard Worker *cta = metadata->cta861_3.to_std_optional();
236*d95af8dfSAndroid Build Coastguard Worker return 0;
237*d95af8dfSAndroid Build Coastguard Worker }
238*d95af8dfSAndroid Build Coastguard Worker
set_cta861_3(std::optional<Cta861_3> cta)239*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::set_cta861_3(std::optional<Cta861_3> cta)
240*d95af8dfSAndroid Build Coastguard Worker {
241*d95af8dfSAndroid Build Coastguard Worker struct cros_gralloc_buffer_metadata *metadata;
242*d95af8dfSAndroid Build Coastguard Worker
243*d95af8dfSAndroid Build Coastguard Worker int ret = get_metadata(&metadata);
244*d95af8dfSAndroid Build Coastguard Worker if (ret) {
245*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to set_cta861_3: failed to get metadata.");
246*d95af8dfSAndroid Build Coastguard Worker return ret;
247*d95af8dfSAndroid Build Coastguard Worker }
248*d95af8dfSAndroid Build Coastguard Worker
249*d95af8dfSAndroid Build Coastguard Worker metadata->cta861_3 = cta;
250*d95af8dfSAndroid Build Coastguard Worker return 0;
251*d95af8dfSAndroid Build Coastguard Worker }
252*d95af8dfSAndroid Build Coastguard Worker
get_smpte2086(std::optional<Smpte2086> * smpte) const253*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::get_smpte2086(std::optional<Smpte2086> *smpte) const
254*d95af8dfSAndroid Build Coastguard Worker {
255*d95af8dfSAndroid Build Coastguard Worker const struct cros_gralloc_buffer_metadata *metadata;
256*d95af8dfSAndroid Build Coastguard Worker
257*d95af8dfSAndroid Build Coastguard Worker int ret = get_metadata(&metadata);
258*d95af8dfSAndroid Build Coastguard Worker if (ret) {
259*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to get_smpte2086: failed to get metadata.");
260*d95af8dfSAndroid Build Coastguard Worker return ret;
261*d95af8dfSAndroid Build Coastguard Worker }
262*d95af8dfSAndroid Build Coastguard Worker
263*d95af8dfSAndroid Build Coastguard Worker *smpte = metadata->smpte2086.to_std_optional();
264*d95af8dfSAndroid Build Coastguard Worker return 0;
265*d95af8dfSAndroid Build Coastguard Worker }
266*d95af8dfSAndroid Build Coastguard Worker
set_smpte2086(std::optional<Smpte2086> smpte)267*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::set_smpte2086(std::optional<Smpte2086> smpte)
268*d95af8dfSAndroid Build Coastguard Worker {
269*d95af8dfSAndroid Build Coastguard Worker struct cros_gralloc_buffer_metadata *metadata;
270*d95af8dfSAndroid Build Coastguard Worker
271*d95af8dfSAndroid Build Coastguard Worker int ret = get_metadata(&metadata);
272*d95af8dfSAndroid Build Coastguard Worker if (ret) {
273*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to set_cta861_3: failed to get metadata.");
274*d95af8dfSAndroid Build Coastguard Worker return ret;
275*d95af8dfSAndroid Build Coastguard Worker }
276*d95af8dfSAndroid Build Coastguard Worker
277*d95af8dfSAndroid Build Coastguard Worker metadata->smpte2086 = smpte;
278*d95af8dfSAndroid Build Coastguard Worker return 0;
279*d95af8dfSAndroid Build Coastguard Worker }
280*d95af8dfSAndroid Build Coastguard Worker
increase_refcount()281*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::increase_refcount()
282*d95af8dfSAndroid Build Coastguard Worker {
283*d95af8dfSAndroid Build Coastguard Worker return ++refcount_;
284*d95af8dfSAndroid Build Coastguard Worker }
285*d95af8dfSAndroid Build Coastguard Worker
decrease_refcount()286*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::decrease_refcount()
287*d95af8dfSAndroid Build Coastguard Worker {
288*d95af8dfSAndroid Build Coastguard Worker assert(refcount_ > 0);
289*d95af8dfSAndroid Build Coastguard Worker return --refcount_;
290*d95af8dfSAndroid Build Coastguard Worker }
291*d95af8dfSAndroid Build Coastguard Worker
lock(const struct rectangle * rect,uint32_t map_flags,uint8_t * addr[DRV_MAX_PLANES])292*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::lock(const struct rectangle *rect, uint32_t map_flags,
293*d95af8dfSAndroid Build Coastguard Worker uint8_t *addr[DRV_MAX_PLANES])
294*d95af8dfSAndroid Build Coastguard Worker {
295*d95af8dfSAndroid Build Coastguard Worker void *vaddr = nullptr;
296*d95af8dfSAndroid Build Coastguard Worker
297*d95af8dfSAndroid Build Coastguard Worker memset(addr, 0, DRV_MAX_PLANES * sizeof(*addr));
298*d95af8dfSAndroid Build Coastguard Worker
299*d95af8dfSAndroid Build Coastguard Worker if (map_flags) {
300*d95af8dfSAndroid Build Coastguard Worker if (lock_data_[0]) {
301*d95af8dfSAndroid Build Coastguard Worker drv_bo_invalidate(bo_, lock_data_[0]);
302*d95af8dfSAndroid Build Coastguard Worker vaddr = lock_data_[0]->vma->addr;
303*d95af8dfSAndroid Build Coastguard Worker } else {
304*d95af8dfSAndroid Build Coastguard Worker struct rectangle r = *rect;
305*d95af8dfSAndroid Build Coastguard Worker
306*d95af8dfSAndroid Build Coastguard Worker if (!r.width && !r.height && !r.x && !r.y) {
307*d95af8dfSAndroid Build Coastguard Worker /*
308*d95af8dfSAndroid Build Coastguard Worker * Android IMapper.hal: An accessRegion of all-zeros means the
309*d95af8dfSAndroid Build Coastguard Worker * entire buffer.
310*d95af8dfSAndroid Build Coastguard Worker */
311*d95af8dfSAndroid Build Coastguard Worker r.width = drv_bo_get_width(bo_);
312*d95af8dfSAndroid Build Coastguard Worker r.height = drv_bo_get_height(bo_);
313*d95af8dfSAndroid Build Coastguard Worker }
314*d95af8dfSAndroid Build Coastguard Worker
315*d95af8dfSAndroid Build Coastguard Worker vaddr = drv_bo_map(bo_, &r, map_flags, &lock_data_[0], 0);
316*d95af8dfSAndroid Build Coastguard Worker }
317*d95af8dfSAndroid Build Coastguard Worker
318*d95af8dfSAndroid Build Coastguard Worker if (vaddr == MAP_FAILED) {
319*d95af8dfSAndroid Build Coastguard Worker ALOGE("Mapping failed.");
320*d95af8dfSAndroid Build Coastguard Worker return -EFAULT;
321*d95af8dfSAndroid Build Coastguard Worker }
322*d95af8dfSAndroid Build Coastguard Worker }
323*d95af8dfSAndroid Build Coastguard Worker
324*d95af8dfSAndroid Build Coastguard Worker for (uint32_t plane = 0; plane < hnd_->num_planes; plane++)
325*d95af8dfSAndroid Build Coastguard Worker addr[plane] = static_cast<uint8_t *>(vaddr) + drv_bo_get_plane_offset(bo_, plane);
326*d95af8dfSAndroid Build Coastguard Worker
327*d95af8dfSAndroid Build Coastguard Worker lockcount_++;
328*d95af8dfSAndroid Build Coastguard Worker return 0;
329*d95af8dfSAndroid Build Coastguard Worker }
330*d95af8dfSAndroid Build Coastguard Worker
unlock()331*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::unlock()
332*d95af8dfSAndroid Build Coastguard Worker {
333*d95af8dfSAndroid Build Coastguard Worker if (lockcount_ <= 0) {
334*d95af8dfSAndroid Build Coastguard Worker ALOGE("Buffer was not locked.");
335*d95af8dfSAndroid Build Coastguard Worker return -EINVAL;
336*d95af8dfSAndroid Build Coastguard Worker }
337*d95af8dfSAndroid Build Coastguard Worker
338*d95af8dfSAndroid Build Coastguard Worker if (!--lockcount_) {
339*d95af8dfSAndroid Build Coastguard Worker if (lock_data_[0]) {
340*d95af8dfSAndroid Build Coastguard Worker drv_bo_flush_or_unmap(bo_, lock_data_[0]);
341*d95af8dfSAndroid Build Coastguard Worker lock_data_[0] = nullptr;
342*d95af8dfSAndroid Build Coastguard Worker }
343*d95af8dfSAndroid Build Coastguard Worker }
344*d95af8dfSAndroid Build Coastguard Worker
345*d95af8dfSAndroid Build Coastguard Worker return 0;
346*d95af8dfSAndroid Build Coastguard Worker }
347*d95af8dfSAndroid Build Coastguard Worker
resource_info(uint32_t strides[DRV_MAX_PLANES],uint32_t offsets[DRV_MAX_PLANES],uint64_t * format_modifier)348*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::resource_info(uint32_t strides[DRV_MAX_PLANES],
349*d95af8dfSAndroid Build Coastguard Worker uint32_t offsets[DRV_MAX_PLANES],
350*d95af8dfSAndroid Build Coastguard Worker uint64_t *format_modifier)
351*d95af8dfSAndroid Build Coastguard Worker {
352*d95af8dfSAndroid Build Coastguard Worker return drv_resource_info(bo_, strides, offsets, format_modifier);
353*d95af8dfSAndroid Build Coastguard Worker }
354*d95af8dfSAndroid Build Coastguard Worker
invalidate()355*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::invalidate()
356*d95af8dfSAndroid Build Coastguard Worker {
357*d95af8dfSAndroid Build Coastguard Worker if (lockcount_ <= 0) {
358*d95af8dfSAndroid Build Coastguard Worker ALOGE("Buffer was not locked.");
359*d95af8dfSAndroid Build Coastguard Worker return -EINVAL;
360*d95af8dfSAndroid Build Coastguard Worker }
361*d95af8dfSAndroid Build Coastguard Worker
362*d95af8dfSAndroid Build Coastguard Worker if (lock_data_[0])
363*d95af8dfSAndroid Build Coastguard Worker return drv_bo_invalidate(bo_, lock_data_[0]);
364*d95af8dfSAndroid Build Coastguard Worker
365*d95af8dfSAndroid Build Coastguard Worker return 0;
366*d95af8dfSAndroid Build Coastguard Worker }
367*d95af8dfSAndroid Build Coastguard Worker
flush()368*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::flush()
369*d95af8dfSAndroid Build Coastguard Worker {
370*d95af8dfSAndroid Build Coastguard Worker if (lockcount_ <= 0) {
371*d95af8dfSAndroid Build Coastguard Worker ALOGE("Buffer was not locked.");
372*d95af8dfSAndroid Build Coastguard Worker return -EINVAL;
373*d95af8dfSAndroid Build Coastguard Worker }
374*d95af8dfSAndroid Build Coastguard Worker
375*d95af8dfSAndroid Build Coastguard Worker if (lock_data_[0])
376*d95af8dfSAndroid Build Coastguard Worker return drv_bo_flush(bo_, lock_data_[0]);
377*d95af8dfSAndroid Build Coastguard Worker
378*d95af8dfSAndroid Build Coastguard Worker return 0;
379*d95af8dfSAndroid Build Coastguard Worker }
380*d95af8dfSAndroid Build Coastguard Worker
get_reserved_region(void ** addr,uint64_t * size) const381*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::get_reserved_region(void **addr, uint64_t *size) const
382*d95af8dfSAndroid Build Coastguard Worker {
383*d95af8dfSAndroid Build Coastguard Worker int32_t reserved_region_fd = hnd_->fds[hnd_->num_planes];
384*d95af8dfSAndroid Build Coastguard Worker if (reserved_region_fd < 0) {
385*d95af8dfSAndroid Build Coastguard Worker ALOGE("Buffer does not have reserved region.");
386*d95af8dfSAndroid Build Coastguard Worker return -EINVAL;
387*d95af8dfSAndroid Build Coastguard Worker }
388*d95af8dfSAndroid Build Coastguard Worker
389*d95af8dfSAndroid Build Coastguard Worker if (!reserved_region_addr_) {
390*d95af8dfSAndroid Build Coastguard Worker reserved_region_addr_ =
391*d95af8dfSAndroid Build Coastguard Worker mmap(nullptr, hnd_->reserved_region_size, PROT_WRITE | PROT_READ, MAP_SHARED,
392*d95af8dfSAndroid Build Coastguard Worker reserved_region_fd, 0);
393*d95af8dfSAndroid Build Coastguard Worker if (reserved_region_addr_ == MAP_FAILED) {
394*d95af8dfSAndroid Build Coastguard Worker ALOGE("Failed to mmap reserved region: %s.", strerror(errno));
395*d95af8dfSAndroid Build Coastguard Worker return -errno;
396*d95af8dfSAndroid Build Coastguard Worker }
397*d95af8dfSAndroid Build Coastguard Worker }
398*d95af8dfSAndroid Build Coastguard Worker
399*d95af8dfSAndroid Build Coastguard Worker *addr = reserved_region_addr_;
400*d95af8dfSAndroid Build Coastguard Worker *size = hnd_->reserved_region_size;
401*d95af8dfSAndroid Build Coastguard Worker return 0;
402*d95af8dfSAndroid Build Coastguard Worker }
403*d95af8dfSAndroid Build Coastguard Worker
get_client_reserved_region(void ** client_reserved_region_addr,uint64_t * client_reserved_region_size) const404*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::get_client_reserved_region(void **client_reserved_region_addr,
405*d95af8dfSAndroid Build Coastguard Worker uint64_t *client_reserved_region_size) const
406*d95af8dfSAndroid Build Coastguard Worker {
407*d95af8dfSAndroid Build Coastguard Worker int32_t ret = get_reserved_region(client_reserved_region_addr, client_reserved_region_size);
408*d95af8dfSAndroid Build Coastguard Worker if (ret) {
409*d95af8dfSAndroid Build Coastguard Worker return ret;
410*d95af8dfSAndroid Build Coastguard Worker }
411*d95af8dfSAndroid Build Coastguard Worker
412*d95af8dfSAndroid Build Coastguard Worker *client_reserved_region_addr =
413*d95af8dfSAndroid Build Coastguard Worker reinterpret_cast<void *>(reinterpret_cast<char *>(*client_reserved_region_addr) +
414*d95af8dfSAndroid Build Coastguard Worker sizeof(struct cros_gralloc_buffer_metadata));
415*d95af8dfSAndroid Build Coastguard Worker *client_reserved_region_size =
416*d95af8dfSAndroid Build Coastguard Worker *client_reserved_region_size - sizeof(struct cros_gralloc_buffer_metadata);
417*d95af8dfSAndroid Build Coastguard Worker return 0;
418*d95af8dfSAndroid Build Coastguard Worker }
419*d95af8dfSAndroid Build Coastguard Worker
get_metadata(struct cros_gralloc_buffer_metadata ** metadata)420*d95af8dfSAndroid Build Coastguard Worker int32_t cros_gralloc_buffer::get_metadata(struct cros_gralloc_buffer_metadata **metadata)
421*d95af8dfSAndroid Build Coastguard Worker {
422*d95af8dfSAndroid Build Coastguard Worker void *metadata_addr;
423*d95af8dfSAndroid Build Coastguard Worker uint64_t metadata_region_size;
424*d95af8dfSAndroid Build Coastguard Worker int32_t ret = get_reserved_region(&metadata_addr, &metadata_region_size);
425*d95af8dfSAndroid Build Coastguard Worker if (ret) {
426*d95af8dfSAndroid Build Coastguard Worker return ret;
427*d95af8dfSAndroid Build Coastguard Worker }
428*d95af8dfSAndroid Build Coastguard Worker
429*d95af8dfSAndroid Build Coastguard Worker if (metadata_addr == nullptr) {
430*d95af8dfSAndroid Build Coastguard Worker return -1;
431*d95af8dfSAndroid Build Coastguard Worker }
432*d95af8dfSAndroid Build Coastguard Worker
433*d95af8dfSAndroid Build Coastguard Worker *metadata = reinterpret_cast<struct cros_gralloc_buffer_metadata *>(metadata_addr);
434*d95af8dfSAndroid Build Coastguard Worker return 0;
435*d95af8dfSAndroid Build Coastguard Worker }
436*d95af8dfSAndroid Build Coastguard Worker
437*d95af8dfSAndroid Build Coastguard Worker int32_t
get_metadata(const struct cros_gralloc_buffer_metadata ** metadata) const438*d95af8dfSAndroid Build Coastguard Worker cros_gralloc_buffer::get_metadata(const struct cros_gralloc_buffer_metadata **metadata) const
439*d95af8dfSAndroid Build Coastguard Worker {
440*d95af8dfSAndroid Build Coastguard Worker void *metadata_addr;
441*d95af8dfSAndroid Build Coastguard Worker uint64_t metadata_region_size;
442*d95af8dfSAndroid Build Coastguard Worker int32_t ret = get_reserved_region(&metadata_addr, &metadata_region_size);
443*d95af8dfSAndroid Build Coastguard Worker if (ret) {
444*d95af8dfSAndroid Build Coastguard Worker return ret;
445*d95af8dfSAndroid Build Coastguard Worker }
446*d95af8dfSAndroid Build Coastguard Worker
447*d95af8dfSAndroid Build Coastguard Worker if (metadata_addr == nullptr) {
448*d95af8dfSAndroid Build Coastguard Worker return -1;
449*d95af8dfSAndroid Build Coastguard Worker }
450*d95af8dfSAndroid Build Coastguard Worker
451*d95af8dfSAndroid Build Coastguard Worker *metadata = reinterpret_cast<const struct cros_gralloc_buffer_metadata *>(metadata_addr);
452*d95af8dfSAndroid Build Coastguard Worker return 0;
453*d95af8dfSAndroid Build Coastguard Worker }
454