| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/exo/wayland/clients/client_base.h" | 5 #include "components/exo/wayland/clients/client_base.h" |
| 6 | 6 |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <linux-dmabuf-unstable-v1-client-protocol.h> | 8 #include <linux-dmabuf-unstable-v1-client-protocol.h> |
| 9 #include <presentation-time-client-protocol.h> | 9 #include <presentation-time-client-protocol.h> |
| 10 #include <wayland-client-core.h> | 10 #include <wayland-client-core.h> |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 void RegistryRemover(void* data, wl_registry* registry, uint32_t id) { | 105 void RegistryRemover(void* data, wl_registry* registry, uint32_t id) { |
| 106 LOG(WARNING) << "Got a registry losing event for " << id; | 106 LOG(WARNING) << "Got a registry losing event for " << id; |
| 107 } | 107 } |
| 108 | 108 |
| 109 void BufferRelease(void* data, wl_buffer* /* buffer */) { | 109 void BufferRelease(void* data, wl_buffer* /* buffer */) { |
| 110 ClientBase::Buffer* buffer = static_cast<ClientBase::Buffer*>(data); | 110 ClientBase::Buffer* buffer = static_cast<ClientBase::Buffer*>(data); |
| 111 buffer->busy = false; | 111 buffer->busy = false; |
| 112 } | 112 } |
| 113 | 113 |
| 114 #if defined(OZONE_PLATFORM_GBM) | 114 #if defined(OZONE_PLATFORM_GBM) |
| 115 void LinuxBufferParamsCreated(void* data, | |
| 116 zwp_linux_buffer_params_v1* params, | |
| 117 wl_buffer* new_buffer) { | |
| 118 ClientBase::Buffer* buffer = static_cast<ClientBase::Buffer*>(data); | |
| 119 buffer->buffer.reset(new_buffer); | |
| 120 } | |
| 121 | |
| 122 void LinuxBufferParamsFailed(void* data, zwp_linux_buffer_params_v1* params) { | |
| 123 LOG(ERROR) << "Linux buffer params failed"; | |
| 124 } | |
| 125 | |
| 126 const GrGLInterface* GrGLCreateNativeInterface() { | 115 const GrGLInterface* GrGLCreateNativeInterface() { |
| 127 return GrGLAssembleInterface(nullptr, [](void* ctx, const char name[]) { | 116 return GrGLAssembleInterface(nullptr, [](void* ctx, const char name[]) { |
| 128 return eglGetProcAddress(name); | 117 return eglGetProcAddress(name); |
| 129 }); | 118 }); |
| 130 } | 119 } |
| 131 | |
| 132 zwp_linux_buffer_params_v1_listener g_params_listener = { | |
| 133 LinuxBufferParamsCreated, LinuxBufferParamsFailed}; | |
| 134 #endif | 120 #endif |
| 135 | 121 |
| 136 wl_registry_listener g_registry_listener = {RegistryHandler, RegistryRemover}; | 122 wl_registry_listener g_registry_listener = {RegistryHandler, RegistryRemover}; |
| 137 | 123 |
| 138 wl_buffer_listener g_buffer_listener = {BufferRelease}; | 124 wl_buffer_listener g_buffer_listener = {BufferRelease}; |
| 139 | 125 |
| 140 } // namespace | 126 } // namespace |
| 141 | 127 |
| 142 //////////////////////////////////////////////////////////////////////////////// | 128 //////////////////////////////////////////////////////////////////////////////// |
| 143 // ClientBase::InitParams, public: | 129 // ClientBase::InitParams, public: |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 #endif | 292 #endif |
| 307 for (size_t i = 0; i < params.num_buffers; ++i) { | 293 for (size_t i = 0; i < params.num_buffers; ++i) { |
| 308 auto buffer = CreateBuffer(params.drm_format); | 294 auto buffer = CreateBuffer(params.drm_format); |
| 309 if (!buffer) { | 295 if (!buffer) { |
| 310 LOG(ERROR) << "Failed to create buffer"; | 296 LOG(ERROR) << "Failed to create buffer"; |
| 311 return false; | 297 return false; |
| 312 } | 298 } |
| 313 buffers_.push_back(std::move(buffer)); | 299 buffers_.push_back(std::move(buffer)); |
| 314 } | 300 } |
| 315 | 301 |
| 316 wl_display_roundtrip(display_.get()); | |
| 317 for (size_t i = 0; i < buffers_.size(); ++i) { | 302 for (size_t i = 0; i < buffers_.size(); ++i) { |
| 303 // If the buffer handle doesn't exist, we would either be killed by the |
| 304 // server or die here. |
| 318 if (!buffers_[i]->buffer) { | 305 if (!buffers_[i]->buffer) { |
| 319 LOG(ERROR) << "LinuxBufferParamsCreated was not called on the buffer."; | 306 LOG(ERROR) << "buffer handle uninitialized."; |
| 320 return false; | 307 return false; |
| 321 } | 308 } |
| 322 | 309 |
| 323 wl_buffer_add_listener(buffers_[i]->buffer.get(), &g_buffer_listener, | 310 wl_buffer_add_listener(buffers_[i]->buffer.get(), &g_buffer_listener, |
| 324 buffers_[i].get()); | 311 buffers_[i].get()); |
| 325 } | 312 } |
| 326 | 313 |
| 327 surface_.reset(static_cast<wl_surface*>( | 314 surface_.reset(static_cast<wl_surface*>( |
| 328 wl_compositor_create_surface(globals_.compositor.get()))); | 315 wl_compositor_create_surface(globals_.compositor.get()))); |
| 329 if (!surface_) { | 316 if (!surface_) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 buffer->bo.reset(gbm_bo_create(device_.get(), width_, height_, drm_format, | 368 buffer->bo.reset(gbm_bo_create(device_.get(), width_, height_, drm_format, |
| 382 GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING)); | 369 GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING)); |
| 383 if (!buffer->bo) { | 370 if (!buffer->bo) { |
| 384 LOG(ERROR) << "Can't create gbm buffer"; | 371 LOG(ERROR) << "Can't create gbm buffer"; |
| 385 return nullptr; | 372 return nullptr; |
| 386 } | 373 } |
| 387 base::ScopedFD fd(gbm_bo_get_plane_fd(buffer->bo.get(), 0)); | 374 base::ScopedFD fd(gbm_bo_get_plane_fd(buffer->bo.get(), 0)); |
| 388 | 375 |
| 389 buffer->params.reset( | 376 buffer->params.reset( |
| 390 zwp_linux_dmabuf_v1_create_params(globals_.linux_dmabuf.get())); | 377 zwp_linux_dmabuf_v1_create_params(globals_.linux_dmabuf.get())); |
| 391 zwp_linux_buffer_params_v1_add_listener(buffer->params.get(), | |
| 392 &g_params_listener, buffer.get()); | |
| 393 for (size_t i = 0; i < gbm_bo_get_num_planes(buffer->bo.get()); ++i) { | 378 for (size_t i = 0; i < gbm_bo_get_num_planes(buffer->bo.get()); ++i) { |
| 394 base::ScopedFD fd(gbm_bo_get_plane_fd(buffer->bo.get(), i)); | 379 base::ScopedFD fd(gbm_bo_get_plane_fd(buffer->bo.get(), i)); |
| 395 uint32_t stride = gbm_bo_get_plane_stride(buffer->bo.get(), i); | 380 uint32_t stride = gbm_bo_get_plane_stride(buffer->bo.get(), i); |
| 396 uint32_t offset = gbm_bo_get_plane_offset(buffer->bo.get(), i); | 381 uint32_t offset = gbm_bo_get_plane_offset(buffer->bo.get(), i); |
| 397 zwp_linux_buffer_params_v1_add(buffer->params.get(), fd.get(), i, offset, | 382 zwp_linux_buffer_params_v1_add(buffer->params.get(), fd.get(), i, offset, |
| 398 stride, 0, 0); | 383 stride, 0, 0); |
| 399 } | 384 } |
| 400 zwp_linux_buffer_params_v1_create(buffer->params.get(), width_, height_, | 385 buffer->buffer.reset(zwp_linux_buffer_params_v1_create_immed( |
| 401 drm_format, 0); | 386 buffer->params.get(), width_, height_, drm_format, 0)); |
| 402 | 387 |
| 403 if (gbm_bo_get_num_planes(buffer->bo.get()) != 1) | 388 if (gbm_bo_get_num_planes(buffer->bo.get()) != 1) |
| 404 return buffer; | 389 return buffer; |
| 405 | 390 |
| 406 EGLint khr_image_attrs[] = {EGL_DMA_BUF_PLANE0_FD_EXT, | 391 EGLint khr_image_attrs[] = {EGL_DMA_BUF_PLANE0_FD_EXT, |
| 407 fd.get(), | 392 fd.get(), |
| 408 EGL_WIDTH, | 393 EGL_WIDTH, |
| 409 width_, | 394 width_, |
| 410 EGL_HEIGHT, | 395 EGL_HEIGHT, |
| 411 height_, | 396 height_, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 buffer->sk_surface = SkSurface::MakeRasterDirect( | 449 buffer->sk_surface = SkSurface::MakeRasterDirect( |
| 465 SkImageInfo::Make(width_, height_, kColorType, kOpaque_SkAlphaType), | 450 SkImageInfo::Make(width_, height_, kColorType, kOpaque_SkAlphaType), |
| 466 static_cast<uint8_t*>(buffer->shared_memory->memory()), stride); | 451 static_cast<uint8_t*>(buffer->shared_memory->memory()), stride); |
| 467 DCHECK(buffer->sk_surface); | 452 DCHECK(buffer->sk_surface); |
| 468 return buffer; | 453 return buffer; |
| 469 } | 454 } |
| 470 | 455 |
| 471 } // namespace clients | 456 } // namespace clients |
| 472 } // namespace wayland | 457 } // namespace wayland |
| 473 } // namespace exo | 458 } // namespace exo |
| OLD | NEW |