summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Macnak <natsu@google.com>2022-02-08 16:56:57 -0800
committerCommit Bot <commit-bot@chromium.org>2022-02-17 07:05:58 +0000
commitb6aeea6135c025ba7270fe9ae6cfd474e171f351 (patch)
tree41f34764ff64cd0904c65020b60995d3b1d2003e
parentd63bacdd0208ddd18d6d2acbe7356561df4feccc (diff)
downloadminigbm-b6aeea6135c025ba7270fe9ae6cfd474e171f351.tar.gz
gralloc: Use std::unique_ptr for drv_
BUG=b:207388558 TEST=cvd start TEST=vts -m VtsHalGraphicsMapperV4_0Target Change-Id: Ic27bcdae1e63cf869ceff779d113df778f3b7e0d Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/3449612 Reviewed-by: Roman Stratiienko <r.stratiienko@gmail.com> Reviewed-by: Dominik Behr <dbehr@chromium.org> Tested-by: Jason Macnak <natsu@google.com> Commit-Queue: Jason Macnak <natsu@google.com>
-rw-r--r--cros_gralloc/cros_gralloc_driver.cc51
-rw-r--r--cros_gralloc/cros_gralloc_driver.h3
2 files changed, 31 insertions, 23 deletions
diff --git a/cros_gralloc/cros_gralloc_driver.cc b/cros_gralloc/cros_gralloc_driver.cc
index 228073e..f719edb 100644
--- a/cros_gralloc/cros_gralloc_driver.cc
+++ b/cros_gralloc/cros_gralloc_driver.cc
@@ -78,7 +78,7 @@ static struct driver *init_try_node(int idx, char const *str)
return drv;
}
-cros_gralloc_driver::cros_gralloc_driver()
+static struct driver *init_try_nodes()
{
/*
* Create a driver from render nodes first, then try card
@@ -87,6 +87,7 @@ cros_gralloc_driver::cros_gralloc_driver()
* TODO(gsingh): Enable render nodes on udl/evdi.
*/
+ struct driver *drv;
char const *render_nodes_fmt = "%s/renderD%d";
char const *card_nodes_fmt = "%s/card%d";
uint32_t num_nodes = DRM_NUM_NODES;
@@ -97,29 +98,35 @@ cros_gralloc_driver::cros_gralloc_driver()
// Try render nodes...
for (uint32_t i = min_render_node; i < max_render_node; i++) {
- drv_ = init_try_node(i, render_nodes_fmt);
- if (drv_)
- return;
+ drv = init_try_node(i, render_nodes_fmt);
+ if (drv)
+ return drv;
}
// Try card nodes... for vkms mostly.
for (uint32_t i = min_card_node; i < max_card_node; i++) {
- drv_ = init_try_node(i, card_nodes_fmt);
- if (drv_)
- return;
+ drv = init_try_node(i, card_nodes_fmt);
+ if (drv)
+ return drv;
}
+
+ return nullptr;
+}
+
+static void drv_destroy_and_close(struct driver *drv)
+{
+ int fd = drv_get_fd(drv);
+ drv_destroy(drv);
+ close(fd);
+}
+
+cros_gralloc_driver::cros_gralloc_driver() : drv_(init_try_nodes(), drv_destroy_and_close)
+{
}
cros_gralloc_driver::~cros_gralloc_driver()
{
buffers_.clear();
-
- if (drv_) {
- int fd = drv_get_fd(drv_);
- drv_destroy(drv_);
- drv_ = nullptr;
- close(fd);
- }
}
bool cros_gralloc_driver::is_initialized()
@@ -135,10 +142,10 @@ bool cros_gralloc_driver::get_resolved_format_and_use_flags(
uint64_t resolved_use_flags;
struct combination *combo;
- drv_resolve_format_and_use_flags(drv_, descriptor->drm_format, descriptor->use_flags,
+ drv_resolve_format_and_use_flags(drv_.get(), descriptor->drm_format, descriptor->use_flags,
&resolved_format, &resolved_use_flags);
- combo = drv_get_combination(drv_, resolved_format, resolved_use_flags);
+ combo = drv_get_combination(drv_.get(), resolved_format, resolved_use_flags);
if (!combo && (descriptor->droid_usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) &&
descriptor->droid_format != HAL_PIXEL_FORMAT_YCbCr_420_888) {
// Unmask BO_USE_HW_VIDEO_ENCODER for other formats. They are mostly
@@ -146,12 +153,12 @@ bool cros_gralloc_driver::get_resolved_format_and_use_flags(
// camera). YV12 is passed to the encoder component, but it is converted
// to YCbCr_420_888 before being passed to the hw encoder.
resolved_use_flags &= ~BO_USE_HW_VIDEO_ENCODER;
- combo = drv_get_combination(drv_, resolved_format, resolved_use_flags);
+ combo = drv_get_combination(drv_.get(), resolved_format, resolved_use_flags);
}
if (!combo && (descriptor->droid_usage & BUFFER_USAGE_FRONT_RENDERING)) {
resolved_use_flags &= ~BO_USE_FRONT_RENDERING;
resolved_use_flags |= BO_USE_LINEAR;
- combo = drv_get_combination(drv_, resolved_format, resolved_use_flags);
+ combo = drv_get_combination(drv_.get(), resolved_format, resolved_use_flags);
}
if (!combo)
return false;
@@ -165,7 +172,7 @@ bool cros_gralloc_driver::is_supported(const struct cros_gralloc_buffer_descript
{
uint32_t resolved_format;
uint64_t resolved_use_flags;
- uint32_t max_texture_size = drv_get_max_texture_2d_size(drv_);
+ uint32_t max_texture_size = drv_get_max_texture_2d_size(drv_.get());
if (!get_resolved_format_and_use_flags(descriptor, &resolved_format, &resolved_use_flags))
return false;
@@ -211,7 +218,7 @@ int32_t cros_gralloc_driver::allocate(const struct cros_gralloc_buffer_descripto
return -EINVAL;
}
- bo = drv_bo_create(drv_, descriptor->width, descriptor->height, resolved_format,
+ bo = drv_bo_create(drv_.get(), descriptor->width, descriptor->height, resolved_format,
resolved_use_flags);
if (!bo) {
drv_log("Failed to create bo.\n");
@@ -334,7 +341,7 @@ int32_t cros_gralloc_driver::retain(buffer_handle_t handle)
memcpy(data.strides, hnd->strides, sizeof(data.strides));
memcpy(data.offsets, hnd->offsets, sizeof(data.offsets));
- struct bo *bo = drv_bo_import(drv_, &data);
+ struct bo *bo = drv_bo_import(drv_.get(), &data);
if (!bo)
return -EFAULT;
@@ -544,7 +551,7 @@ uint32_t cros_gralloc_driver::get_resolved_drm_format(uint32_t drm_format, uint6
uint32_t resolved_format;
uint64_t resolved_use_flags;
- drv_resolve_format_and_use_flags(drv_, drm_format, use_flags, &resolved_format,
+ drv_resolve_format_and_use_flags(drv_.get(), drm_format, use_flags, &resolved_format,
&resolved_use_flags);
return resolved_format;
diff --git a/cros_gralloc/cros_gralloc_driver.h b/cros_gralloc/cros_gralloc_driver.h
index b99ce19..6de5df9 100644
--- a/cros_gralloc/cros_gralloc_driver.h
+++ b/cros_gralloc/cros_gralloc_driver.h
@@ -54,7 +54,8 @@ class cros_gralloc_driver
get_resolved_format_and_use_flags(const struct cros_gralloc_buffer_descriptor *descriptor,
uint32_t *out_format, uint64_t *out_use_flags);
- struct driver *drv_ = nullptr;
+ std::unique_ptr<struct driver, void (*)(struct driver *)> drv_;
+
std::mutex mutex_;
std::unordered_map<uint32_t, std::unique_ptr<cros_gralloc_buffer>> buffers_;
};