Chromium Code Reviews| Index: ui/ozone/platform/drm/gpu/gbm_buffer.cc |
| diff --git a/ui/ozone/platform/drm/gpu/gbm_buffer.cc b/ui/ozone/platform/drm/gpu/gbm_buffer.cc |
| index 045caadf2a77ec75378ea7d3e151027b2b85172a..5023d3004e834e1a08971b25aafff3c2567fdd26 100644 |
| --- a/ui/ozone/platform/drm/gpu/gbm_buffer.cc |
| +++ b/ui/ozone/platform/drm/gpu/gbm_buffer.cc |
| @@ -73,19 +73,25 @@ scoped_refptr<GbmBuffer> GbmBuffer::CreateBuffer( |
| return buffer; |
| } |
| -GbmPixmap::GbmPixmap(const scoped_refptr<GbmBuffer>& buffer, |
| - GbmSurfaceFactory* surface_manager) |
| - : buffer_(buffer), surface_manager_(surface_manager) {} |
| +GbmPixmap::GbmPixmap(GbmSurfaceFactory* surface_manager) |
| + : surface_manager_(surface_manager) {} |
| -bool GbmPixmap::Initialize() { |
| +void GbmPixmap::Initialize(int dma_buf, int dma_buf_pitch) { |
| + dma_buf_ = dma_buf; |
| + dma_buf_pitch_ = dma_buf_pitch; |
| +} |
| + |
| +bool GbmPixmap::InitializeFromBuffer(const scoped_refptr<GbmBuffer>& buffer) { |
| // We want to use the GBM API because it's going to call into libdrm |
| // which might do some optimizations on buffer allocation, |
| // especially when sharing buffers via DMABUF. |
| - dma_buf_ = gbm_bo_get_fd(buffer_->bo()); |
| - if (dma_buf_ < 0) { |
| + int dma_buf = gbm_bo_get_fd(buffer->bo()); |
| + if (dma_buf < 0) { |
| PLOG(ERROR) << "Failed to export buffer to dma_buf"; |
| return false; |
| } |
| + Initialize(dma_buf, gbm_bo_get_stride(buffer->bo())); |
| + buffer_ = buffer; |
| return true; |
| } |
| @@ -107,7 +113,7 @@ gfx::NativePixmapHandle GbmPixmap::ExportHandle() { |
| } |
| handle.fd = base::FileDescriptor(dmabuf_fd, true /* auto_close */); |
| - handle.stride = gbm_bo_get_stride(buffer_->bo()); |
| + handle.stride = dma_buf_pitch_; |
| return handle; |
| } |
| @@ -125,7 +131,7 @@ int GbmPixmap::GetDmaBufFd() { |
| } |
| int GbmPixmap::GetDmaBufPitch() { |
| - return gbm_bo_get_stride(buffer_->bo()); |
| + return dma_buf_pitch_; |
| } |
| bool GbmPixmap::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, |
| @@ -133,7 +139,6 @@ bool GbmPixmap::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, |
| gfx::OverlayTransform plane_transform, |
| const gfx::Rect& display_bounds, |
| const gfx::RectF& crop_rect) { |
| - DCHECK(buffer_->GetUsage() == gfx::BufferUsage::SCANOUT); |
| gfx::Size required_size; |
| if (plane_z_order && |
| ShouldApplyScaling(display_bounds, crop_rect, &required_size)) { |
| @@ -146,6 +151,12 @@ bool GbmPixmap::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, |
| } |
| } |
| + if (!buffer_) { |
|
piman
2015/10/08 23:24:36
I assume eventually we'll want to support this for
reveman
2015/10/09 12:47:02
I haven't looked at this much in detail but it see
|
| + PLOG(ERROR) << "ScheduleOverlayPlane requires a buffer."; |
| + return false; |
| + } |
| + |
| + DCHECK(buffer_->GetUsage() == gfx::BufferUsage::SCANOUT); |
| surface_manager_->GetSurface(widget)->QueueOverlayPlane(OverlayPlane( |
| buffer_, plane_z_order, plane_transform, display_bounds, crop_rect)); |
| return true; |
| @@ -159,6 +170,11 @@ bool GbmPixmap::ShouldApplyScaling(const gfx::Rect& display_bounds, |
| return false; |
| } |
| + if (!buffer_) { |
| + PLOG(ERROR) << "ShouldApplyScaling requires a buffer."; |
| + return false; |
| + } |
| + |
| gfx::Size pixmap_size = buffer_->GetSize(); |
| // If the required size is not integer-sized, round it to the next integer. |
| *required_size = gfx::ToCeiledSize( |