15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/command_line.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/id_allocator.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/cmd_buffer_engine.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/context_group.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gpu/command_buffer/service/context_state.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_surface_mock.h" 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gpu/command_buffer/service/gpu_switches.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/image_manager.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/mailbox_manager.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/mocks.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/program_manager.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_implementation.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_surface_stub.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(GL_DEPTH24_STENCIL8) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GL_DEPTH24_STENCIL8 0x88F0 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::gfx::MockGLInterface; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using ::testing::AtLeast; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::MatcherCast; 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::Mock; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Pointee; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::SaveArg; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArrayArgument; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgumentPointee; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::SetArgPointee; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrEq; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using namespace cmds; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderRGBBackbufferTest::SetUp() { 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test codepath with workaround clear_alpha_in_readpixels because 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // ReadPixelsEmulator emulates the incorrect driver behavior. 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CommandLine command_line(0, NULL); 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) command_line.AppendSwitchASCII( 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) switches::kGpuDriverBugWorkarounds, 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::IntToString(gpu::CLEAR_ALPHA_IN_READPIXELS)); 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InitState init; 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "3.0"; 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.bind_generates_resource = true; 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InitDecoderWithCommandLine(init, &command_line); 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetupDefaultProgram(); 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Override default setup so nothing gets setup. 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderManualInitTest::SetUp() { 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GLES2DecoderManualInitTest::EnableDisableTest(GLenum cap, 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool enable, 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool expect_set) { 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (expect_set) { 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetupExpectationsForEnableDisable(cap, enable); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (enable) { 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Enable cmd; 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(cap); 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Disable cmd; 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(cap); 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, GetIntegervCached) { 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) struct TestInfo { 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLenum pname; 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLint expected; 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TestInfo tests[] = { 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_MAX_TEXTURE_SIZE, TestHelper::kMaxTextureSize, 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }, 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_MAX_CUBE_MAP_TEXTURE_SIZE, TestHelper::kMaxCubeMapTextureSize, 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }, 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_MAX_RENDERBUFFER_SIZE, TestHelper::kMaxRenderbufferSize, 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }, 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typedef GetIntegerv::Result Result; 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t ii = 0; ii < sizeof(tests) / sizeof(tests[0]); ++ii) { 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const TestInfo& test = tests[ii]; 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Result* result = static_cast<Result*>(shared_memory_address_); 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*gl_, GetError()) 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu .WillOnce(Return(GL_NO_ERROR)) 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu .WillOnce(Return(GL_NO_ERROR)) 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu .RetiresOnSaturation(); 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, GetIntegerv(test.pname, _)).Times(0); 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu result->size = 0; 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetIntegerv cmd2; 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd2.Init(test.pname, shared_memory_id_, shared_memory_offset_); 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(test.pname), 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result->GetNumResults()); 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(GL_NO_ERROR, GetGLError()); 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(test.expected, result->GetData()[0]); 1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderWithShaderTest, GetMaxValueInBufferCHROMIUM) { 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetupIndexBuffer(); 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetMaxValueInBufferCHROMIUM::Result* result = 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<GetMaxValueInBufferCHROMIUM::Result*>(shared_memory_address_); 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *result = 0; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetMaxValueInBufferCHROMIUM cmd; 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(client_element_buffer_id_, 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeCount, 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_SHORT, 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeStart * 2, 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(7u, *result); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(client_element_buffer_id_, 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeCount + 1, 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_SHORT, 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeStart * 2, 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(100u, *result); 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kInvalidClientId, 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeCount, 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_SHORT, 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeStart * 2, 161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(client_element_buffer_id_, 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kOutOfRangeIndexRangeEnd, 167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_SHORT, 168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeStart * 2, 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(client_element_buffer_id_, 174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeCount + 1, 175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_SHORT, 176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kOutOfRangeIndexRangeEnd * 2, 177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(client_element_buffer_id_, 182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeCount + 1, 183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_SHORT, 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeStart * 2, 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(client_buffer_id_, 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeCount + 1, 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_SHORT, 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeStart * 2, 192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(client_element_buffer_id_, 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeCount + 1, 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_SHORT, 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeStart * 2, 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInvalidSharedMemoryId, 201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(client_element_buffer_id_, 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeCount + 1, 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_SHORT, 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kValidIndexRangeStart * 2, 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInvalidSharedMemoryOffset); 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, SharedIds) { 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenSharedIdsCHROMIUM gen_cmd; 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RegisterSharedIdsCHROMIUM reg_cmd; 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteSharedIdsCHROMIUM del_cmd; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kNamespaceId = id_namespaces::kTextures; 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kExpectedId1 = 1; 219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kExpectedId2 = 2; 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kExpectedId3 = 4; 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kRegisterId = 3; 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLuint* ids = GetSharedMemoryAs<GLuint*>(); 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gen_cmd.Init(kNamespaceId, 0, 2, kSharedMemoryId, kSharedMemoryOffset); 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd)); 225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IdAllocatorInterface* id_allocator = GetIdAllocator(kNamespaceId); 226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(id_allocator != NULL); 227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // This check is implementation dependant but it's kind of hard to check 228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // otherwise. 229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kExpectedId1, ids[0]); 230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kExpectedId2, ids[1]); 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kExpectedId1)); 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kExpectedId2)); 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(id_allocator->InUse(kRegisterId)); 234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(id_allocator->InUse(kExpectedId3)); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ClearSharedMemory(); 237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ids[0] = kRegisterId; 238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) reg_cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset); 239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(reg_cmd)); 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kExpectedId1)); 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kExpectedId2)); 242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kRegisterId)); 243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(id_allocator->InUse(kExpectedId3)); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ClearSharedMemory(); 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gen_cmd.Init(kNamespaceId, 0, 1, kSharedMemoryId, kSharedMemoryOffset); 247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd)); 248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kExpectedId3, ids[0]); 249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kExpectedId1)); 250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kExpectedId2)); 251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kRegisterId)); 252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kExpectedId3)); 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ClearSharedMemory(); 255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ids[0] = kExpectedId1; 256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ids[1] = kRegisterId; 257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) del_cmd.Init(kNamespaceId, 2, kSharedMemoryId, kSharedMemoryOffset); 258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(del_cmd)); 259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(id_allocator->InUse(kExpectedId1)); 260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kExpectedId2)); 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(id_allocator->InUse(kRegisterId)); 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(id_allocator->InUse(kExpectedId3)); 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ClearSharedMemory(); 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ids[0] = kExpectedId3; 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ids[1] = kExpectedId2; 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) del_cmd.Init(kNamespaceId, 2, kSharedMemoryId, kSharedMemoryOffset); 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(del_cmd)); 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(id_allocator->InUse(kExpectedId1)); 270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(id_allocator->InUse(kExpectedId2)); 271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(id_allocator->InUse(kRegisterId)); 272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(id_allocator->InUse(kExpectedId3)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check passing in an id_offset. 275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ClearSharedMemory(); 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kOffset = 0xABCDEF; 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gen_cmd.Init(kNamespaceId, kOffset, 2, kSharedMemoryId, kSharedMemoryOffset); 278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(gen_cmd)); 279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kOffset, ids[0]); 280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kOffset + 1, ids[1]); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, GenSharedIdsCHROMIUMBadArgs) { 284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kNamespaceId = id_namespaces::kTextures; 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenSharedIdsCHROMIUM cmd; 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, 0, -1, kSharedMemoryId, kSharedMemoryOffset); 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, 0, 1, kInvalidSharedMemoryId, kSharedMemoryOffset); 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, 0, 1, kSharedMemoryId, kInvalidSharedMemoryOffset); 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, RegisterSharedIdsCHROMIUMBadArgs) { 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kNamespaceId = id_namespaces::kTextures; 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RegisterSharedIdsCHROMIUM cmd; 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset); 298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, 1, kInvalidSharedMemoryId, kSharedMemoryOffset); 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, 1, kSharedMemoryId, kInvalidSharedMemoryOffset); 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, RegisterSharedIdsCHROMIUMDuplicateIds) { 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kNamespaceId = id_namespaces::kTextures; 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kRegisterId = 3; 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RegisterSharedIdsCHROMIUM cmd; 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLuint* ids = GetSharedMemoryAs<GLuint*>(); 310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ids[0] = kRegisterId; 311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, 1, kSharedMemoryId, kSharedMemoryOffset); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, DeleteSharedIdsCHROMIUMBadArgs) { 319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kNamespaceId = id_namespaces::kTextures; 320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteSharedIdsCHROMIUM cmd; 321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset); 322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, 1, kInvalidSharedMemoryId, kSharedMemoryOffset); 324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNamespaceId, 1, kSharedMemoryId, kInvalidSharedMemoryOffset); 326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsBuffer) { 330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(DoIsBuffer(client_buffer_id_)); 331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); 332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(DoIsBuffer(client_buffer_id_)); 333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoDeleteBuffer(client_buffer_id_, kServiceBufferId); 334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(DoIsBuffer(client_buffer_id_)); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsFramebuffer) { 338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_)); 339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoBindFramebuffer( 340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); 341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(DoIsFramebuffer(client_framebuffer_id_)); 342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoDeleteFramebuffer(client_framebuffer_id_, 343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kServiceFramebufferId, 344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) true, 345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_FRAMEBUFFER, 346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) true, 348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_FRAMEBUFFER, 349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0); 350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_)); 351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsProgram) { 354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // IsProgram is true as soon as the program is created. 355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(DoIsProgram(client_program_id_)); 356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoDeleteProgram(client_program_id_, kServiceProgramId); 360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(DoIsProgram(client_program_id_)); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsRenderbuffer) { 364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_)); 365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoBindRenderbuffer( 366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); 367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(DoIsRenderbuffer(client_renderbuffer_id_)); 368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId); 369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_)); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsShader) { 373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // IsShader is true as soon as the program is created. 374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(DoIsShader(client_shader_id_)); 375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoDeleteShader(client_shader_id_, kServiceShaderId); 376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(DoIsShader(client_shader_id_)); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsTexture) { 380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(DoIsTexture(client_texture_id_)); 381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); 382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(DoIsTexture(client_texture_id_)); 383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoDeleteTexture(client_texture_id_, kServiceTextureId); 384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(DoIsTexture(client_texture_id_)); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, GetMultipleIntegervCHROMIUMValidArgs) { 388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLsizei kCount = 3; 389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLenum* pnames = GetSharedMemoryAs<GLenum*>(); 390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pnames[0] = GL_DEPTH_WRITEMASK; 391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pnames[1] = GL_COLOR_WRITEMASK; 392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pnames[2] = GL_STENCIL_WRITEMASK; 393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLint* results = 394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetSharedMemoryAsWithOffset<GLint*>(sizeof(*pnames) * kCount); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLsizei num_results = 0; 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (GLsizei ii = 0; ii < kCount; ++ii) { 398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]); 399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLsizei result_size = num_results * sizeof(*results); 401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) memset(results, 0, result_size); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLint kSentinel = 0x12345678; 404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) results[num_results] = kSentinel; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetMultipleIntegervCHROMIUM cmd; 407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kSharedMemoryId, 408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset, 409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kCount, 410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + sizeof(*pnames) * kCount, 412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_size); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, results[0]); // Depth writemask 417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, results[1]); // color writemask red 418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, results[2]); // color writemask green 419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, results[3]); // color writemask blue 420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, results[4]); // color writemask alpha 421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(-1, results[5]); // stencil writemask alpha 422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kSentinel, results[num_results]); // End of results 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, GetMultipleIntegervCHROMIUMInvalidArgs) { 426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLsizei kCount = 3; 427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Offset the pnames because GLGetError will use the first uint32. 428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const uint32 kPnameOffset = sizeof(uint32); 429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const uint32 kResultsOffset = kPnameOffset + sizeof(GLint) * kCount; 430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLenum* pnames = GetSharedMemoryAsWithOffset<GLenum*>(kPnameOffset); 431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pnames[0] = GL_DEPTH_WRITEMASK; 432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pnames[1] = GL_COLOR_WRITEMASK; 433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pnames[2] = GL_STENCIL_WRITEMASK; 434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLint* results = GetSharedMemoryAsWithOffset<GLint*>(kResultsOffset); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLsizei num_results = 0; 437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (GLsizei ii = 0; ii < kCount; ++ii) { 438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]); 439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLsizei result_size = num_results * sizeof(*results); 441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) memset(results, 0, result_size); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLint kSentinel = 0x12345678; 444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) results[num_results] = kSentinel; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetMultipleIntegervCHROMIUM cmd; 447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check bad pnames pointer. 448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kInvalidSharedMemoryId, 449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kPnameOffset, 450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kCount, 451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kResultsOffset, 453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_size); 454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check bad pnames pointer. 457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kSharedMemoryId, 458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInvalidSharedMemoryOffset, 459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kCount, 460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kResultsOffset, 462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_size); 463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check bad count. 466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kSharedMemoryId, 467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kPnameOffset, 468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<GLuint>(-1), 469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kResultsOffset, 471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_size); 472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check bad results pointer. 475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kSharedMemoryId, 476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kPnameOffset, 477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kCount, 478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInvalidSharedMemoryId, 479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kResultsOffset, 480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_size); 481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check bad results pointer. 484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kSharedMemoryId, 485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kPnameOffset, 486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kCount, 487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInvalidSharedMemoryOffset, 489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_size); 490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check bad size. 493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kSharedMemoryId, 494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kPnameOffset, 495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kCount, 496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kResultsOffset, 498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_size + 1); 499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); 501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check bad size. 502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kSharedMemoryId, 503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kPnameOffset, 504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kCount, 505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kResultsOffset, 507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_size - 1); 508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); 510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check bad enum. 511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kSharedMemoryId, 512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kPnameOffset, 513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kCount, 514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset + kResultsOffset, 516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result_size); 517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLenum temp = pnames[2]; 518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pnames[2] = GL_TRUE; 519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); 521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pnames[2] = temp; 522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check results area has not been cleared by client. 523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) results[1] = 1; 524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); 525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check buffer is what we expect 526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, results[0]); 527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(1, results[1]); 528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, results[2]); 529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, results[3]); 530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, results[4]); 531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, results[5]); 532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kSentinel, results[num_results]); // End of results 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) { 536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InitState init; 537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "3.0"; 538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InitDecoder(init); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindTexture cmd1; 541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd1.Init(GL_TEXTURE_2D, kInvalidClientId); 542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindBuffer cmd2; 546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd2.Init(GL_ARRAY_BUFFER, kInvalidClientId); 547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); 548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindFramebuffer cmd3; 551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd3.Init(GL_FRAMEBUFFER, kInvalidClientId); 552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd3)); 553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindRenderbuffer cmd4; 556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd4.Init(GL_RENDERBUFFER, kInvalidClientId); 557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd4)); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, EnableFeatureCHROMIUMBadBucket) { 562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const uint32 kBadBucketId = 123; 563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EnableFeatureCHROMIUM cmd; 564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kBadBucketId, shared_memory_id_, shared_memory_offset_); 565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, RequestExtensionCHROMIUMBadBucket) { 569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const uint32 kBadBucketId = 123; 570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RequestExtensionCHROMIUM cmd; 571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kBadBucketId); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, BeginQueryEXTDisabled) { 576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test something fails if off. 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXT) { 580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InitState init; 581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.extensions = "GL_EXT_occlusion_query_boolean"; 582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "opengl es 2.0"; 583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.has_alpha = true; 584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.request_alpha = true; 585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.bind_generates_resource = true; 586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InitDecoder(init); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test end fails if no begin. 589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EndQueryEXT end_cmd; 590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1); 591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BeginQueryEXT begin_cmd; 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test id = 0 fails. 597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) begin_cmd.Init( 598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_ANY_SAMPLES_PASSED_EXT, 0, kSharedMemoryId, kSharedMemoryOffset); 599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenHelper<GenQueriesEXTImmediate>(kNewClientId); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test valid parameters work. 605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, GenQueriesARB(1, _)) 606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(SetArgumentPointee<1>(kNewServiceId)) 607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kNewServiceId)) 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1) 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .RetiresOnSaturation(); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Query object should not be created untill BeginQueriesEXT. 613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueryManager* query_manager = decoder_->GetQueryManager(); 614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(query_manager != NULL); 615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueryManager::Query* query = query_manager->GetQuery(kNewClientId); 616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(query == NULL); 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // BeginQueryEXT should fail if id is not generated from GenQueriesEXT. 619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInvalidClientId, 621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); 624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNewClientId, 628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); 631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 6320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // After BeginQueriesEXT id name should have query object associated with it. 634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) query = query_manager->GetQuery(kNewClientId); 635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(query != NULL); 636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(query->pending()); 6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test trying begin again fails 639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); 640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 6410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test end fails with different target 643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) end_cmd.Init(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, 1); 644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); 645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 6460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test end succeeds 648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT)) 6490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) .Times(1) 6500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) .RetiresOnSaturation(); 651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1); 652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); 6530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(query->pending()); 6550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation(); 6570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 6580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)struct QueryType { 660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLenum type; 661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool is_gl; 662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const QueryType kQueryTypes[] = { 665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) {GL_COMMANDS_ISSUED_CHROMIUM, false}, 666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) {GL_LATENCY_QUERY_CHROMIUM, false}, 667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) {GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, false}, 668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) {GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, false}, 669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) {GL_GET_ERROR_QUERY_CHROMIUM, false}, 670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) {GL_COMMANDS_COMPLETED_CHROMIUM, false}, 671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) {GL_ANY_SAMPLES_PASSED_EXT, true}, 672010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void CheckBeginEndQueryBadMemoryFails(GLES2DecoderTestBase* test, 675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLuint client_id, 676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLuint service_id, 677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const QueryType& query_type, 678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int32 shm_id, 679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) uint32 shm_offset) { 680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // We need to reset the decoder on each iteration, because we lose the 681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // context every time. 682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLES2DecoderTestBase::InitState init; 683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync"; 684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "opengl es 2.0"; 685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.has_alpha = true; 686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.request_alpha = true; 687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.bind_generates_resource = true; 688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test->InitDecoder(init); 689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ::testing::StrictMock< ::gfx::MockGLInterface>* gl = test->GetGLMock(); 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BeginQueryEXT begin_cmd; 692c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test->GenHelper<GenQueriesEXTImmediate>(client_id); 694c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (query_type.is_gl) { 696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl, GenQueriesARB(1, _)) 697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(SetArgumentPointee<1>(service_id)) 698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl, BeginQueryARB(query_type.type, service_id)) 700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1) 701010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 702c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 703c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test bad shared memory fails 705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) begin_cmd.Init(query_type.type, client_id, shm_id, shm_offset); 706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) error::Error error1 = test->ExecuteCmd(begin_cmd); 707c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (query_type.is_gl) { 709010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl, EndQueryARB(query_type.type)) 710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1) 711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 713010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (query_type.type == GL_GET_ERROR_QUERY_CHROMIUM) { 714010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl, GetError()) 715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(GL_NO_ERROR)) 716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef); 719010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { 720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl, Flush()).RetiresOnSaturation(); 721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) 722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(kGlSync)) 723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON 725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*gl, IsSync(kGlSync)) 726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillOnce(Return(GL_TRUE)) 727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .RetiresOnSaturation(); 728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 730c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EndQueryEXT end_cmd; 732010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) end_cmd.Init(query_type.type, 1); 733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) error::Error error2 = test->ExecuteCmd(end_cmd); 734c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (query_type.is_gl) { 736010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL( 737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _)) 741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 742010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 743010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 744010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { 745116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON 746116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*gl, IsSync(kGlSync)) 747116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillOnce(Return(GL_TRUE)) 748116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .RetiresOnSaturation(); 749116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl, ClientWaitSync(kGlSync, _, _)) 751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(GL_ALREADY_SIGNALED)) 752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 754c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueryManager* query_manager = test->GetDecoder()->GetQueryManager(); 756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(query_manager != NULL); 757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool process_success = query_manager->ProcessPendingQueries(); 758c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(error1 != error::kNoError || error2 != error::kNoError || 760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) !process_success); 761c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (query_type.is_gl) { 763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation(); 764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { 766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON 767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*gl, IsSync(kGlSync)) 768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillOnce(Return(GL_TRUE)) 769116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .RetiresOnSaturation(); 770116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); 772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test->ResetDecoder(); 774c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 775c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) { 777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < arraysize(kQueryTypes); ++i) { 778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CheckBeginEndQueryBadMemoryFails(this, 779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNewClientId, 780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNewServiceId, 781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kQueryTypes[i], 782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInvalidSharedMemoryId, 783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryOffsetFails) { 788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < arraysize(kQueryTypes); ++i) { 789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Out-of-bounds. 790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CheckBeginEndQueryBadMemoryFails(this, 791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNewClientId, 792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNewServiceId, 793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kQueryTypes[i], 794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInvalidSharedMemoryOffset); 796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Overflow. 797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CheckBeginEndQueryBadMemoryFails(this, 798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNewClientId, 799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNewServiceId, 800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kQueryTypes[i], 801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0xfffffffcu); 803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, BeginEndQueryEXTCommandsIssuedCHROMIUM) { 807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BeginQueryEXT begin_cmd; 8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 809010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenHelper<GenQueriesEXTImmediate>(kNewClientId); 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 811010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test valid parameters work. 812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) begin_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM, 813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNewClientId, 814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); 817010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueryManager* query_manager = decoder_->GetQueryManager(); 820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(query_manager != NULL); 821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueryManager::Query* query = query_manager->GetQuery(kNewClientId); 822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(query != NULL); 823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(query->pending()); 8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test end succeeds 826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EndQueryEXT end_cmd; 827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) end_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM, 1); 828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); 829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(query->pending()); 8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 833010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, BeginEndQueryEXTGetErrorQueryCHROMIUM) { 834010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BeginQueryEXT begin_cmd; 8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenHelper<GenQueriesEXTImmediate>(kNewClientId); 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 838010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test valid parameters work. 839010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) begin_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM, 840010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNewClientId, 841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); 844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueryManager* query_manager = decoder_->GetQueryManager(); 847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(query_manager != NULL); 848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueryManager::Query* query = query_manager->GetQuery(kNewClientId); 849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(query != NULL); 850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(query->pending()); 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test end succeeds 853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_); 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, GetError()) 856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(GL_INVALID_VALUE)) 857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EndQueryEXT end_cmd; 860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) end_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM, 1); 861010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); 862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(query->pending()); 864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), 865010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<GLenum>(sync->result)); 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) { 869e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitState init; 870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync"; 871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "opengl es 2.0"; 872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.has_alpha = true; 873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.request_alpha = true; 874c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init.bind_generates_resource = true; 875e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitDecoder(init); 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenHelper<GenQueriesEXTImmediate>(kNewClientId); 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BeginQueryEXT begin_cmd; 880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) begin_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM, 881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kNewClientId, 882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); 885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 886c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueryManager* query_manager = decoder_->GetQueryManager(); 888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(query_manager != NULL); 889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QueryManager::Query* query = query_manager->GetQuery(kNewClientId); 890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(query != NULL); 891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(query->pending()); 892c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef); 894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, Flush()).RetiresOnSaturation(); 895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) 896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(kGlSync)) 897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 898116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON 899116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*gl_, IsSync(kGlSync)) 900116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillOnce(Return(GL_TRUE)) 901116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .RetiresOnSaturation(); 902116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 903c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EndQueryEXT end_cmd; 905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) end_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM, 1); 906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); 907c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(GL_NO_ERROR, GetGLError()); 908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(query->pending()); 909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 910116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON 911116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*gl_, IsSync(kGlSync)) 912116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillOnce(Return(GL_TRUE)) 913116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .RetiresOnSaturation(); 914116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _)) 916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(GL_TIMEOUT_EXPIRED)) 917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool process_success = query_manager->ProcessPendingQueries(); 919c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(process_success); 921010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(query->pending()); 922c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON 924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*gl_, IsSync(kGlSync)) 925116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillOnce(Return(GL_TRUE)) 926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .RetiresOnSaturation(); 927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 928010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _)) 929010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(GL_ALREADY_SIGNALED)) 930010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 931010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) process_success = query_manager->ProcessPendingQueries(); 932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(process_success); 934010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE(query->pending()); 935010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_); 936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(0), static_cast<GLenum>(sync->result)); 937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 938116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if DCHECK_IS_ON 939116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*gl_, IsSync(kGlSync)) 940116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillOnce(Return(GL_TRUE)) 941116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .RetiresOnSaturation(); 942116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); 944010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ResetDecoder(); 945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 946c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, IsEnabledReturnsCachedValue) { 948010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // NOTE: There are no expectations because no GL functions should be 949010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // called for DEPTH_TEST or STENCIL_TEST 950010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static const GLenum kStates[] = { 951010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_DEPTH_TEST, GL_STENCIL_TEST, 952010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t ii = 0; ii < arraysize(kStates); ++ii) { 954010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Enable enable_cmd; 955010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLenum state = kStates[ii]; 956010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) enable_cmd.Init(state); 957010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd)); 958010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsEnabled::Result* result = 959010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<IsEnabled::Result*>(shared_memory_address_); 960010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsEnabled is_enabled_cmd; 961010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) is_enabled_cmd.Init(state, shared_memory_id_, shared_memory_offset_); 962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd)); 963010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(0u, *result); 964010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Disable disable_cmd; 965010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) disable_cmd.Init(state); 966010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(disable_cmd)); 967010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd)); 968010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0u, *result); 969010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 970c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 971c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 972010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) { 973c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InitState init; 974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.extensions = "GL_ARB_texture_rectangle"; 975c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch init.gl_version = "3.0"; 976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.bind_generates_resource = true; 977c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InitDecoder(init); 978c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 979010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Texture* texture = GetTexture(client_texture_id_)->texture(); 980010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(texture != NULL); 981010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_UNMANAGED_CHROMIUM); 982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); 984c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 985010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TexParameteri cmd; 986010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(GL_TEXTURE_2D, 987010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_TEXTURE_POOL_CHROMIUM, 988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_TEXTURE_POOL_UNMANAGED_CHROMIUM); 989010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 990010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 991c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(GL_TEXTURE_2D, 993010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_TEXTURE_POOL_CHROMIUM, 994010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_TEXTURE_POOL_MANAGED_CHROMIUM); 995010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 997c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_MANAGED_CHROMIUM); 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1000010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROMIUM, GL_NONE); 1001010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1002010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1005010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 10060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1007010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class SizeOnlyMemoryTracker : public MemoryTracker { 1008010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 1009010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SizeOnlyMemoryTracker() { 1010010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // These are the default textures. 1 for TEXTURE_2D and 6 faces for 1011010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TEXTURE_CUBE_MAP. 1012010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const size_t kInitialUnmanagedPoolSize = 7 * 4; 1013010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const size_t kInitialManagedPoolSize = 0; 1014010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pool_infos_[MemoryTracker::kUnmanaged].initial_size = 1015010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInitialUnmanagedPoolSize; 1016010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pool_infos_[MemoryTracker::kManaged].initial_size = kInitialManagedPoolSize; 1017010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 10180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1019010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Ensure a certain amount of GPU memory is free. Returns true on success. 1020010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MOCK_METHOD1(EnsureGPUMemoryAvailable, bool(size_t size_needed)); 10210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1022010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void TrackMemoryAllocatedChange(size_t old_size, 1023010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t new_size, 1024010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Pool pool) { 1025010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PoolInfo& info = pool_infos_[pool]; 1026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) info.size += new_size - old_size; 1027010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 10280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1029010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t GetPoolSize(Pool pool) { 1030010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const PoolInfo& info = pool_infos_[pool]; 1031010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return info.size - info.initial_size; 1032010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 10330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1034010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 1035010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual ~SizeOnlyMemoryTracker() {} 1036010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) struct PoolInfo { 1037010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) PoolInfo() : initial_size(0), size(0) {} 1038010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t initial_size; 1039010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t size; 1040010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 1041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::map<Pool, PoolInfo> pool_infos_; 1042010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 10430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1044010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // anonymous namespace. 10450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerInitialSize) { 1047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = 1048010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new SizeOnlyMemoryTracker(); 1049010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) set_memory_tracker(memory_tracker.get()); 1050e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitState init; 1051e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch init.gl_version = "3.0"; 1052e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch init.bind_generates_resource = true; 1053e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitDecoder(init); 1054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Expect that initial size - size is 0. 1055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); 1056010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); 10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerTexImage2D) { 1060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = 1061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new SizeOnlyMemoryTracker(); 1062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) set_memory_tracker(memory_tracker.get()); 1063e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitState init; 1064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "3.0"; 1065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.bind_generates_resource = true; 1066e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitDecoder(init); 10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); 1068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) 1069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(true)) 1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoTexImage2D(GL_TEXTURE_2D, 1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_RGBA, 1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 8, 1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4, 1076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 1077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_RGBA, 1078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_BYTE, 1079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 1080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 1081010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); 1082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64)) 1083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(true)) 1084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 1085010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoTexImage2D(GL_TEXTURE_2D, 1086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 1087010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_RGBA, 1088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4, 1089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4, 1090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 1091010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_RGBA, 1092010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_BYTE, 1093010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 1094010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 1095010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); 1096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 1097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check we get out of memory and no call to glTexImage2D if Ensure fails. 1098010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64)) 1099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(false)) 1100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 1101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TexImage2D cmd; 1102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(GL_TEXTURE_2D, 1103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 1104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_RGBA, 1105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4, 1106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4, 1107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_RGBA, 1108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_UNSIGNED_BYTE, 1109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryId, 1110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kSharedMemoryOffset); 1111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); 1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); 11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) { 1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = 1118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new SizeOnlyMemoryTracker(); 1119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) set_memory_tracker(memory_tracker.get()); 1120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitState init; 1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "3.0"; 1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.bind_generates_resource = true; 1123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitDecoder(init); 1124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); 1125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check we get out of memory and no call to glTexStorage2DEXT 1126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // if Ensure fails. 1127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) 1128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(false)) 1129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .RetiresOnSaturation(); 1130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TexStorage2DEXT cmd; 1131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 4); 1132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); 1134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); 1135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) { 1138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLenum target = GL_TEXTURE_2D; 1139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLint level = 0; 1140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLenum internal_format = GL_RGBA; 1141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLsizei width = 4; 1142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLsizei height = 8; 1143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLint border = 0; 1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = 1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new SizeOnlyMemoryTracker(); 1146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) set_memory_tracker(memory_tracker.get()); 1147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitState init; 1148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "3.0"; 1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.has_alpha = true; 1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.request_alpha = true; 1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.bind_generates_resource = true; 1152e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitDecoder(init); 1153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); 1154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) 1155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(true)) 1156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 1157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, GetError()) 1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(GL_NO_ERROR)) 1159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(GL_NO_ERROR)) 1160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 1161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, 1162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CopyTexImage2D( 1163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) target, level, internal_format, 0, 0, width, height, border)) 1164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .Times(1) 1165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) .RetiresOnSaturation(); 1166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CopyTexImage2D cmd; 1167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmd.Init(target, level, internal_format, 0, 0, width, height); 1168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); 1170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 1171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check we get out of memory and no call to glCopyTexImage2D if Ensure fails. 1172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) 1173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(false)) 1174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 1175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); 1177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); 1178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) { 1181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = 1182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new SizeOnlyMemoryTracker(); 1183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) set_memory_tracker(memory_tracker.get()); 1184e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitState init; 1185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "3.0"; 1186e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch init.bind_generates_resource = true; 1187e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitDecoder(init); 1188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoBindRenderbuffer( 1189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); 1190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EnsureRenderbufferBound(false); 1191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_CALL(*gl_, GetError()) 1192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .WillOnce(Return(GL_NO_ERROR)) 1193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .WillOnce(Return(GL_NO_ERROR)) 1194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .RetiresOnSaturation(); 1195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) 1196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(true)) 1197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .RetiresOnSaturation(); 1198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, RenderbufferStorageEXT(GL_RENDERBUFFER, GL_RGBA, 8, 4)) 1199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .Times(1) 1200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .RetiresOnSaturation(); 1201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RenderbufferStorage cmd; 1202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 8, 4); 1203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(GL_NO_ERROR, GetGLError()); 1205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); 1206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check we get out of memory and no call to glRenderbufferStorage if Ensure 1207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // fails. 1208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) 1209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(false)) 1210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .RetiresOnSaturation(); 1211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); 1213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); 1214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, MemoryTrackerBufferData) { 1217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = 1218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new SizeOnlyMemoryTracker(); 1219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) set_memory_tracker(memory_tracker.get()); 1220e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitState init; 1221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "3.0"; 1222e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch init.bind_generates_resource = true; 1223e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch InitDecoder(init); 1224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); 1225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_CALL(*gl_, GetError()) 1226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .WillOnce(Return(GL_NO_ERROR)) 1227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .WillOnce(Return(GL_NO_ERROR)) 1228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .RetiresOnSaturation(); 1229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) 1230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(true)) 1231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .RetiresOnSaturation(); 1232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER, 128, _, GL_STREAM_DRAW)) 1233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1) 1234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .RetiresOnSaturation(); 1235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BufferData cmd; 1236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(GL_ARRAY_BUFFER, 128, 0, 0, GL_STREAM_DRAW); 1237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(GL_NO_ERROR, GetGLError()); 1239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); 1240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check we get out of memory and no call to glBufferData if Ensure 1241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // fails. 1242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) 1243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(false)) 1244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .RetiresOnSaturation(); 1245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); 1247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); 1248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, ImmutableCopyTexImage2D) { 1251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLenum kTarget = GL_TEXTURE_2D; 1252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLint kLevel = 0; 1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLenum kInternalFormat = GL_RGBA; 1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLenum kSizedInternalFormat = GL_RGBA8; 1255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLsizei kWidth = 4; 1256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLsizei kHeight = 8; 1257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GLint kBorder = 0; 1258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitState init; 1259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) init.extensions = "GL_EXT_texture_storage"; 1260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) init.gl_version = "3.0"; 1261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) init.has_alpha = true; 1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) init.request_alpha = true; 1263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) init.bind_generates_resource = true; 1264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InitDecoder(init); 1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); 1266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // CopyTexImage2D will call arbitrary amount of GetErrors. 1268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_CALL(*gl_, GetError()) 1269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) .Times(AtLeast(1)); 1270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_CALL(*gl_, 1272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyTexImage2D( 1273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight, 1274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kBorder)) 1275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) .Times(1); 1276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_CALL(*gl_, 1278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TexStorage2DEXT( 1279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kTarget, kLevel, kSizedInternalFormat, kWidth, kHeight)) 1280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) .Times(1); 1281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CopyTexImage2D copy_cmd; 1282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) copy_cmd.Init(kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight); 1283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd)); 1284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 1285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TexStorage2DEXT storage_cmd; 1287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) storage_cmd.Init(kTarget, kLevel, kSizedInternalFormat, kWidth, kHeight); 1288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(storage_cmd)); 1289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 1290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This should not invoke CopyTexImage2D. 1292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) copy_cmd.Init(kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight); 1293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd)); 1294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 1295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(GLES2DecoderTest, LoseContextCHROMIUMValidArgs) { 1298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_CALL(*mock_decoder_, LoseContext(GL_GUILTY_CONTEXT_RESET_ARB)) 1299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) .Times(1); 1300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmds::LoseContextCHROMIUM cmd; 1301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_GUILTY_CONTEXT_RESET_ARB); 1302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(error::kLostContext, ExecuteCmd(cmd)); 1303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 1304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(GLES2DecoderTest, LoseContextCHROMIUMInvalidArgs0_0) { 1307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_CALL(*mock_decoder_, LoseContext(_)) 1308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) .Times(0); 1309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmds::LoseContextCHROMIUM cmd; 1310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmd.Init(GL_NONE, GL_GUILTY_CONTEXT_RESET_ARB); 1311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); 1313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(GLES2DecoderTest, LoseContextCHROMIUMInvalidArgs1_0) { 1316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_CALL(*mock_decoder_, LoseContext(_)) 1317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) .Times(0); 1318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmds::LoseContextCHROMIUM cmd; 1319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_NONE); 1320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 1321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); 1322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 13241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass GLES2DecoderDoCommandsTest : public GLES2DecoderTest { 13251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 13261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GLES2DecoderDoCommandsTest() { 13271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (int i = 0; i < 3; i++) { 13281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cmds_[i].Init(GL_BLEND); 13291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 13301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci entries_per_cmd_ = ComputeNumEntries(cmds_[0].ComputeSize()); 13311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 13321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetExpectationsForNCommands(int num_commands) { 13341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (int i = 0; i < num_commands; i++) 13351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetupExpectationsForEnableDisable(GL_BLEND, true); 13361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 13371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 13391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Enable cmds_[3]; 13401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int entries_per_cmd_; 13411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 13421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that processing with 0 entries does nothing. 13441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsOneOfZero) { 13451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int num_processed = -1; 13461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetExpectationsForNCommands(0); 13471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ( 13481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error::kNoError, 13491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoder_->DoCommands(1, &cmds_, entries_per_cmd_ * 0, &num_processed)); 13501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(GL_NO_ERROR, GetGLError()); 13511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, num_processed); 13521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test processing at granularity of single commands. 13551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsOneOfOne) { 13561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int num_processed = -1; 13571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetExpectationsForNCommands(1); 13581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ( 13591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error::kNoError, 13601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoder_->DoCommands(1, &cmds_, entries_per_cmd_ * 1, &num_processed)); 13611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(GL_NO_ERROR, GetGLError()); 13621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(entries_per_cmd_, num_processed); 13631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test processing at granularity of multiple commands. 13661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsThreeOfThree) { 13671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int num_processed = -1; 13681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetExpectationsForNCommands(3); 13691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ( 13701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error::kNoError, 13711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoder_->DoCommands(3, &cmds_, entries_per_cmd_ * 3, &num_processed)); 13721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(GL_NO_ERROR, GetGLError()); 13731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(entries_per_cmd_ * 3, num_processed); 13741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test processing a request smaller than available entries. 13771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsTwoOfThree) { 13781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int num_processed = -1; 13791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetExpectationsForNCommands(2); 13801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ( 13811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error::kNoError, 13821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoder_->DoCommands(2, &cmds_, entries_per_cmd_ * 3, &num_processed)); 13831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(GL_NO_ERROR, GetGLError()); 13841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(entries_per_cmd_ * 2, num_processed); 13851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that processing stops on a command with size 0. 13881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsZeroCmdSize) { 13891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cmds_[1].header.size = 0; 13901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int num_processed = -1; 13911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetExpectationsForNCommands(1); 13921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ( 13931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci error::kInvalidSize, 13941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoder_->DoCommands(2, &cmds_, entries_per_cmd_ * 2, &num_processed)); 13951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(GL_NO_ERROR, GetGLError()); 13961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(entries_per_cmd_, num_processed); 13971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 13981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 13991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that processing stops on a command with size greater than available. 14001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsOutOfBounds) { 14011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int num_processed = -1; 14021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetExpectationsForNCommands(1); 14031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(error::kOutOfBounds, 14041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoder_->DoCommands( 14051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2, &cmds_, entries_per_cmd_ * 2 - 1, &num_processed)); 14061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(GL_NO_ERROR, GetGLError()); 14071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(entries_per_cmd_, num_processed); 14081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that commands with bad argument size are skipped without processing. 14111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_P(GLES2DecoderDoCommandsTest, DoCommandsBadArgSize) { 14121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cmds_[1].header.size += 1; 14131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int num_processed = -1; 14141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetExpectationsForNCommands(1); 14151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(error::kInvalidArguments, 14161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoder_->DoCommands( 14171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2, &cmds_, entries_per_cmd_ * 2 + 1, &num_processed)); 14181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(GL_NO_ERROR, GetGLError()); 14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(entries_per_cmd_ + cmds_[1].header.size, num_processed); 14201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 14211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderTest, ::testing::Bool()); 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderWithShaderTest, ::testing::Bool()); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderManualInitTest, ::testing::Bool()); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service, 1429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLES2DecoderRGBBackbufferTest, 1430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ::testing::Bool()); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciINSTANTIATE_TEST_CASE_P(Service, GLES2DecoderDoCommandsTest, ::testing::Bool()); 14331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 1436