xref: /aosp_15_r20/external/minigbm/cros_gralloc/cros_gralloc_buffer.cc (revision d95af8df99a05bcb8679a54dc3ab8e5cd312b38e)
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