Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(116)

Unified Diff: ui/ozone/platform/dri/dri_wrapper.cc

Issue 402773002: [Ozone-DRI] Removing MockDriSurface implementation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/ozone/platform/dri/dri_wrapper.cc
diff --git a/ui/ozone/platform/dri/dri_wrapper.cc b/ui/ozone/platform/dri/dri_wrapper.cc
index 908ddf079f86080c74c10d22fe8f617dae861a12..035243c95ef62961eb8ecc24043013393c77a3b0 100644
--- a/ui/ozone/platform/dri/dri_wrapper.cc
+++ b/ui/ozone/platform/dri/dri_wrapper.cc
@@ -5,18 +5,58 @@
#include "ui/ozone/platform/dri/dri_wrapper.h"
#include <fcntl.h>
+#include <sys/mman.h>
#include <unistd.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
#include "base/logging.h"
+#include "third_party/skia/include/core/SkImageInfo.h"
+#include "ui/ozone/platform/dri/dri_util.h"
namespace ui {
+
namespace {
+
uint32_t ToFixedPoint(double v) {
// This returns a number in a 16-bit.16-bit fixed point.
return v * 65536.0;
}
+
+bool DrmCreateDumbBuffer(int fd,
+ const SkImageInfo& info,
+ uint32_t* handle,
+ uint32_t* stride) {
+ struct drm_mode_create_dumb request;
+ memset(&request, 0, sizeof(request));
+ request.width = info.width();
+ request.height = info.height();
+ request.bpp = info.bytesPerPixel() << 3;
+ request.flags = 0;
+
+ if (drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &request) < 0) {
+ VLOG(2) << "Cannot create dumb buffer (" << errno << ") "
+ << strerror(errno);
+ return false;
+ }
+
+ // The driver may choose to align the last row as well. We don't care about
+ // the last alignment bits since they aren't used for display purposes, so
+ // just check that the expected size is <= to what the driver allocated.
+ DCHECK_LE(info.getSafeSize(request.pitch), request.size);
+
+ *handle = request.handle;
+ *stride = request.pitch;
+ return true;
+}
+
+void DrmDestroyDumbBuffer(int fd, uint32_t handle) {
+ struct drm_mode_destroy_dumb destroy_request;
+ memset(&destroy_request, 0, sizeof(destroy_request));
+ destroy_request.handle = handle;
+ drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_request);
+}
+
} // namespace
DriWrapper::DriWrapper(const char* device_path) {
@@ -174,4 +214,31 @@ void DriWrapper::HandleEvent(drmEventContext& event) {
drmHandleEvent(fd_, &event);
}
+bool DriWrapper::CreateDumbBuffer(const SkImageInfo& info,
+ uint32_t* handle,
+ uint32_t* stride,
+ void** pixels) {
+ CHECK(fd_ >= 0);
+
+ if (!DrmCreateDumbBuffer(fd_, info, handle, stride))
+ return false;
+
+ if (!MapDumbBuffer(fd_, *handle, info.getSafeSize(*stride), pixels)) {
+ DrmDestroyDumbBuffer(fd_, *handle);
+ return false;
+ }
+
+ return true;
+}
+
+void DriWrapper::DestroyDumbBuffer(const SkImageInfo& info,
+ uint32_t handle,
+ uint32_t stride,
+ void* pixels) {
+ CHECK(fd_ >= 0);
+ munmap(pixels, info.getSafeSize(stride));
+ DrmDestroyDumbBuffer(fd_, handle);
+}
+
+
} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698