OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2015 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 |
| 5 #include <stdint.h> |
| 6 |
| 7 #include "base/test/test_simple_task_runner.h" |
| 8 #include "content/common/gpu/gpu_channel.h" |
| 9 #include "content/common/gpu/gpu_channel_manager.h" |
| 10 #include "content/common/gpu/gpu_channel_test_common.h" |
| 11 #include "gpu/ipc/common/gpu_messages.h" |
| 12 #include "ipc/ipc_test_sink.h" |
| 13 |
| 14 namespace content { |
| 15 |
| 16 class GpuChannelTest : public GpuChannelTestCommon { |
| 17 public: |
| 18 GpuChannelTest() : GpuChannelTestCommon() {} |
| 19 ~GpuChannelTest() override {} |
| 20 |
| 21 GpuChannel* CreateChannel(int32_t client_id, |
| 22 bool allow_view_command_buffers, |
| 23 bool allow_real_time_streams) { |
| 24 DCHECK(channel_manager()); |
| 25 uint64_t kClientTracingId = 1; |
| 26 channel_manager()->EstablishChannel( |
| 27 client_id, kClientTracingId, false /* preempts */, |
| 28 allow_view_command_buffers, allow_real_time_streams); |
| 29 return channel_manager()->LookupChannel(client_id); |
| 30 } |
| 31 |
| 32 void HandleMessage(GpuChannel* channel, IPC::Message* msg) { |
| 33 TestGpuChannel* test_channel = static_cast<TestGpuChannel*>(channel); |
| 34 test_channel->HandleMessageForTesting(*msg); |
| 35 |
| 36 if (msg->is_sync()) { |
| 37 const IPC::Message* reply_msg = test_channel->sink()->GetMessageAt(0); |
| 38 ASSERT_TRUE(reply_msg); |
| 39 |
| 40 EXPECT_TRUE(IPC::SyncMessage::IsMessageReplyTo( |
| 41 *reply_msg, IPC::SyncMessage::GetMessageId(*msg))); |
| 42 |
| 43 IPC::MessageReplyDeserializer* deserializer = |
| 44 static_cast<IPC::SyncMessage*>(msg)->GetReplyDeserializer(); |
| 45 ASSERT_TRUE(deserializer); |
| 46 deserializer->SerializeOutputParameters(*reply_msg); |
| 47 |
| 48 delete deserializer; |
| 49 |
| 50 test_channel->sink()->ClearMessages(); |
| 51 } |
| 52 |
| 53 delete msg; |
| 54 } |
| 55 }; |
| 56 |
| 57 #if defined(OS_WIN) |
| 58 const gpu::SurfaceHandle kFakeSurfaceHandle = |
| 59 reinterpret_cast<gpu::SurfaceHandle>(1); |
| 60 #else |
| 61 const gpu::SurfaceHandle kFakeSurfaceHandle = 1; |
| 62 #endif |
| 63 |
| 64 TEST_F(GpuChannelTest, CreateViewCommandBufferAllowed) { |
| 65 int32_t kClientId = 1; |
| 66 bool allow_view_command_buffers = true; |
| 67 GpuChannel* channel = |
| 68 CreateChannel(kClientId, allow_view_command_buffers, false); |
| 69 ASSERT_TRUE(channel); |
| 70 |
| 71 gpu::SurfaceHandle surface_handle = kFakeSurfaceHandle; |
| 72 DCHECK_NE(surface_handle, gpu::kNullSurfaceHandle); |
| 73 |
| 74 int32_t kRouteId = 1; |
| 75 GPUCreateCommandBufferConfig init_params; |
| 76 init_params.share_group_id = MSG_ROUTING_NONE; |
| 77 init_params.stream_id = 0; |
| 78 init_params.stream_priority = gpu::GpuStreamPriority::NORMAL; |
| 79 init_params.attribs = std::vector<int>(); |
| 80 init_params.active_url = GURL(); |
| 81 init_params.gpu_preference = gfx::PreferIntegratedGpu; |
| 82 bool succeeded = false; |
| 83 HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer( |
| 84 surface_handle, gfx::Size(), init_params, kRouteId, |
| 85 &succeeded)); |
| 86 EXPECT_TRUE(succeeded); |
| 87 |
| 88 GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId); |
| 89 ASSERT_TRUE(stub); |
| 90 } |
| 91 |
| 92 TEST_F(GpuChannelTest, CreateViewCommandBufferDisallowed) { |
| 93 int32_t kClientId = 1; |
| 94 bool allow_view_command_buffers = false; |
| 95 GpuChannel* channel = |
| 96 CreateChannel(kClientId, allow_view_command_buffers, false); |
| 97 ASSERT_TRUE(channel); |
| 98 |
| 99 gpu::SurfaceHandle surface_handle = kFakeSurfaceHandle; |
| 100 DCHECK_NE(surface_handle, gpu::kNullSurfaceHandle); |
| 101 |
| 102 int32_t kRouteId = 1; |
| 103 GPUCreateCommandBufferConfig init_params; |
| 104 init_params.share_group_id = MSG_ROUTING_NONE; |
| 105 init_params.stream_id = 0; |
| 106 init_params.stream_priority = gpu::GpuStreamPriority::NORMAL; |
| 107 init_params.attribs = std::vector<int>(); |
| 108 init_params.active_url = GURL(); |
| 109 init_params.gpu_preference = gfx::PreferIntegratedGpu; |
| 110 bool succeeded = false; |
| 111 HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer( |
| 112 surface_handle, gfx::Size(), init_params, kRouteId, |
| 113 &succeeded)); |
| 114 EXPECT_FALSE(succeeded); |
| 115 |
| 116 GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId); |
| 117 EXPECT_FALSE(stub); |
| 118 } |
| 119 |
| 120 TEST_F(GpuChannelTest, CreateOffscreenCommandBuffer) { |
| 121 int32_t kClientId = 1; |
| 122 GpuChannel* channel = CreateChannel(kClientId, true, false); |
| 123 ASSERT_TRUE(channel); |
| 124 |
| 125 int32_t kRouteId = 1; |
| 126 GPUCreateCommandBufferConfig init_params; |
| 127 init_params.share_group_id = MSG_ROUTING_NONE; |
| 128 init_params.stream_id = 0; |
| 129 init_params.stream_priority = gpu::GpuStreamPriority::NORMAL; |
| 130 init_params.attribs = std::vector<int>(); |
| 131 init_params.active_url = GURL(); |
| 132 init_params.gpu_preference = gfx::PreferIntegratedGpu; |
| 133 bool succeeded = false; |
| 134 HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer( |
| 135 gpu::kNullSurfaceHandle, gfx::Size(1, 1), |
| 136 init_params, kRouteId, &succeeded)); |
| 137 EXPECT_TRUE(succeeded); |
| 138 |
| 139 GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId); |
| 140 EXPECT_TRUE(stub); |
| 141 } |
| 142 |
| 143 TEST_F(GpuChannelTest, IncompatibleStreamIds) { |
| 144 int32_t kClientId = 1; |
| 145 GpuChannel* channel = CreateChannel(kClientId, true, false); |
| 146 ASSERT_TRUE(channel); |
| 147 |
| 148 // Create first context. |
| 149 int32_t kRouteId1 = 1; |
| 150 int32_t kStreamId1 = 1; |
| 151 GPUCreateCommandBufferConfig init_params; |
| 152 init_params.share_group_id = MSG_ROUTING_NONE; |
| 153 init_params.stream_id = kStreamId1; |
| 154 init_params.stream_priority = gpu::GpuStreamPriority::NORMAL; |
| 155 init_params.attribs = std::vector<int>(); |
| 156 init_params.active_url = GURL(); |
| 157 init_params.gpu_preference = gfx::PreferIntegratedGpu; |
| 158 bool succeeded = false; |
| 159 HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer( |
| 160 gpu::kNullSurfaceHandle, gfx::Size(1, 1), |
| 161 init_params, kRouteId1, &succeeded)); |
| 162 EXPECT_TRUE(succeeded); |
| 163 |
| 164 GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId1); |
| 165 EXPECT_TRUE(stub); |
| 166 |
| 167 // Create second context in same share group but different stream. |
| 168 int32_t kRouteId2 = 2; |
| 169 int32_t kStreamId2 = 2; |
| 170 |
| 171 init_params.share_group_id = kRouteId1; |
| 172 init_params.stream_id = kStreamId2; |
| 173 init_params.stream_priority = gpu::GpuStreamPriority::NORMAL; |
| 174 init_params.attribs = std::vector<int>(); |
| 175 init_params.active_url = GURL(); |
| 176 init_params.gpu_preference = gfx::PreferIntegratedGpu; |
| 177 succeeded = false; |
| 178 HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer( |
| 179 gpu::kNullSurfaceHandle, gfx::Size(1, 1), |
| 180 init_params, kRouteId2, &succeeded)); |
| 181 EXPECT_FALSE(succeeded); |
| 182 |
| 183 stub = channel->LookupCommandBuffer(kRouteId2); |
| 184 EXPECT_FALSE(stub); |
| 185 } |
| 186 |
| 187 TEST_F(GpuChannelTest, StreamLifetime) { |
| 188 int32_t kClientId = 1; |
| 189 GpuChannel* channel = CreateChannel(kClientId, true, false); |
| 190 ASSERT_TRUE(channel); |
| 191 |
| 192 // Create first context. |
| 193 int32_t kRouteId1 = 1; |
| 194 int32_t kStreamId1 = 1; |
| 195 gpu::GpuStreamPriority kStreamPriority1 = gpu::GpuStreamPriority::NORMAL; |
| 196 GPUCreateCommandBufferConfig init_params; |
| 197 init_params.share_group_id = MSG_ROUTING_NONE; |
| 198 init_params.stream_id = kStreamId1; |
| 199 init_params.stream_priority = kStreamPriority1; |
| 200 init_params.attribs = std::vector<int>(); |
| 201 init_params.active_url = GURL(); |
| 202 init_params.gpu_preference = gfx::PreferIntegratedGpu; |
| 203 bool succeeded = false; |
| 204 HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer( |
| 205 gpu::kNullSurfaceHandle, gfx::Size(1, 1), |
| 206 init_params, kRouteId1, &succeeded)); |
| 207 EXPECT_TRUE(succeeded); |
| 208 |
| 209 GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId1); |
| 210 EXPECT_TRUE(stub); |
| 211 |
| 212 HandleMessage(channel, new GpuChannelMsg_DestroyCommandBuffer(kRouteId1)); |
| 213 stub = channel->LookupCommandBuffer(kRouteId1); |
| 214 EXPECT_FALSE(stub); |
| 215 |
| 216 // Create second context in same share group but different stream. |
| 217 int32_t kRouteId2 = 2; |
| 218 int32_t kStreamId2 = 2; |
| 219 gpu::GpuStreamPriority kStreamPriority2 = gpu::GpuStreamPriority::LOW; |
| 220 |
| 221 init_params.share_group_id = MSG_ROUTING_NONE; |
| 222 init_params.stream_id = kStreamId2; |
| 223 init_params.stream_priority = kStreamPriority2; |
| 224 init_params.attribs = std::vector<int>(); |
| 225 init_params.active_url = GURL(); |
| 226 init_params.gpu_preference = gfx::PreferIntegratedGpu; |
| 227 succeeded = false; |
| 228 HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer( |
| 229 gpu::kNullSurfaceHandle, gfx::Size(1, 1), |
| 230 init_params, kRouteId2, &succeeded)); |
| 231 EXPECT_TRUE(succeeded); |
| 232 |
| 233 stub = channel->LookupCommandBuffer(kRouteId2); |
| 234 EXPECT_TRUE(stub); |
| 235 } |
| 236 |
| 237 TEST_F(GpuChannelTest, RealTimeStreamsDisallowed) { |
| 238 int32_t kClientId = 1; |
| 239 bool allow_real_time_streams = false; |
| 240 GpuChannel* channel = CreateChannel(kClientId, true, allow_real_time_streams); |
| 241 ASSERT_TRUE(channel); |
| 242 |
| 243 // Create first context. |
| 244 int32_t kRouteId = 1; |
| 245 int32_t kStreamId = 1; |
| 246 gpu::GpuStreamPriority kStreamPriority = gpu::GpuStreamPriority::REAL_TIME; |
| 247 GPUCreateCommandBufferConfig init_params; |
| 248 init_params.share_group_id = MSG_ROUTING_NONE; |
| 249 init_params.stream_id = kStreamId; |
| 250 init_params.stream_priority = kStreamPriority; |
| 251 init_params.attribs = std::vector<int>(); |
| 252 init_params.active_url = GURL(); |
| 253 init_params.gpu_preference = gfx::PreferIntegratedGpu; |
| 254 bool succeeded = false; |
| 255 HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer( |
| 256 gpu::kNullSurfaceHandle, gfx::Size(1, 1), |
| 257 init_params, kRouteId, &succeeded)); |
| 258 EXPECT_FALSE(succeeded); |
| 259 |
| 260 GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId); |
| 261 EXPECT_FALSE(stub); |
| 262 } |
| 263 |
| 264 TEST_F(GpuChannelTest, RealTimeStreamsAllowed) { |
| 265 int32_t kClientId = 1; |
| 266 bool allow_real_time_streams = true; |
| 267 GpuChannel* channel = CreateChannel(kClientId, true, allow_real_time_streams); |
| 268 ASSERT_TRUE(channel); |
| 269 |
| 270 // Create first context. |
| 271 int32_t kRouteId = 1; |
| 272 int32_t kStreamId = 1; |
| 273 gpu::GpuStreamPriority kStreamPriority = gpu::GpuStreamPriority::REAL_TIME; |
| 274 GPUCreateCommandBufferConfig init_params; |
| 275 init_params.share_group_id = MSG_ROUTING_NONE; |
| 276 init_params.stream_id = kStreamId; |
| 277 init_params.stream_priority = kStreamPriority; |
| 278 init_params.attribs = std::vector<int>(); |
| 279 init_params.active_url = GURL(); |
| 280 init_params.gpu_preference = gfx::PreferIntegratedGpu; |
| 281 bool succeeded = false; |
| 282 HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer( |
| 283 gpu::kNullSurfaceHandle, gfx::Size(1, 1), |
| 284 init_params, kRouteId, &succeeded)); |
| 285 EXPECT_TRUE(succeeded); |
| 286 |
| 287 GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId); |
| 288 EXPECT_TRUE(stub); |
| 289 } |
| 290 |
| 291 } // namespace content |
OLD | NEW |