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

Side by Side Diff: components/exo/wayland/server.cc

Issue 1427743004: exo: Add support for wl_drm version 2 to wayland bindings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@wayland-drm-third-party
Patch Set: fix unit test and nit Created 5 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « components/exo/wayland/BUILD.gn ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/server.h" 5 #include "components/exo/wayland/server.h"
6 6
7 #include <wayland-server-core.h> 7 #include <wayland-server-core.h>
8 #include <wayland-server-protocol-core.h> 8 #include <wayland-server-protocol-core.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/cancelable_callback.h" 13 #include "base/cancelable_callback.h"
14 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
15 #include "components/exo/buffer.h" 15 #include "components/exo/buffer.h"
16 #include "components/exo/display.h" 16 #include "components/exo/display.h"
17 #include "components/exo/shared_memory.h" 17 #include "components/exo/shared_memory.h"
18 #include "components/exo/shell_surface.h" 18 #include "components/exo/shell_surface.h"
19 #include "components/exo/sub_surface.h" 19 #include "components/exo/sub_surface.h"
20 #include "components/exo/surface.h" 20 #include "components/exo/surface.h"
21 #include "third_party/skia/include/core/SkRegion.h" 21 #include "third_party/skia/include/core/SkRegion.h"
22 22
23 #if defined(USE_OZONE)
24 #include <wayland-drm-server-protocol.h>
25 #endif
26
23 namespace exo { 27 namespace exo {
24 namespace wayland { 28 namespace wayland {
25 namespace { 29 namespace {
26 30
27 template <class T> 31 template <class T>
28 T* GetUserDataAs(wl_resource* resource) { 32 T* GetUserDataAs(wl_resource* resource) {
29 return static_cast<T*>(wl_resource_get_user_data(resource)); 33 return static_cast<T*>(wl_resource_get_user_data(resource));
30 } 34 }
31 35
32 template <class T> 36 template <class T>
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 {WL_SHM_FORMAT_ARGB8888, gfx::BufferFormat::BGRA_8888}}; 267 {WL_SHM_FORMAT_ARGB8888, gfx::BufferFormat::BGRA_8888}};
264 268
265 void shm_pool_create_buffer(wl_client* client, 269 void shm_pool_create_buffer(wl_client* client,
266 wl_resource* resource, 270 wl_resource* resource,
267 uint32_t id, 271 uint32_t id,
268 int32_t offset, 272 int32_t offset,
269 int32_t width, 273 int32_t width,
270 int32_t height, 274 int32_t height,
271 int32_t stride, 275 int32_t stride,
272 uint32_t format) { 276 uint32_t format) {
273 const auto supported_format = 277 const auto* supported_format =
274 std::find_if(shm_supported_formats, 278 std::find_if(shm_supported_formats,
275 shm_supported_formats + arraysize(shm_supported_formats), 279 shm_supported_formats + arraysize(shm_supported_formats),
276 [format](const shm_supported_format& supported_format) { 280 [format](const shm_supported_format& supported_format) {
277 return supported_format.shm_format == format; 281 return supported_format.shm_format == format;
278 }); 282 });
279 if (supported_format == 283 if (supported_format ==
280 (shm_supported_formats + arraysize(shm_supported_formats))) { 284 (shm_supported_formats + arraysize(shm_supported_formats))) {
281 wl_resource_post_error(resource, WL_SHM_ERROR_INVALID_FORMAT, 285 wl_resource_post_error(resource, WL_SHM_ERROR_INVALID_FORMAT,
282 "invalid format 0x%x", format); 286 "invalid format 0x%x", format);
283 return; 287 return;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 return; 362 return;
359 } 363 }
360 364
361 wl_resource_set_implementation(resource, &shm_implementation, data, nullptr); 365 wl_resource_set_implementation(resource, &shm_implementation, data, nullptr);
362 366
363 for (const auto& supported_format : shm_supported_formats) 367 for (const auto& supported_format : shm_supported_formats)
364 wl_shm_send_format(resource, supported_format.shm_format); 368 wl_shm_send_format(resource, supported_format.shm_format);
365 } 369 }
366 370
367 //////////////////////////////////////////////////////////////////////////////// 371 ////////////////////////////////////////////////////////////////////////////////
372 // wl_drm_interface:
373
374 #if defined(USE_OZONE)
375 const struct drm_supported_format {
376 uint32_t drm_format;
377 gfx::BufferFormat buffer_format;
378 } drm_supported_formats[] = {
379 {WL_DRM_FORMAT_XBGR8888, gfx::BufferFormat::RGBX_8888},
380 {WL_DRM_FORMAT_ABGR8888, gfx::BufferFormat::RGBA_8888},
381 {WL_DRM_FORMAT_XRGB8888, gfx::BufferFormat::BGRX_8888},
382 {WL_DRM_FORMAT_ARGB8888, gfx::BufferFormat::BGRA_8888}};
383
384 void drm_authenticate(wl_client* client, wl_resource* resource, uint32_t id) {
385 wl_drm_send_authenticated(resource);
386 }
387
388 void drm_create_buffer(wl_client* client,
389 wl_resource* resource,
390 uint32_t id,
391 uint32_t name,
392 int32_t width,
393 int32_t height,
394 uint32_t stride,
395 uint32_t format) {
396 wl_resource_post_error(resource, WL_DRM_ERROR_INVALID_NAME,
397 "GEM names are not supported");
398 }
399
400 void drm_create_planar_buffer(wl_client* client,
401 wl_resource* resource,
402 uint32_t id,
403 uint32_t name,
404 int32_t width,
405 int32_t height,
406 uint32_t format,
407 int32_t offset0,
408 int32_t stride0,
409 int32_t offset1,
410 int32_t stride1,
411 int32_t offset2,
412 int32_t stride3) {
413 wl_resource_post_error(resource, WL_DRM_ERROR_INVALID_NAME,
414 "GEM names are not supported");
415 }
416
417 void drm_create_prime_buffer(wl_client* client,
418 wl_resource* resource,
419 uint32_t id,
420 int32_t name,
421 int32_t width,
422 int32_t height,
423 uint32_t format,
424 int32_t offset0,
425 int32_t stride0,
426 int32_t offset1,
427 int32_t stride1,
428 int32_t offset2,
429 int32_t stride2) {
430 const auto* supported_format =
431 std::find_if(drm_supported_formats,
432 drm_supported_formats + arraysize(drm_supported_formats),
433 [format](const drm_supported_format& supported_format) {
434 return supported_format.drm_format == format;
435 });
436 if (supported_format ==
437 (drm_supported_formats + arraysize(drm_supported_formats))) {
438 wl_resource_post_error(resource, WL_DRM_ERROR_INVALID_FORMAT,
439 "invalid format 0x%x", format);
440 return;
441 }
442
443 scoped_ptr<Buffer> buffer =
444 GetUserDataAs<Display>(resource)
445 ->CreatePrimeBuffer(base::ScopedFD(name), gfx::Size(width, height),
446 supported_format->buffer_format, stride0);
447 if (!buffer) {
448 wl_resource_post_no_memory(resource);
449 return;
450 }
451
452 wl_resource* buffer_resource =
453 wl_resource_create(client, &wl_buffer_interface, 1, id);
454 if (!buffer_resource) {
455 wl_resource_post_no_memory(resource);
456 return;
457 }
458
459 buffer->set_release_callback(
460 base::Bind(&wl_buffer_send_release, base::Unretained(buffer_resource)));
461
462 SetImplementation(buffer_resource, &buffer_implementation, buffer.Pass());
463 }
464
465 const struct wl_drm_interface drm_implementation = {
466 drm_authenticate, drm_create_buffer, drm_create_planar_buffer,
467 drm_create_prime_buffer};
468
469 const uint32_t drm_version = 2;
470
471 void bind_drm(wl_client* client, void* data, uint32_t version, uint32_t id) {
472 wl_resource* resource = wl_resource_create(
473 client, &wl_drm_interface, std::min(version, drm_version), id);
474 if (!resource) {
475 wl_client_post_no_memory(client);
476 return;
477 }
478 wl_resource_set_implementation(resource, &drm_implementation, data, nullptr);
479
480 if (version >= 2)
481 wl_drm_send_capabilities(resource, WL_DRM_CAPABILITY_PRIME);
482
483 for (const auto& supported_format : drm_supported_formats)
484 wl_drm_send_format(resource, supported_format.drm_format);
485 }
486 #endif
487
488 ////////////////////////////////////////////////////////////////////////////////
368 // wl_subsurface_interface: 489 // wl_subsurface_interface:
369 490
370 void subsurface_destroy(wl_client* client, wl_resource* resource) { 491 void subsurface_destroy(wl_client* client, wl_resource* resource) {
371 wl_resource_destroy(resource); 492 wl_resource_destroy(resource);
372 } 493 }
373 494
374 void subsurface_set_position(wl_client* client, 495 void subsurface_set_position(wl_client* client,
375 wl_resource* resource, 496 wl_resource* resource,
376 int32_t x, 497 int32_t x,
377 int32_t y) { 498 int32_t y) {
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 } // namespace 698 } // namespace
578 699
579 //////////////////////////////////////////////////////////////////////////////// 700 ////////////////////////////////////////////////////////////////////////////////
580 // Server, public: 701 // Server, public:
581 702
582 Server::Server(Display* display) 703 Server::Server(Display* display)
583 : display_(display), wl_display_(wl_display_create()) { 704 : display_(display), wl_display_(wl_display_create()) {
584 wl_global_create(wl_display_.get(), &wl_compositor_interface, 705 wl_global_create(wl_display_.get(), &wl_compositor_interface,
585 compositor_version, display_, bind_compositor); 706 compositor_version, display_, bind_compositor);
586 wl_global_create(wl_display_.get(), &wl_shm_interface, 1, display_, bind_shm); 707 wl_global_create(wl_display_.get(), &wl_shm_interface, 1, display_, bind_shm);
708 #if defined(USE_OZONE)
709 wl_global_create(wl_display_.get(), &wl_drm_interface, drm_version, display_,
710 bind_drm);
711 #endif
587 wl_global_create(wl_display_.get(), &wl_subcompositor_interface, 1, display_, 712 wl_global_create(wl_display_.get(), &wl_subcompositor_interface, 1, display_,
588 bind_subcompositor); 713 bind_subcompositor);
589 wl_global_create(wl_display_.get(), &wl_shell_interface, 1, display_, 714 wl_global_create(wl_display_.get(), &wl_shell_interface, 1, display_,
590 bind_shell); 715 bind_shell);
591 } 716 }
592 717
593 Server::~Server() {} 718 Server::~Server() {}
594 719
595 // static 720 // static
596 scoped_ptr<Server> Server::Create(Display* display) { 721 scoped_ptr<Server> Server::Create(Display* display) {
(...skipping 19 matching lines...) Expand all
616 DCHECK(event_loop); 741 DCHECK(event_loop);
617 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds()); 742 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds());
618 } 743 }
619 744
620 void Server::Flush() { 745 void Server::Flush() {
621 wl_display_flush_clients(wl_display_.get()); 746 wl_display_flush_clients(wl_display_.get());
622 } 747 }
623 748
624 } // namespace wayland 749 } // namespace wayland
625 } // namespace exo 750 } // namespace exo
OLDNEW
« no previous file with comments | « components/exo/wayland/BUILD.gn ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698