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" |
(...skipping 15 matching lines...) Expand all Loading... |
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 TEST_F(BufferTest, ReleaseCallback) { | 30 TEST_F(BufferTest, ReleaseCallback) { |
31 gfx::Size buffer_size(256, 256); | 31 gfx::Size buffer_size(256, 256); |
32 std::unique_ptr<Buffer> buffer( | 32 std::unique_ptr<Buffer> buffer( |
33 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); | 33 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); |
34 std::unique_ptr<Surface> surface(new Surface); | 34 std::unique_ptr<Surface> surface(new Surface); |
35 const cc::FrameSinkId arbitrary_frame_sink_id(1, 1); | 35 const cc::FrameSinkId arbitrary_frame_sink_id(1, 1); |
36 scoped_refptr<CompositorFrameSinkHolder> compositor_frame_sink_holder = | 36 CompositorFrameSinkHolder* compositor_frame_sink_holder = |
37 new CompositorFrameSinkHolder(surface.get(), arbitrary_frame_sink_id, | 37 surface->compositor_frame_sink_holder(); |
38 aura::Env::GetInstance() | |
39 ->context_factory_private() | |
40 ->GetSurfaceManager()); | |
41 | 38 |
42 // Set the release callback. | 39 // Set the release callback. |
43 int release_call_count = 0; | 40 int release_call_count = 0; |
44 buffer->set_release_callback( | 41 buffer->set_release_callback( |
45 base::Bind(&Release, base::Unretained(&release_call_count))); | 42 base::Bind(&Release, base::Unretained(&release_call_count))); |
46 | 43 |
47 buffer->OnAttach(); | 44 buffer->OnAttach(); |
48 cc::TransferableResource resource; | 45 cc::TransferableResource resource; |
49 // Produce a transferable resource for the contents of the buffer. | 46 // Produce a transferable resource for the contents of the buffer. |
50 bool rv = buffer->ProduceTransferableResource( | 47 bool rv = buffer->ProduceTransferableResource(compositor_frame_sink_holder, 0, |
51 compositor_frame_sink_holder.get(), 0, false, true, &resource); | 48 false, true, &resource); |
52 ASSERT_TRUE(rv); | 49 ASSERT_TRUE(rv); |
53 | 50 |
54 // Release buffer. | 51 // Release buffer. |
55 cc::ReturnedResource returned_resource; | 52 cc::ReturnedResource returned_resource; |
56 returned_resource.id = resource.id; | 53 returned_resource.id = resource.id; |
57 returned_resource.sync_token = resource.mailbox_holder.sync_token; | 54 returned_resource.sync_token = resource.mailbox_holder.sync_token; |
58 returned_resource.lost = false; | 55 returned_resource.lost = false; |
59 cc::ReturnedResourceArray resources = {returned_resource}; | 56 cc::ReturnedResourceArray resources = {returned_resource}; |
60 compositor_frame_sink_holder->ReclaimResources(resources); | 57 compositor_frame_sink_holder->ReclaimResources(resources); |
61 | 58 |
62 RunAllPendingInMessageLoop(); | 59 RunAllPendingInMessageLoop(); |
63 ASSERT_EQ(release_call_count, 0); | 60 ASSERT_EQ(release_call_count, 0); |
64 | 61 |
65 buffer->OnDetach(); | 62 buffer->OnDetach(); |
66 | 63 |
67 // Release() should have been called exactly once. | 64 // Release() should have been called exactly once. |
68 ASSERT_EQ(release_call_count, 1); | 65 ASSERT_EQ(release_call_count, 1); |
69 } | 66 } |
70 | 67 |
71 TEST_F(BufferTest, IsLost) { | 68 TEST_F(BufferTest, IsLost) { |
72 gfx::Size buffer_size(256, 256); | 69 gfx::Size buffer_size(256, 256); |
73 std::unique_ptr<Buffer> buffer( | 70 std::unique_ptr<Buffer> buffer( |
74 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); | 71 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); |
75 const cc::FrameSinkId arbitrary_frame_sink_id(1, 1); | 72 const cc::FrameSinkId arbitrary_frame_sink_id(1, 1); |
76 std::unique_ptr<Surface> surface(new Surface); | 73 std::unique_ptr<Surface> surface(new Surface); |
77 scoped_refptr<CompositorFrameSinkHolder> compositor_frame_sink_holder = | 74 CompositorFrameSinkHolder* compositor_frame_sink_holder = |
78 new CompositorFrameSinkHolder(surface.get(), arbitrary_frame_sink_id, | 75 surface->compositor_frame_sink_holder(); |
79 aura::Env::GetInstance() | |
80 ->context_factory_private() | |
81 ->GetSurfaceManager()); | |
82 cc::ResourceId resource_id = 0; | 76 cc::ResourceId resource_id = 0; |
83 | 77 |
84 buffer->OnAttach(); | 78 buffer->OnAttach(); |
85 // Acquire a texture transferable resource for the contents of the buffer. | 79 // Acquire a texture transferable resource for the contents of the buffer. |
86 cc::TransferableResource resource; | 80 cc::TransferableResource resource; |
87 bool rv = buffer->ProduceTransferableResource( | 81 bool rv = buffer->ProduceTransferableResource( |
88 compositor_frame_sink_holder.get(), resource_id, false, true, &resource); | 82 compositor_frame_sink_holder, resource_id, false, true, &resource); |
89 ASSERT_TRUE(rv); | 83 ASSERT_TRUE(rv); |
90 | 84 |
91 scoped_refptr<cc::ContextProvider> context_provider = | 85 scoped_refptr<cc::ContextProvider> context_provider = |
92 aura::Env::GetInstance() | 86 aura::Env::GetInstance() |
93 ->context_factory() | 87 ->context_factory() |
94 ->SharedMainThreadContextProvider(); | 88 ->SharedMainThreadContextProvider(); |
95 if (context_provider) { | 89 if (context_provider) { |
96 gpu::gles2::GLES2Interface* gles2 = context_provider->ContextGL(); | 90 gpu::gles2::GLES2Interface* gles2 = context_provider->ContextGL(); |
97 gles2->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, | 91 gles2->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, |
98 GL_INNOCENT_CONTEXT_RESET_ARB); | 92 GL_INNOCENT_CONTEXT_RESET_ARB); |
99 } | 93 } |
100 | 94 |
101 // Release buffer. | 95 // Release buffer. |
102 bool is_lost = true; | 96 bool is_lost = true; |
103 cc::ReturnedResource returned_resource; | 97 cc::ReturnedResource returned_resource; |
104 returned_resource.id = resource_id; | 98 returned_resource.id = resource_id; |
105 returned_resource.sync_token = gpu::SyncToken(); | 99 returned_resource.sync_token = gpu::SyncToken(); |
106 returned_resource.lost = is_lost; | 100 returned_resource.lost = is_lost; |
107 cc::ReturnedResourceArray resources = {returned_resource}; | 101 cc::ReturnedResourceArray resources = {returned_resource}; |
108 compositor_frame_sink_holder->ReclaimResources(resources); | 102 compositor_frame_sink_holder->ReclaimResources(resources); |
109 RunAllPendingInMessageLoop(); | 103 RunAllPendingInMessageLoop(); |
110 | 104 |
111 // Producing a new texture transferable resource for the contents of the | 105 // Producing a new texture transferable resource for the contents of the |
112 // buffer. | 106 // buffer. |
113 ++resource_id; | 107 ++resource_id; |
114 cc::TransferableResource new_resource; | 108 cc::TransferableResource new_resource; |
115 rv = buffer->ProduceTransferableResource(compositor_frame_sink_holder.get(), | 109 rv = buffer->ProduceTransferableResource( |
116 resource_id, false, false, | 110 compositor_frame_sink_holder, resource_id, false, false, &new_resource); |
117 &new_resource); | |
118 ASSERT_TRUE(rv); | 111 ASSERT_TRUE(rv); |
119 buffer->OnDetach(); | 112 buffer->OnDetach(); |
120 | 113 |
121 cc::ReturnedResource returned_resource2; | 114 cc::ReturnedResource returned_resource2; |
122 returned_resource2.id = resource_id; | 115 returned_resource2.id = resource_id; |
123 returned_resource2.sync_token = gpu::SyncToken(); | 116 returned_resource2.sync_token = gpu::SyncToken(); |
124 returned_resource2.lost = false; | 117 returned_resource2.lost = false; |
125 cc::ReturnedResourceArray resources2 = {returned_resource2}; | 118 cc::ReturnedResourceArray resources2 = {returned_resource2}; |
126 compositor_frame_sink_holder->ReclaimResources(resources2); | 119 compositor_frame_sink_holder->ReclaimResources(resources2); |
127 RunAllPendingInMessageLoop(); | 120 RunAllPendingInMessageLoop(); |
128 } | 121 } |
129 | 122 |
130 } // namespace | 123 } // namespace |
131 } // namespace exo | 124 } // namespace exo |
OLD | NEW |