gl_image_ahardwarebuffer.cc 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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
  3. // found in the LICENSE file.
  4. #include "ui/gl/gl_image_ahardwarebuffer.h"
  5. #include "base/android/android_hardware_buffer_compat.h"
  6. #include "base/android/scoped_hardware_buffer_fence_sync.h"
  7. #include "ui/gl/gl_bindings.h"
  8. #include "ui/gl/gl_fence_android_native_fence_sync.h"
  9. #include "ui/gl/gl_utils.h"
  10. namespace gl {
  11. namespace {
  12. uint32_t GetBufferFormat(const AHardwareBuffer* buffer) {
  13. AHardwareBuffer_Desc desc = {};
  14. base::AndroidHardwareBufferCompat::GetInstance().Describe(buffer, &desc);
  15. return desc.format;
  16. }
  17. unsigned int GLInternalFormat(uint32_t buffer_format) {
  18. switch (buffer_format) {
  19. case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
  20. case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
  21. case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
  22. return GL_RGBA;
  23. case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
  24. case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
  25. case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
  26. return GL_RGB;
  27. default:
  28. // For all other buffer formats, use GL_RGBA as internal format.
  29. return GL_RGBA;
  30. }
  31. }
  32. unsigned int GLDataType(uint32_t buffer_format) {
  33. switch (buffer_format) {
  34. case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
  35. case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
  36. case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
  37. return GL_UNSIGNED_BYTE;
  38. case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
  39. return GL_HALF_FLOAT_OES;
  40. case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
  41. return GL_UNSIGNED_INT_2_10_10_10_REV;
  42. case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
  43. return GL_UNSIGNED_SHORT_5_6_5;
  44. default:
  45. // For all other buffer formats, use GL_UNSIGNED_BYTE as type.
  46. return GL_UNSIGNED_BYTE;
  47. }
  48. }
  49. } // namespace
  50. class GLImageAHardwareBuffer::ScopedHardwareBufferFenceSyncImpl
  51. : public base::android::ScopedHardwareBufferFenceSync {
  52. public:
  53. ScopedHardwareBufferFenceSyncImpl(
  54. scoped_refptr<GLImageAHardwareBuffer> image,
  55. base::android::ScopedHardwareBufferHandle handle)
  56. : ScopedHardwareBufferFenceSync(std::move(handle),
  57. base::ScopedFD(),
  58. base::ScopedFD(),
  59. false /* is_video */),
  60. image_(std::move(image)) {}
  61. ~ScopedHardwareBufferFenceSyncImpl() override = default;
  62. void SetReadFence(base::ScopedFD fence_fd, bool has_context) override {
  63. DCHECK(fence_fd.is_valid());
  64. if (!has_context)
  65. return;
  66. gfx::GpuFenceHandle handle;
  67. handle.owned_fd = std::move(fence_fd);
  68. gfx::GpuFence gpu_fence(std::move(handle));
  69. auto gl_fence = GLFence::CreateFromGpuFence(gpu_fence);
  70. gl_fence->ServerWait();
  71. }
  72. private:
  73. scoped_refptr<GLImageAHardwareBuffer> image_;
  74. };
  75. GLImageAHardwareBuffer::GLImageAHardwareBuffer(const gfx::Size& size)
  76. : GLImageEGL(size) {}
  77. GLImageAHardwareBuffer::~GLImageAHardwareBuffer() {}
  78. bool GLImageAHardwareBuffer::Initialize(AHardwareBuffer* buffer,
  79. bool preserved) {
  80. handle_ = base::android::ScopedHardwareBufferHandle::Create(buffer);
  81. uint32_t buffer_format = GetBufferFormat(buffer);
  82. internal_format_ = GLInternalFormat(buffer_format);
  83. data_type_ = GLDataType(buffer_format);
  84. EGLint attribs[] = {EGL_IMAGE_PRESERVED_KHR, preserved ? EGL_TRUE : EGL_FALSE,
  85. EGL_NONE};
  86. EGLClientBuffer client_buffer = eglGetNativeClientBufferANDROID(buffer);
  87. return GLImageEGL::Initialize(EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
  88. client_buffer, attribs);
  89. }
  90. unsigned GLImageAHardwareBuffer::GetInternalFormat() {
  91. return internal_format_;
  92. }
  93. unsigned GLImageAHardwareBuffer::GetDataType() {
  94. return data_type_;
  95. }
  96. bool GLImageAHardwareBuffer::BindTexImage(unsigned target) {
  97. return GLImageEGL::BindTexImage(target);
  98. }
  99. bool GLImageAHardwareBuffer::CopyTexImage(unsigned target) {
  100. return false;
  101. }
  102. bool GLImageAHardwareBuffer::CopyTexSubImage(unsigned target,
  103. const gfx::Point& offset,
  104. const gfx::Rect& rect) {
  105. return false;
  106. }
  107. void GLImageAHardwareBuffer::Flush() {}
  108. void GLImageAHardwareBuffer::OnMemoryDump(
  109. base::trace_event::ProcessMemoryDump* pmd,
  110. uint64_t process_tracing_id,
  111. const std::string& dump_name) {}
  112. std::unique_ptr<base::android::ScopedHardwareBufferFenceSync>
  113. GLImageAHardwareBuffer::GetAHardwareBuffer() {
  114. return std::make_unique<ScopedHardwareBufferFenceSyncImpl>(
  115. this, base::android::ScopedHardwareBufferHandle::Create(handle_.get()));
  116. }
  117. } // namespace gl