Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: components/exo/buffer_unittest.cc

Issue 2584953002: exo::CompositorFrameSinkHolder's release callbacks hold ref (Closed)
Patch Set: Addressed comments Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 13 matching lines...) Expand all
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 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);
35 scoped_refptr<CompositorFrameSinkHolder> compositor_frame_sink_holder =
36 new CompositorFrameSinkHolder(surface.get(), nullptr, nullptr);
34 37
35 // Set the release callback. 38 // Set the release callback.
36 int release_call_count = 0; 39 int release_call_count = 0;
37 buffer->set_release_callback( 40 buffer->set_release_callback(
38 base::Bind(&Release, base::Unretained(&release_call_count))); 41 base::Bind(&Release, base::Unretained(&release_call_count)));
39 42
40 buffer->OnAttach(); 43 buffer->OnAttach();
41 // Produce a texture mailbox for the contents of the buffer. 44 cc::TransferableResource resource;
42 cc::TextureMailbox texture_mailbox; 45 // Produce a transferable resource for the contents of the buffer.
43 std::unique_ptr<cc::SingleReleaseCallback> buffer_release_callback = 46 bool rv = buffer->ProduceTransferableResource(
44 buffer->ProduceTextureMailbox(&texture_mailbox, false, true); 47 compositor_frame_sink_holder.get(), 0, false, true, &resource);
45 ASSERT_TRUE(buffer_release_callback); 48 ASSERT_TRUE(rv);
46 49
47 // Release buffer. 50 // Release buffer.
48 buffer_release_callback->Run(gpu::SyncToken(), false); 51 cc::ReturnedResource returned_resource;
52 returned_resource.id = resource.id;
53 returned_resource.sync_token = resource.mailbox_holder.sync_token;
54 returned_resource.lost = false;
55 cc::ReturnedResourceArray resources = {returned_resource};
56 compositor_frame_sink_holder->ReclaimResources(resources);
49 57
58 RunAllPendingInMessageLoop();
50 ASSERT_EQ(release_call_count, 0); 59 ASSERT_EQ(release_call_count, 0);
51 60
52 buffer->OnDetach(); 61 buffer->OnDetach();
53 62
54 // Release() should have been called exactly once. 63 // Release() should have been called exactly once.
55 ASSERT_EQ(release_call_count, 1); 64 ASSERT_EQ(release_call_count, 1);
56 } 65 }
57 66
58 TEST_F(BufferTest, IsLost) { 67 TEST_F(BufferTest, IsLost) {
59 gfx::Size buffer_size(256, 256); 68 gfx::Size buffer_size(256, 256);
60 std::unique_ptr<Buffer> buffer( 69 std::unique_ptr<Buffer> buffer(
61 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size))); 70 new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)));
71 std::unique_ptr<Surface> surface(new Surface);
72 scoped_refptr<CompositorFrameSinkHolder> compositor_frame_sink_holder =
73 new CompositorFrameSinkHolder(surface.get(), nullptr, nullptr);
74 cc::ResourceId resource_id = 0;
62 75
63 buffer->OnAttach(); 76 buffer->OnAttach();
64 // Acquire a texture mailbox for the contents of the buffer. 77 // Acquire a texture transferable resource for the contents of the buffer.
65 cc::TextureMailbox texture_mailbox; 78 cc::TransferableResource resource;
66 std::unique_ptr<cc::SingleReleaseCallback> buffer_release_callback = 79 bool rv = buffer->ProduceTransferableResource(
67 buffer->ProduceTextureMailbox(&texture_mailbox, false, true); 80 compositor_frame_sink_holder.get(), resource_id, false, true, &resource);
68 ASSERT_TRUE(buffer_release_callback); 81 ASSERT_TRUE(rv);
69 82
70 scoped_refptr<cc::ContextProvider> context_provider = 83 scoped_refptr<cc::ContextProvider> context_provider =
71 aura::Env::GetInstance() 84 aura::Env::GetInstance()
72 ->context_factory() 85 ->context_factory()
73 ->SharedMainThreadContextProvider(); 86 ->SharedMainThreadContextProvider();
74 if (context_provider) { 87 if (context_provider) {
75 gpu::gles2::GLES2Interface* gles2 = context_provider->ContextGL(); 88 gpu::gles2::GLES2Interface* gles2 = context_provider->ContextGL();
76 gles2->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, 89 gles2->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
77 GL_INNOCENT_CONTEXT_RESET_ARB); 90 GL_INNOCENT_CONTEXT_RESET_ARB);
78 } 91 }
79 92
80 // Release buffer. 93 // Release buffer.
81 bool is_lost = true; 94 bool is_lost = true;
82 buffer_release_callback->Run(gpu::SyncToken(), is_lost); 95 cc::ReturnedResource returned_resource;
96 returned_resource.id = resource_id;
97 returned_resource.sync_token = gpu::SyncToken();
98 returned_resource.lost = is_lost;
99 cc::ReturnedResourceArray resources = {returned_resource};
100 compositor_frame_sink_holder->ReclaimResources(resources);
101 RunAllPendingInMessageLoop();
83 102
84 // Producing a new texture mailbox for the contents of the buffer. 103 // Producing a new texture transferable resource for the contents of the
85 std::unique_ptr<cc::SingleReleaseCallback> buffer_release_callback2 = 104 // buffer.
86 buffer->ProduceTextureMailbox(&texture_mailbox, false, false); 105 ++resource_id;
87 ASSERT_TRUE(buffer_release_callback2); 106 cc::TransferableResource new_resource;
107 rv = buffer->ProduceTransferableResource(compositor_frame_sink_holder.get(),
108 resource_id, false, false,
109 &new_resource);
110 ASSERT_TRUE(rv);
88 buffer->OnDetach(); 111 buffer->OnDetach();
89 112
90 buffer_release_callback2->Run(gpu::SyncToken(), false); 113 cc::ReturnedResource returned_resource2;
114 returned_resource2.id = resource_id;
115 returned_resource2.sync_token = gpu::SyncToken();
116 returned_resource2.lost = false;
117 cc::ReturnedResourceArray resources2 = {returned_resource2};
118 compositor_frame_sink_holder->ReclaimResources(resources2);
119 RunAllPendingInMessageLoop();
91 } 120 }
92 121
93 } // namespace 122 } // namespace
94 } // namespace exo 123 } // namespace exo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698