index 730d2976d95a59210b6f9eb88682fdbcc33a4002..4fae49ebc0045bac6cfc08f85d7c9c791ec9194c 100644 (file)
Destroy();
}
-uint32_t DumbFramebuffer::prime_fd(unsigned int plane)
-{
- if (m_planes[plane].prime_fd >= 0)
- return m_planes[plane].prime_fd;
-
- int r = drmPrimeHandleToFD(card().fd(), m_planes[plane].handle,
- DRM_CLOEXEC, &m_planes[plane].prime_fd);
- if (r)
- throw std::runtime_error("drmPrimeHandleToFD failed\n");
-
- return m_planes[plane].prime_fd;
-}
-
struct FormatPlaneInfo
{
uint8_t bitspp; /* bits per (macro) pixel */
/* create dumb buffer */
struct drm_mode_create_dumb creq = drm_mode_create_dumb();
- creq.width = width() / pi.xsub;
+ creq.width = width();
creq.height = height() / pi.ysub;
- creq.bpp = pi.bitspp;
+ creq.bpp = pi.bitspp / pi.xsub;
r = drmIoctl(card().fd(), DRM_IOCTL_MODE_CREATE_DUMB, &creq);
if (r)
throw invalid_argument(string("DRM_IOCTL_MODE_CREATE_DUMB failed") + strerror(errno));
FramebufferPlane& plane = m_planes[i];
/* unmap buffer */
- munmap(plane.map, plane.size);
+ if (plane.map)
+ munmap(plane.map, plane.size);
/* delete dumb buffer */
struct drm_mode_destroy_dumb dreq = drm_mode_destroy_dumb();
return p.map;
}
+int DumbFramebuffer::prime_fd(unsigned int plane)
+{
+ if (m_planes[plane].prime_fd >= 0)
+ return m_planes[plane].prime_fd;
+
+ int r = drmPrimeHandleToFD(card().fd(), m_planes[plane].handle,
+ DRM_CLOEXEC, &m_planes[plane].prime_fd);
+ if (r)
+ throw std::runtime_error("drmPrimeHandleToFD failed\n");
+
+ return m_planes[plane].prime_fd;
+}
+
}