gl_image_dxgi_unittest.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 <stddef.h>
  5. #include <stdint.h>
  6. #include <wrl.h>
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. #include "ui/gfx/buffer_format_util.h"
  9. #include "ui/gl/gl_angle_util_win.h"
  10. #include "ui/gl/gl_image_dxgi.h"
  11. #include "ui/gl/test/gl_image_bind_test_template.h"
  12. #include "ui/gl/test/gl_image_test_template.h"
  13. #include "ui/gl/test/gl_image_zero_initialize_test_template.h"
  14. namespace gl {
  15. namespace {
  16. const uint8_t kRGBImageColor[] = {0x30, 0x40, 0x10, 0xFF};
  17. template <gfx::BufferFormat format>
  18. class GLImageDXGITestDelegate : public GLImageTestDelegateBase {
  19. public:
  20. scoped_refptr<GLImage> CreateSolidColorImage(const gfx::Size& size,
  21. const uint8_t color[4]) const {
  22. D3D11_TEXTURE2D_DESC desc;
  23. desc.Width = size.width();
  24. desc.Height = size.height();
  25. desc.MipLevels = 1;
  26. desc.ArraySize = 1;
  27. desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  28. desc.SampleDesc.Count = 1;
  29. desc.SampleDesc.Quality = 0;
  30. desc.Usage = D3D11_USAGE_DEFAULT;
  31. desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
  32. desc.CPUAccessFlags = 0;
  33. desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_NTHANDLE |
  34. D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX;
  35. std::vector<unsigned char> originalData(size.width() * size.height() * 4);
  36. for (int x = 0; x < size.width(); ++x) {
  37. for (int y = 0; y < size.height(); ++y) {
  38. for (int i = 0; i < 4; ++i) {
  39. originalData[(x + y * size.width()) * 4 + i] = color[i];
  40. }
  41. }
  42. }
  43. D3D11_SUBRESOURCE_DATA initial_data = {};
  44. initial_data.pSysMem = originalData.data();
  45. initial_data.SysMemPitch = size.width() * 4;
  46. Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device =
  47. QueryD3D11DeviceObjectFromANGLE();
  48. Microsoft::WRL::ComPtr<ID3D11Texture2D> texture;
  49. HRESULT hr = d3d11_device->CreateTexture2D(&desc, &initial_data, &texture);
  50. EXPECT_HRESULT_SUCCEEDED(hr);
  51. Microsoft::WRL::ComPtr<IDXGIResource1> dxgi_resource;
  52. hr = texture.As(&dxgi_resource);
  53. EXPECT_HRESULT_SUCCEEDED(hr);
  54. HANDLE handle = nullptr;
  55. hr = dxgi_resource->CreateSharedHandle(
  56. nullptr, DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE,
  57. nullptr, &handle);
  58. EXPECT_HRESULT_SUCCEEDED(hr);
  59. scoped_refptr<GLImageDXGI> image(new GLImageDXGI(size, nullptr));
  60. bool rv =
  61. image->InitializeHandle(base::win::ScopedHandle(handle), 0, format);
  62. EXPECT_TRUE(rv);
  63. return image;
  64. }
  65. scoped_refptr<GLImage> CreateImage(const gfx::Size& size) const {
  66. const uint8_t color[4] = {0, 0, 0, 0};
  67. return CreateSolidColorImage(size, color);
  68. }
  69. unsigned GetTextureTarget() const { return GL_TEXTURE_2D; }
  70. const uint8_t* GetImageColor() { return kRGBImageColor; }
  71. int GetAdmissibleError() const { return 0; }
  72. };
  73. using GLImageTestTypes =
  74. testing::Types<GLImageDXGITestDelegate<gfx::BufferFormat::RGBA_8888>,
  75. GLImageDXGITestDelegate<gfx::BufferFormat::RGBX_8888>>;
  76. // Disabled by default as it requires DX11.
  77. INSTANTIATE_TYPED_TEST_SUITE_P(DISABLED_GLImageDXGIHandle,
  78. GLImageTest,
  79. GLImageTestTypes);
  80. using GLImageRGBTestTypes =
  81. testing::Types<GLImageDXGITestDelegate<gfx::BufferFormat::RGBA_8888>,
  82. GLImageDXGITestDelegate<gfx::BufferFormat::RGBX_8888>>;
  83. // Disabled by default as it requires DX11.
  84. INSTANTIATE_TYPED_TEST_SUITE_P(DISABLED_GLImageDXGIHandle,
  85. GLImageZeroInitializeTest,
  86. GLImageRGBTestTypes);
  87. // Disabled by default as it requires DX11.
  88. INSTANTIATE_TYPED_TEST_SUITE_P(
  89. DISABLED_GLImageDXGIHandle,
  90. GLImageBindTest,
  91. GLImageDXGITestDelegate<gfx::BufferFormat::RGBA_8888>);
  92. } // namespace
  93. } // namespace gl