OLD | NEW |
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 <GLES2/gl2extchromium.h> | 5 #include <GLES2/gl2extchromium.h> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "cc/output/context_provider.h" | 8 #include "cc/output/context_provider.h" |
9 #include "cc/resources/single_release_callback.h" | 9 #include "cc/resources/single_release_callback.h" |
10 #include "components/exo/buffer.h" | 10 #include "components/exo/buffer.h" |
11 #include "components/exo/surface.h" | 11 #include "components/exo/surface.h" |
12 #include "components/exo/test/exo_test_base.h" | 12 #include "components/exo/test/exo_test_base.h" |
13 #include "components/exo/test/exo_test_helper.h" | 13 #include "components/exo/test/exo_test_helper.h" |
14 #include "gpu/command_buffer/client/gles2_interface.h" | 14 #include "gpu/command_buffer/client/gles2_interface.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "third_party/khronos/GLES2/gl2.h" | 16 #include "third_party/khronos/GLES2/gl2.h" |
17 #include "ui/aura/env.h" | 17 #include "ui/aura/env.h" |
18 #include "ui/compositor/compositor.h" | 18 #include "ui/compositor/compositor.h" |
19 #include "ui/gfx/gpu_memory_buffer.h" | 19 #include "ui/gfx/gpu_memory_buffer.h" |
20 | 20 |
21 namespace exo { | 21 namespace exo { |
22 namespace { | 22 namespace { |
23 | 23 |
24 using BufferTest = test::ExoTestBase; | 24 using BufferTest = test::ExoTestBase; |
25 | 25 |
26 void Release(int* release_call_count) { | 26 void Release(int* release_call_count) { |
27 (*release_call_count)++; | 27 (*release_call_count)++; |
28 } | 28 } |
29 | 29 |
| 30 class MockCompositorFrameSinkHolder : public CompositorFrameSinkHolder { |
| 31 public: |
| 32 MockCompositorFrameSinkHolder(Surface* surface) |
| 33 : CompositorFrameSinkHolder(surface, nullptr, nullptr) {} |
| 34 |
| 35 private: |
| 36 ~MockCompositorFrameSinkHolder() override { |
| 37 CompositorFrameSinkHolder::~CompositorFrameSinkHolder(); |
| 38 } |
| 39 }; |
| 40 |
30 TEST_F(BufferTest, ReleaseCallback) { | 41 TEST_F(BufferTest, ReleaseCallback) { |
31 gfx::Size buffer_size(256, 256); | 42 gfx::Size buffer_size(256, 256); |
32 std::unique_ptr<Buffer> buffer( | 43 std::unique_ptr<Buffer> buffer( |
33 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); | 44 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); |
| 45 std::unique_ptr<Surface> surface(new Surface()); |
| 46 scoped_refptr<MockCompositorFrameSinkHolder> compositor_frame_sink_holder = |
| 47 new MockCompositorFrameSinkHolder(surface.get()); |
34 | 48 |
35 // Set the release callback. | 49 // Set the release callback. |
36 int release_call_count = 0; | 50 int release_call_count = 0; |
37 buffer->set_release_callback( | 51 buffer->set_release_callback( |
38 base::Bind(&Release, base::Unretained(&release_call_count))); | 52 base::Bind(&Release, base::Unretained(&release_call_count))); |
| 53 printf("Release callback set.\n"); |
39 | 54 |
40 buffer->OnAttach(); | 55 buffer->OnAttach(); |
41 // Produce a texture mailbox for the contents of the buffer. | 56 cc::TransferableResource resource; |
42 cc::TextureMailbox texture_mailbox; | 57 // Produce a transferable resource for the contents of the buffer. |
43 std::unique_ptr<cc::SingleReleaseCallback> buffer_release_callback = | 58 bool r = buffer->ProduceTransferableResource( |
44 buffer->ProduceTextureMailbox(&texture_mailbox, false, true); | 59 compositor_frame_sink_holder.get(), 0, false, true, &resource); |
45 ASSERT_TRUE(buffer_release_callback); | 60 ASSERT_TRUE(r); |
| 61 printf("Transferable resource produced.\n"); |
46 | 62 |
47 // Release buffer. | 63 // Release buffer. |
48 buffer_release_callback->Run(gpu::SyncToken(), false); | 64 cc::ReturnedResource returned_resource; |
| 65 returned_resource.id = resource.id; |
| 66 returned_resource.sync_token = resource.mailbox_holder.sync_token; |
| 67 returned_resource.lost = false; |
| 68 cc::ReturnedResourceArray resources = {returned_resource}; |
| 69 printf("ReturnedResource initialized.\n"); |
| 70 compositor_frame_sink_holder->ReclaimResources(resources); |
| 71 printf("Resource reclaimed.\n"); |
49 | 72 |
50 ASSERT_EQ(release_call_count, 0); | 73 ASSERT_EQ(release_call_count, 0); |
51 | 74 |
52 buffer->OnDetach(); | 75 buffer->OnDetach(); |
| 76 printf("Buffer detached.\n"); |
53 | 77 |
54 // Release() should have been called exactly once. | 78 // Release() should have been called exactly once. |
55 ASSERT_EQ(release_call_count, 1); | 79 ASSERT_EQ(release_call_count, 1); |
56 } | 80 } |
57 | 81 |
58 TEST_F(BufferTest, IsLost) { | 82 TEST_F(BufferTest, IsLost) { |
59 gfx::Size buffer_size(256, 256); | 83 gfx::Size buffer_size(256, 256); |
60 std::unique_ptr<Buffer> buffer( | 84 std::unique_ptr<Buffer> buffer( |
61 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); | 85 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); |
| 86 std::unique_ptr<Surface> surface(new Surface()); |
| 87 scoped_refptr<MockCompositorFrameSinkHolder> compositor_frame_sink_holder = |
| 88 new MockCompositorFrameSinkHolder(surface.get()); |
62 | 89 |
63 buffer->OnAttach(); | 90 buffer->OnAttach(); |
64 // Acquire a texture mailbox for the contents of the buffer. | 91 // Acquire a texture transferable resource for the contents of the buffer. |
65 cc::TextureMailbox texture_mailbox; | 92 cc::TransferableResource resource; |
66 std::unique_ptr<cc::SingleReleaseCallback> buffer_release_callback = | 93 bool r = buffer->ProduceTransferableResource( |
67 buffer->ProduceTextureMailbox(&texture_mailbox, false, true); | 94 compositor_frame_sink_holder.get(), 0, false, true, &resource); |
68 ASSERT_TRUE(buffer_release_callback); | 95 ASSERT_TRUE(r); |
69 | 96 |
70 scoped_refptr<cc::ContextProvider> context_provider = | 97 scoped_refptr<cc::ContextProvider> context_provider = |
71 aura::Env::GetInstance() | 98 aura::Env::GetInstance() |
72 ->context_factory() | 99 ->context_factory() |
73 ->SharedMainThreadContextProvider(); | 100 ->SharedMainThreadContextProvider(); |
74 if (context_provider) { | 101 if (context_provider) { |
75 gpu::gles2::GLES2Interface* gles2 = context_provider->ContextGL(); | 102 gpu::gles2::GLES2Interface* gles2 = context_provider->ContextGL(); |
76 gles2->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, | 103 gles2->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, |
77 GL_INNOCENT_CONTEXT_RESET_ARB); | 104 GL_INNOCENT_CONTEXT_RESET_ARB); |
78 } | 105 } |
79 | 106 |
80 // Release buffer. | 107 // Release buffer. |
81 bool is_lost = true; | 108 bool is_lost = true; |
82 buffer_release_callback->Run(gpu::SyncToken(), is_lost); | 109 cc::ReturnedResource returned_resource; |
| 110 returned_resource.id = 0; |
| 111 returned_resource.sync_token = gpu::SyncToken(); |
| 112 returned_resource.lost = is_lost; |
| 113 cc::ReturnedResourceArray resources = {returned_resource}; |
| 114 compositor_frame_sink_holder->ReclaimResources(resources); |
83 | 115 |
84 // Producing a new texture mailbox for the contents of the buffer. | 116 // Producing a new texture transferable resource for the contents of the |
85 std::unique_ptr<cc::SingleReleaseCallback> buffer_release_callback2 = | 117 // buffer. |
86 buffer->ProduceTextureMailbox(&texture_mailbox, false, false); | 118 cc::TransferableResource new_resource; |
87 ASSERT_TRUE(buffer_release_callback2); | 119 bool r2 = buffer->ProduceTransferableResource( |
| 120 compositor_frame_sink_holder.get(), 1, false, false, &new_resource); |
| 121 ASSERT_TRUE(r2); |
88 buffer->OnDetach(); | 122 buffer->OnDetach(); |
89 | 123 |
90 buffer_release_callback2->Run(gpu::SyncToken(), false); | 124 cc::ReturnedResource returned_resource2; |
| 125 returned_resource.id = 1; |
| 126 returned_resource.sync_token = gpu::SyncToken(); |
| 127 returned_resource.lost = false; |
| 128 cc::ReturnedResourceArray resources2 = {returned_resource2}; |
| 129 compositor_frame_sink_holder->ReclaimResources(resources2); |
91 } | 130 } |
92 | 131 |
93 } // namespace | 132 } // namespace |
94 } // namespace exo | 133 } // namespace exo |
OLD | NEW |