gl_image_d3d.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Copyright 2019 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_d3d.h"
  5. #include "ui/gl/egl_util.h"
  6. #include "ui/gl/gl_bindings.h"
  7. #include "ui/gl/gl_surface_egl.h"
  8. #ifndef EGL_ANGLE_image_d3d11_texture
  9. #define EGL_D3D11_TEXTURE_ANGLE 0x3484
  10. #define EGL_TEXTURE_INTERNAL_FORMAT_ANGLE 0x345D
  11. #define EGL_D3D11_TEXTURE_PLANE_ANGLE 0x3492
  12. #define EGL_D3D11_TEXTURE_ARRAY_SLICE_ANGLE 0x3493
  13. #endif /* EGL_ANGLE_image_d3d11_texture */
  14. namespace gl {
  15. GLImageD3D::GLImageD3D(const gfx::Size& size,
  16. unsigned internal_format,
  17. unsigned data_type,
  18. const gfx::ColorSpace& color_space,
  19. Microsoft::WRL::ComPtr<ID3D11Texture2D> texture,
  20. size_t array_slice,
  21. size_t plane_index,
  22. Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain)
  23. : GLImage(),
  24. size_(size),
  25. internal_format_(internal_format),
  26. data_type_(data_type),
  27. texture_(std::move(texture)),
  28. array_slice_(array_slice),
  29. plane_index_(plane_index),
  30. swap_chain_(std::move(swap_chain)) {
  31. GLImage::SetColorSpace(color_space);
  32. DCHECK(texture_);
  33. }
  34. GLImageD3D::~GLImageD3D() {
  35. if (egl_image_ != EGL_NO_IMAGE_KHR) {
  36. if (eglDestroyImageKHR(GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
  37. egl_image_) == EGL_FALSE) {
  38. DLOG(ERROR) << "Error destroying EGLImage: "
  39. << ui::GetLastEGLErrorString();
  40. }
  41. }
  42. }
  43. bool GLImageD3D::Initialize() {
  44. DCHECK_EQ(egl_image_, EGL_NO_IMAGE_KHR);
  45. const EGLint attribs[] = {EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
  46. static_cast<EGLint>(internal_format_),
  47. EGL_D3D11_TEXTURE_ARRAY_SLICE_ANGLE,
  48. static_cast<EGLint>(array_slice_),
  49. EGL_D3D11_TEXTURE_PLANE_ANGLE,
  50. static_cast<EGLint>(plane_index_),
  51. EGL_NONE};
  52. egl_image_ =
  53. eglCreateImageKHR(GLSurfaceEGL::GetGLDisplayEGL()->GetDisplay(),
  54. EGL_NO_CONTEXT, EGL_D3D11_TEXTURE_ANGLE,
  55. static_cast<EGLClientBuffer>(texture_.Get()), attribs);
  56. if (egl_image_ == EGL_NO_IMAGE_KHR) {
  57. LOG(ERROR) << "Error creating EGLImage: " << ui::GetLastEGLErrorString();
  58. return false;
  59. }
  60. return true;
  61. }
  62. // static
  63. GLImageD3D* GLImageD3D::FromGLImage(GLImage* image) {
  64. if (!image || image->GetType() != Type::D3D)
  65. return nullptr;
  66. return static_cast<GLImageD3D*>(image);
  67. }
  68. GLImage::Type GLImageD3D::GetType() const {
  69. return Type::D3D;
  70. }
  71. GLImage::BindOrCopy GLImageD3D::ShouldBindOrCopy() {
  72. return GLImage::BIND;
  73. }
  74. void* GLImageD3D::GetEGLImage() const {
  75. return egl_image_;
  76. }
  77. gfx::Size GLImageD3D::GetSize() {
  78. return size_;
  79. }
  80. unsigned GLImageD3D::GetInternalFormat() {
  81. return internal_format_;
  82. }
  83. unsigned GLImageD3D::GetDataType() {
  84. return data_type_;
  85. }
  86. bool GLImageD3D::BindTexImage(unsigned target) {
  87. DCHECK_NE(egl_image_, EGL_NO_IMAGE_KHR);
  88. glEGLImageTargetTexture2DOES(target, egl_image_);
  89. return glGetError() == static_cast<GLenum>(GL_NO_ERROR);
  90. }
  91. bool GLImageD3D::CopyTexImage(unsigned target) {
  92. return false;
  93. }
  94. bool GLImageD3D::CopyTexSubImage(unsigned target,
  95. const gfx::Point& offset,
  96. const gfx::Rect& rect) {
  97. return false;
  98. }
  99. void GLImageD3D::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd,
  100. uint64_t process_tracing_id,
  101. const std::string& dump_name) {
  102. NOTIMPLEMENTED_LOG_ONCE();
  103. }
  104. } // namespace gl