Commit 45063aa6 authored by Kristian H. Kristensen's avatar Kristian H. Kristensen Committed by Commit Bot

ozone/drm: Use upstream drm color structs and blob functions

Bug: 586475, 733703
Change-Id: Id8a08fefff1af4f80fd5520a18cc1c9417147552
Reviewed-on: https://chromium-review.googlesource.com/848301Reviewed-by: default avatarDaniel Nicoara <dnicoara@chromium.org>
Commit-Queue: Kristian H. Kristensen <hoegsberg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#526866}
parent 7cd06d4e
...@@ -18,11 +18,6 @@ ...@@ -18,11 +18,6 @@
#include "ui/display/types/display_mode.h" #include "ui/display/types/display_mode.h"
#include "ui/display/util/edid_parser.h" #include "ui/display/util/edid_parser.h"
#if !defined(DRM_FORMAT_R16)
// TODO(riju): crbug.com/733703
#define DRM_FORMAT_R16 fourcc_code('R', '1', '6', ' ')
#endif
namespace ui { namespace ui {
namespace { namespace {
......
...@@ -129,72 +129,8 @@ bool CanQueryForResources(int fd) { ...@@ -129,72 +129,8 @@ bool CanQueryForResources(int fd) {
return !drmIoctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &resources); return !drmIoctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &resources);
} }
// TODO(robert.bradford): Replace with libdrm structures after libdrm roll. using ScopedDrmColorLutPtr = std::unique_ptr<drm_color_lut, base::FreeDeleter>;
// https://crbug.com/586475 using ScopedDrmColorCtmPtr = std::unique_ptr<drm_color_ctm, base::FreeDeleter>;
struct DrmColorLut {
uint16_t red;
uint16_t green;
uint16_t blue;
uint16_t reserved;
};
struct DrmColorCtm {
int64_t ctm_coeff[9];
};
struct DrmModeCreateBlob {
uint64_t data;
uint32_t length;
uint32_t blob_id;
};
struct DrmModeDestroyBlob {
uint32_t blob_id;
};
#ifndef DRM_IOCTL_MODE_CREATEPROPBLOB
#define DRM_IOCTL_MODE_CREATEPROPBLOB DRM_IOWR(0xBD, struct DrmModeCreateBlob)
#endif
#ifndef DRM_IOCTL_MODE_DESTROYPROPBLOB
#define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct DrmModeDestroyBlob)
#endif
int CreatePropertyBlob(int fd, const void* data, size_t length, uint32_t* id) {
DrmModeCreateBlob create;
int ret;
if (length >= 0xffffffff)
return -ERANGE;
memset(&create, 0, sizeof(create));
create.length = length;
create.data = (uintptr_t)data;
create.blob_id = 0;
*id = 0;
ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATEPROPBLOB, &create);
ret = ret < 0 ? -errno : ret;
if (ret != 0)
return ret;
*id = create.blob_id;
return 0;
}
int DestroyPropertyBlob(int fd, uint32_t id) {
DrmModeDestroyBlob destroy;
int ret;
memset(&destroy, 0, sizeof(destroy));
destroy.blob_id = id;
ret = drmIoctl(fd, DRM_IOCTL_MODE_DESTROYPROPBLOB, &destroy);
return ret < 0 ? -errno : ret;
}
using ScopedDrmColorLutPtr = std::unique_ptr<DrmColorLut, base::FreeDeleter>;
using ScopedDrmColorCtmPtr = std::unique_ptr<DrmColorCtm, base::FreeDeleter>;
ScopedDrmColorLutPtr CreateLutBlob( ScopedDrmColorLutPtr CreateLutBlob(
const std::vector<display::GammaRampRGBEntry>& source) { const std::vector<display::GammaRampRGBEntry>& source) {
...@@ -202,9 +138,9 @@ ScopedDrmColorLutPtr CreateLutBlob( ...@@ -202,9 +138,9 @@ ScopedDrmColorLutPtr CreateLutBlob(
if (source.empty()) if (source.empty())
return nullptr; return nullptr;
ScopedDrmColorLutPtr lut( ScopedDrmColorLutPtr lut(static_cast<drm_color_lut*>(
static_cast<DrmColorLut*>(malloc(sizeof(DrmColorLut) * source.size()))); malloc(sizeof(drm_color_lut) * source.size())));
DrmColorLut* p = lut.get(); drm_color_lut* p = lut.get();
for (size_t i = 0; i < source.size(); ++i) { for (size_t i = 0; i < source.size(); ++i) {
p[i].red = source[i].r; p[i].red = source[i].r;
p[i].green = source[i].g; p[i].green = source[i].g;
...@@ -219,15 +155,15 @@ ScopedDrmColorCtmPtr CreateCTMBlob( ...@@ -219,15 +155,15 @@ ScopedDrmColorCtmPtr CreateCTMBlob(
return nullptr; return nullptr;
ScopedDrmColorCtmPtr ctm( ScopedDrmColorCtmPtr ctm(
static_cast<DrmColorCtm*>(malloc(sizeof(DrmColorCtm)))); static_cast<drm_color_ctm*>(malloc(sizeof(drm_color_ctm))));
for (size_t i = 0; i < arraysize(ctm->ctm_coeff); ++i) { for (size_t i = 0; i < arraysize(ctm->matrix); ++i) {
if (correction_matrix[i] < 0) { if (correction_matrix[i] < 0) {
ctm->ctm_coeff[i] = static_cast<uint64_t>( ctm->matrix[i] = static_cast<uint64_t>(-correction_matrix[i] *
-correction_matrix[i] * (static_cast<uint64_t>(1) << 32)); (static_cast<uint64_t>(1) << 32));
ctm->ctm_coeff[i] |= static_cast<uint64_t>(1) << 63; ctm->matrix[i] |= static_cast<uint64_t>(1) << 63;
} else { } else {
ctm->ctm_coeff[i] = static_cast<uint64_t>( ctm->matrix[i] = static_cast<uint64_t>(correction_matrix[i] *
correction_matrix[i] * (static_cast<uint64_t>(1) << 32)); (static_cast<uint64_t>(1) << 32));
} }
} }
return ctm; return ctm;
...@@ -244,7 +180,7 @@ bool SetBlobProperty(int fd, ...@@ -244,7 +180,7 @@ bool SetBlobProperty(int fd,
int res; int res;
if (data) { if (data) {
res = CreatePropertyBlob(fd, data, length, &blob_id); res = drmModeCreatePropertyBlob(fd, data, length, &blob_id);
if (res != 0) { if (res != 0) {
LOG(ERROR) << "Error creating property blob: " << base::safe_strerror(res) LOG(ERROR) << "Error creating property blob: " << base::safe_strerror(res)
<< " for property " << property_name; << " for property " << property_name;
...@@ -261,7 +197,7 @@ bool SetBlobProperty(int fd, ...@@ -261,7 +197,7 @@ bool SetBlobProperty(int fd,
success = true; success = true;
} }
if (blob_id != 0) if (blob_id != 0)
DestroyPropertyBlob(fd, blob_id); drmModeDestroyPropertyBlob(fd, blob_id);
return success; return success;
} }
...@@ -795,7 +731,7 @@ bool DrmDevice::SetColorCorrection( ...@@ -795,7 +731,7 @@ bool DrmDevice::SetColorCorrection(
file_.GetPlatformFile(), crtc_id, DRM_MODE_OBJECT_CRTC, file_.GetPlatformFile(), crtc_id, DRM_MODE_OBJECT_CRTC,
crtc_props->props[i], property->name, crtc_props->props[i], property->name,
reinterpret_cast<unsigned char*>(degamma_blob_data.get()), reinterpret_cast<unsigned char*>(degamma_blob_data.get()),
sizeof(DrmColorLut) * degamma_lut_size)) sizeof(drm_color_lut) * degamma_lut_size))
return false; return false;
} }
if (!strcmp(property->name, "GAMMA_LUT")) { if (!strcmp(property->name, "GAMMA_LUT")) {
...@@ -803,7 +739,7 @@ bool DrmDevice::SetColorCorrection( ...@@ -803,7 +739,7 @@ bool DrmDevice::SetColorCorrection(
file_.GetPlatformFile(), crtc_id, DRM_MODE_OBJECT_CRTC, file_.GetPlatformFile(), crtc_id, DRM_MODE_OBJECT_CRTC,
crtc_props->props[i], property->name, crtc_props->props[i], property->name,
reinterpret_cast<unsigned char*>(gamma_blob_data.get()), reinterpret_cast<unsigned char*>(gamma_blob_data.get()),
sizeof(DrmColorLut) * gamma_lut_size)) sizeof(drm_color_lut) * gamma_lut_size))
return false; return false;
} }
if (!strcmp(property->name, "CTM")) { if (!strcmp(property->name, "CTM")) {
...@@ -811,7 +747,7 @@ bool DrmDevice::SetColorCorrection( ...@@ -811,7 +747,7 @@ bool DrmDevice::SetColorCorrection(
file_.GetPlatformFile(), crtc_id, DRM_MODE_OBJECT_CRTC, file_.GetPlatformFile(), crtc_id, DRM_MODE_OBJECT_CRTC,
crtc_props->props[i], property->name, crtc_props->props[i], property->name,
reinterpret_cast<unsigned char*>(ctm_blob_data.get()), reinterpret_cast<unsigned char*>(ctm_blob_data.get()),
sizeof(DrmColorCtm))) sizeof(drm_color_ctm)))
return false; return false;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment