OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 9 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
10 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 10 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
(...skipping 7094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7105 GLenum type; | 7105 GLenum type; |
7106 bool is_gl; | 7106 bool is_gl; |
7107 }; | 7107 }; |
7108 | 7108 |
7109 const QueryType kQueryTypes[] = { | 7109 const QueryType kQueryTypes[] = { |
7110 { GL_COMMANDS_ISSUED_CHROMIUM, false }, | 7110 { GL_COMMANDS_ISSUED_CHROMIUM, false }, |
7111 { GL_LATENCY_QUERY_CHROMIUM, false }, | 7111 { GL_LATENCY_QUERY_CHROMIUM, false }, |
7112 { GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, false }, | 7112 { GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, false }, |
7113 { GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, false }, | 7113 { GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, false }, |
7114 { GL_GET_ERROR_QUERY_CHROMIUM, false }, | 7114 { GL_GET_ERROR_QUERY_CHROMIUM, false }, |
7115 { GL_COMMANDS_COMPLETED_CHROMIUM, false }, | |
7116 { GL_ANY_SAMPLES_PASSED_EXT, true }, | 7115 { GL_ANY_SAMPLES_PASSED_EXT, true }, |
7117 }; | 7116 }; |
7118 | 7117 |
7119 static void CheckBeginEndQueryBadMemoryFails( | 7118 static void CheckBeginEndQueryBadMemoryFails( |
7120 GLES2DecoderTestBase* test, | 7119 GLES2DecoderTestBase* test, |
7121 GLuint client_id, | 7120 GLuint client_id, |
7122 GLuint service_id, | 7121 GLuint service_id, |
7123 const QueryType& query_type, | 7122 const QueryType& query_type, |
7124 int32 shm_id, | 7123 int32 shm_id, |
7125 uint32 shm_offset) { | 7124 uint32 shm_offset) { |
7126 // We need to reset the decoder on each iteration, because we lose the | 7125 // We need to reset the decoder on each iteration, because we lose the |
7127 // context every time. | 7126 // context every time. |
7128 GLES2DecoderTestBase::InitState init; | 7127 GLES2DecoderTestBase::InitState init; |
7129 init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync"; | 7128 init.extensions = "GL_EXT_occlusion_query_boolean"; |
7130 init.gl_version = "opengl es 2.0"; | 7129 init.gl_version = "opengl es 2.0"; |
7131 init.has_alpha = true; | 7130 init.has_alpha = true; |
7132 init.request_alpha = true; | 7131 init.request_alpha = true; |
7133 init.bind_generates_resource = true; | 7132 init.bind_generates_resource = true; |
7134 test->InitDecoder(init); | 7133 test->InitDecoder(init); |
7135 ::testing::StrictMock< ::gfx::MockGLInterface>* gl = test->GetGLMock(); | 7134 ::testing::StrictMock< ::gfx::MockGLInterface>* gl = test->GetGLMock(); |
7136 | 7135 |
7137 BeginQueryEXT begin_cmd; | 7136 BeginQueryEXT begin_cmd; |
7138 | 7137 |
7139 test->GenHelper<GenQueriesEXTImmediate>(client_id); | 7138 test->GenHelper<GenQueriesEXTImmediate>(client_id); |
(...skipping 14 matching lines...) Expand all Loading... |
7154 if (query_type.is_gl) { | 7153 if (query_type.is_gl) { |
7155 EXPECT_CALL(*gl, EndQueryARB(query_type.type)) | 7154 EXPECT_CALL(*gl, EndQueryARB(query_type.type)) |
7156 .Times(1) | 7155 .Times(1) |
7157 .RetiresOnSaturation(); | 7156 .RetiresOnSaturation(); |
7158 } | 7157 } |
7159 if (query_type.type == GL_GET_ERROR_QUERY_CHROMIUM) { | 7158 if (query_type.type == GL_GET_ERROR_QUERY_CHROMIUM) { |
7160 EXPECT_CALL(*gl, GetError()) | 7159 EXPECT_CALL(*gl, GetError()) |
7161 .WillOnce(Return(GL_NO_ERROR)) | 7160 .WillOnce(Return(GL_NO_ERROR)) |
7162 .RetiresOnSaturation(); | 7161 .RetiresOnSaturation(); |
7163 } | 7162 } |
7164 GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef); | |
7165 if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { | |
7166 EXPECT_CALL(*gl, Flush()).RetiresOnSaturation(); | |
7167 EXPECT_CALL(*gl, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) | |
7168 .WillOnce(Return(kGlSync)) | |
7169 .RetiresOnSaturation(); | |
7170 } | |
7171 | 7163 |
7172 EndQueryEXT end_cmd; | 7164 EndQueryEXT end_cmd; |
7173 end_cmd.Init(query_type.type, 1); | 7165 end_cmd.Init(query_type.type, 1); |
7174 error::Error error2 = test->ExecuteCmd(end_cmd); | 7166 error::Error error2 = test->ExecuteCmd(end_cmd); |
7175 | 7167 |
7176 if (query_type.is_gl) { | 7168 if (query_type.is_gl) { |
7177 EXPECT_CALL(*gl, | 7169 EXPECT_CALL(*gl, |
7178 GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) | 7170 GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) |
7179 .WillOnce(SetArgumentPointee<2>(1)) | 7171 .WillOnce(SetArgumentPointee<2>(1)) |
7180 .RetiresOnSaturation(); | 7172 .RetiresOnSaturation(); |
7181 EXPECT_CALL(*gl, | 7173 EXPECT_CALL(*gl, |
7182 GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _)) | 7174 GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _)) |
7183 .WillOnce(SetArgumentPointee<2>(1)) | 7175 .WillOnce(SetArgumentPointee<2>(1)) |
7184 .RetiresOnSaturation(); | 7176 .RetiresOnSaturation(); |
7185 } | 7177 } |
7186 if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { | |
7187 EXPECT_CALL(*gl, ClientWaitSync(kGlSync, _, _)) | |
7188 .WillOnce(Return(GL_ALREADY_SIGNALED)) | |
7189 .RetiresOnSaturation(); | |
7190 } | |
7191 | 7178 |
7192 QueryManager* query_manager = test->GetDecoder()->GetQueryManager(); | 7179 QueryManager* query_manager = test->GetDecoder()->GetQueryManager(); |
7193 ASSERT_TRUE(query_manager != NULL); | 7180 ASSERT_TRUE(query_manager != NULL); |
7194 bool process_success = query_manager->ProcessPendingQueries(); | 7181 bool process_success = query_manager->ProcessPendingQueries(); |
7195 | 7182 |
7196 EXPECT_TRUE(error1 != error::kNoError || | 7183 EXPECT_TRUE(error1 != error::kNoError || |
7197 error2 != error::kNoError || | 7184 error2 != error::kNoError || |
7198 !process_success); | 7185 !process_success); |
7199 | 7186 |
7200 if (query_type.is_gl) { | 7187 if (query_type.is_gl) { |
7201 EXPECT_CALL(*gl, DeleteQueriesARB(1, _)) | 7188 EXPECT_CALL(*gl, DeleteQueriesARB(1, _)) |
7202 .Times(1) | 7189 .Times(1) |
7203 .RetiresOnSaturation(); | 7190 .RetiresOnSaturation(); |
7204 } | 7191 } |
7205 if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) | |
7206 EXPECT_CALL(*gl, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); | |
7207 test->ResetDecoder(); | 7192 test->ResetDecoder(); |
7208 } | 7193 } |
7209 | 7194 |
7210 TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) { | 7195 TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) { |
7211 for (size_t i = 0; i < arraysize(kQueryTypes); ++i) { | 7196 for (size_t i = 0; i < arraysize(kQueryTypes); ++i) { |
7212 CheckBeginEndQueryBadMemoryFails( | 7197 CheckBeginEndQueryBadMemoryFails( |
7213 this, kNewClientId, kNewServiceId, | 7198 this, kNewClientId, kNewServiceId, |
7214 kQueryTypes[i], | 7199 kQueryTypes[i], |
7215 kInvalidSharedMemoryId, kSharedMemoryOffset); | 7200 kInvalidSharedMemoryId, kSharedMemoryOffset); |
7216 } | 7201 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7284 | 7269 |
7285 EndQueryEXT end_cmd; | 7270 EndQueryEXT end_cmd; |
7286 end_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM, 1); | 7271 end_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM, 1); |
7287 EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); | 7272 EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); |
7288 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 7273 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
7289 EXPECT_FALSE(query->pending()); | 7274 EXPECT_FALSE(query->pending()); |
7290 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), | 7275 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), |
7291 static_cast<GLenum>(sync->result)); | 7276 static_cast<GLenum>(sync->result)); |
7292 } | 7277 } |
7293 | 7278 |
7294 TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) { | |
7295 InitState init; | |
7296 init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync"; | |
7297 init.gl_version = "opengl es 2.0"; | |
7298 init.has_alpha = true; | |
7299 init.request_alpha = true; | |
7300 init.bind_generates_resource = true; | |
7301 InitDecoder(init); | |
7302 | |
7303 GenHelper<GenQueriesEXTImmediate>(kNewClientId); | |
7304 | |
7305 BeginQueryEXT begin_cmd; | |
7306 begin_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM, | |
7307 kNewClientId, | |
7308 kSharedMemoryId, | |
7309 kSharedMemoryOffset); | |
7310 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); | |
7311 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7312 | |
7313 QueryManager* query_manager = decoder_->GetQueryManager(); | |
7314 ASSERT_TRUE(query_manager != NULL); | |
7315 QueryManager::Query* query = query_manager->GetQuery(kNewClientId); | |
7316 ASSERT_TRUE(query != NULL); | |
7317 EXPECT_FALSE(query->pending()); | |
7318 | |
7319 GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef); | |
7320 EXPECT_CALL(*gl_, Flush()).RetiresOnSaturation(); | |
7321 EXPECT_CALL(*gl_, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) | |
7322 .WillOnce(Return(kGlSync)) | |
7323 .RetiresOnSaturation(); | |
7324 | |
7325 EndQueryEXT end_cmd; | |
7326 end_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM, 1); | |
7327 EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); | |
7328 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7329 EXPECT_TRUE(query->pending()); | |
7330 | |
7331 EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _)) | |
7332 .WillOnce(Return(GL_TIMEOUT_EXPIRED)) | |
7333 .RetiresOnSaturation(); | |
7334 bool process_success = query_manager->ProcessPendingQueries(); | |
7335 | |
7336 EXPECT_TRUE(process_success); | |
7337 EXPECT_TRUE(query->pending()); | |
7338 | |
7339 EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _)) | |
7340 .WillOnce(Return(GL_ALREADY_SIGNALED)) | |
7341 .RetiresOnSaturation(); | |
7342 process_success = query_manager->ProcessPendingQueries(); | |
7343 | |
7344 EXPECT_TRUE(process_success); | |
7345 EXPECT_FALSE(query->pending()); | |
7346 QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_); | |
7347 EXPECT_EQ(static_cast<GLenum>(0), static_cast<GLenum>(sync->result)); | |
7348 | |
7349 EXPECT_CALL(*gl_, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); | |
7350 ResetDecoder(); | |
7351 } | |
7352 | |
7353 TEST_F(GLES2DecoderTest, ProduceAndConsumeTextureCHROMIUM) { | 7279 TEST_F(GLES2DecoderTest, ProduceAndConsumeTextureCHROMIUM) { |
7354 Mailbox mailbox = Mailbox::Generate(); | 7280 Mailbox mailbox = Mailbox::Generate(); |
7355 | 7281 |
7356 memcpy(shared_memory_address_, mailbox.name, sizeof(mailbox.name)); | 7282 memcpy(shared_memory_address_, mailbox.name, sizeof(mailbox.name)); |
7357 | 7283 |
7358 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | 7284 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
7359 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | 7285 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
7360 0, 0); | 7286 0, 0); |
7361 DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, | 7287 DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
7362 0, 0); | 7288 0, 0); |
(...skipping 2156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9519 // TODO(gman): TexImage2DImmediate | 9445 // TODO(gman): TexImage2DImmediate |
9520 | 9446 |
9521 // TODO(gman): TexSubImage2DImmediate | 9447 // TODO(gman): TexSubImage2DImmediate |
9522 | 9448 |
9523 // TODO(gman): UseProgram | 9449 // TODO(gman): UseProgram |
9524 | 9450 |
9525 // TODO(gman): SwapBuffers | 9451 // TODO(gman): SwapBuffers |
9526 | 9452 |
9527 } // namespace gles2 | 9453 } // namespace gles2 |
9528 } // namespace gpu | 9454 } // namespace gpu |
OLD | NEW |