#include "cros_gralloc_driver.h"
#include "../util.h"
+#include "i915_private_android.h"
+
#include <cstdlib>
#include <fcntl.h>
#include <xf86drm.h>
struct cros_gralloc_handle *hnd;
resolved_format = drv_resolve_format(drv_, descriptor->drm_format, descriptor->use_flags);
- bo = drv_bo_create(drv_, descriptor->width, descriptor->height, resolved_format,
- descriptor->use_flags);
+ if (descriptor->modifier == 0) {
+ bo = drv_bo_create(drv_, descriptor->width, descriptor->height, resolved_format,
+ descriptor->use_flags);
+ } else {
+ bo = drv_bo_create_with_modifiers(drv_, descriptor->width, descriptor->height,
+ resolved_format, &descriptor->modifier, 1);
+ }
if (!bo) {
cros_gralloc_error("Failed to create bo.");
return -ENOMEM;
hnd->fds[plane] = drv_bo_get_plane_fd(bo, plane);
hnd->strides[plane] = drv_bo_get_plane_stride(bo, plane);
hnd->offsets[plane] = drv_bo_get_plane_offset(bo, plane);
+ hnd->sizes[plane] = drv_bo_get_plane_size(bo, plane);
mod = drv_bo_get_plane_format_modifier(bo, plane);
hnd->format_modifiers[2 * plane] = static_cast<uint32_t>(mod >> 32);
hnd->width = drv_bo_get_width(bo);
hnd->height = drv_bo_get_height(bo);
hnd->format = drv_bo_get_format(bo);
+ hnd->tiling_mode = drv_bo_get_stride_or_tiling(bo);
hnd->use_flags[0] = static_cast<uint32_t>(descriptor->use_flags >> 32);
hnd->use_flags[1] = static_cast<uint32_t>(descriptor->use_flags);
hnd->pixel_stride = drv_bo_get_stride_in_pixels(bo);
hnd->magic = cros_gralloc_magic;
- hnd->droid_format = descriptor->droid_format;
+ int32_t format = i915_private_invert_format(hnd->format);
+ if (format == 0) {
+ format = descriptor->droid_format;
+ }
+ hnd->droid_format = format;
hnd->usage = descriptor->producer_usage;
hnd->producer_usage = descriptor->producer_usage;
hnd->consumer_usage = descriptor->consumer_usage;
id = drv_bo_get_plane_handle(bo, 0).u32;
auto buffer = new cros_gralloc_buffer(id, bo, hnd);
- std::lock_guard<std::mutex> lock(mutex_);
+ SCOPED_SPIN_LOCK(mutex_);
buffers_.emplace(id, buffer);
handles_.emplace(hnd, std::make_pair(buffer, 1));
*out_handle = &hnd->base;
int32_t cros_gralloc_driver::retain(buffer_handle_t handle)
{
uint32_t id;
- std::lock_guard<std::mutex> lock(mutex_);
+ SCOPED_SPIN_LOCK(mutex_);
auto hnd = cros_gralloc_convert_handle(handle);
if (!hnd) {
int32_t cros_gralloc_driver::release(buffer_handle_t handle)
{
- std::lock_guard<std::mutex> lock(mutex_);
+ SCOPED_SPIN_LOCK(mutex_);
auto hnd = cros_gralloc_convert_handle(handle);
if (!hnd) {
if (ret)
return ret;
- std::lock_guard<std::mutex> lock(mutex_);
+ SCOPED_SPIN_LOCK(mutex_);
auto hnd = cros_gralloc_convert_handle(handle);
if (!hnd) {
cros_gralloc_error("Invalid handle.");
int32_t cros_gralloc_driver::unlock(buffer_handle_t handle, int32_t *release_fence)
{
- std::lock_guard<std::mutex> lock(mutex_);
+ SCOPED_SPIN_LOCK(mutex_);;
auto hnd = cros_gralloc_convert_handle(handle);
if (!hnd) {
int32_t cros_gralloc_driver::get_backing_store(buffer_handle_t handle, uint64_t *out_store)
{
- std::lock_guard<std::mutex> lock(mutex_);
+ SCOPED_SPIN_LOCK(mutex_);
auto hnd = cros_gralloc_convert_handle(handle);
if (!hnd) {