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

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

Issue 2584953002: exo::CompositorFrameSinkHolder's release callbacks hold ref (Closed)
Patch Set: NOT FOR COMMIT: SEGV_MAPERR in Callback::Run() 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"
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698