1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/command_line.h" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/common/id_allocator.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/cmd_buffer_engine.h" 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/context_group.h" 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/context_state.h" 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/gl_surface_mock.h" 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/gpu_switches.h" 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/image_manager.h" 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/mailbox_manager.h" 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/mocks.h" 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/program_manager.h" 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h" 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/gl/gl_implementation.h" 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/gl/gl_mock.h" 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/gl/gl_surface_stub.h" 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(GL_DEPTH24_STENCIL8) 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define GL_DEPTH24_STENCIL8 0x88F0 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::gfx::MockGLInterface; 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::_; 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::DoAll; 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::InSequence; 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::Invoke; 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::MatcherCast; 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::Mock; 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::Pointee; 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::Return; 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::SaveArg; 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::SetArrayArgument; 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::SetArgumentPointee; 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::SetArgPointee; 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::StrEq; 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::StrictMock; 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace gpu { 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace gles2 { 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using namespace cmds; 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderWithShaderTest, GetVertexAttribPointervSucceeds) { 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const float dummy = 0; 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kOffsetToTestFor = sizeof(dummy) * 4; 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kIndexToTest = 1; 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetVertexAttribPointerv::Result* result = 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<GetVertexAttribPointerv::Result*>(shared_memory_address_); 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result->size = 0; 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint* result_value = result->GetData(); 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test that initial value is 0. 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetVertexAttribPointerv cmd; 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kIndexToTest, 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_VERTEX_ATTRIB_ARRAY_POINTER, 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) shared_memory_id_, 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) shared_memory_offset_); 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(sizeof(*result_value), result->size); 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0u, *result_value); 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Set the value and see that we get it. 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetupVertexBuffer(); 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoVertexAttribPointer(kIndexToTest, 2, GL_FLOAT, 0, kOffsetToTestFor); 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result->size = 0; 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(sizeof(*result_value), result->size); 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kOffsetToTestFor, *result_value); 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderWithShaderTest, GetVertexAttribPointervBadArgsFails) { 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint kIndexToTest = 1; 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetVertexAttribPointerv::Result* result = 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<GetVertexAttribPointerv::Result*>(shared_memory_address_); 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result->size = 0; 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const GLuint* result_value = result->GetData(); 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test pname invalid fails. 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetVertexAttribPointerv cmd; 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kIndexToTest, 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_VERTEX_ATTRIB_ARRAY_POINTER + 1, 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) shared_memory_id_, 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) shared_memory_offset_); 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0u, result->size); 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kInitialResult, *result_value); 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test index out of range fails. 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result->size = 0; 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNumVertexAttribs, 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_VERTEX_ATTRIB_ARRAY_POINTER, 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) shared_memory_id_, 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) shared_memory_offset_); 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0u, result->size); 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(kInitialResult, *result_value); 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test memory id bad fails. 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kIndexToTest, 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_VERTEX_ATTRIB_ARRAY_POINTER, 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInvalidSharedMemoryId, 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) shared_memory_offset_); 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Test memory offset bad fails. 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kIndexToTest, 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_VERTEX_ATTRIB_ARRAY_POINTER, 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) shared_memory_id_, 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kInvalidSharedMemoryOffset); 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderWithShaderTest, BindBufferToDifferentTargetFails) { 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Bind the buffer to GL_ARRAY_BUFFER 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Attempt to rebind to GL_ELEMENT_ARRAY_BUFFER 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // NOTE: Real GLES2 does not have this restriction but WebGL and we do. 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // This can be restriction can be removed at runtime. 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, BindBuffer(_, _)).Times(0); 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindBuffer cmd; 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(GL_ELEMENT_ARRAY_BUFFER, client_buffer_id_); 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderWithShaderTest, VertexAttribPointer) { 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetupVertexBuffer(); 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static const GLenum types[] = { 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GL_FLOAT, GL_FIXED, GL_INT, GL_UNSIGNED_INT, 147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static const GLsizei sizes[] = { 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1, 1, 2, 2, 4, 4, 4, 4, 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static const GLuint indices[] = { 152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 1, kNumVertexAttribs - 1, kNumVertexAttribs, 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static const GLsizei offset_mult[] = { 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 0, 1, 1, 2, 1000, 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static const GLsizei offset_offset[] = { 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 1, 0, 1, 0, 0, 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static const GLsizei stride_mult[] = { 161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) -1, 0, 0, 1, 1, 2, 1000, 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static const GLsizei stride_offset[] = { 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 0, 0, 1, 0, 1, 0, 0, 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t tt = 0; tt < arraysize(types); ++tt) { 167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLenum type = types[tt]; 168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLsizei num_bytes = sizes[tt]; 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t ii = 0; ii < arraysize(indices); ++ii) { 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLuint index = indices[ii]; 171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (GLint size = 0; size < 5; ++size) { 172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t oo = 0; oo < arraysize(offset_mult); ++oo) { 173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLuint offset = num_bytes * offset_mult[oo] + offset_offset[oo]; 174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t ss = 0; ss < arraysize(stride_mult); ++ss) { 175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLsizei stride = num_bytes * stride_mult[ss] + stride_offset[ss]; 176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (int normalize = 0; normalize < 2; ++normalize) { 177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool index_good = index < static_cast<GLuint>(kNumVertexAttribs); 178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool size_good = (size > 0 && size < 5); 179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool offset_good = (offset % num_bytes == 0); 180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool stride_good = 181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) (stride % num_bytes == 0) && stride >= 0 && stride <= 255; 182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool type_good = (type != GL_INT && type != GL_UNSIGNED_INT && 183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type != GL_FIXED); 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool good = size_good && offset_good && stride_good && 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type_good && index_good; 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool call = good && (type != GL_FIXED); 187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (call) { 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VertexAttribPointer(index, 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size, 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type, 192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) normalize, 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) stride, 194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BufferOffset(offset))); 195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VertexAttribPointer cmd; 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(index, size, type, normalize, stride, offset); 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (good) { 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (size_good && offset_good && stride_good && type_good && 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) !index_good) { 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (size_good && offset_good && stride_good && 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) !type_good && index_good) { 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (size_good && offset_good && !stride_good && 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type_good && index_good) { 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (stride < 0 || stride > 255) { 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (size_good && !offset_good && stride_good && 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type_good && index_good) { 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (!size_good && offset_good && stride_good && 218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) type_good && index_good) { 219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); 220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_NE(GL_NO_ERROR, GetGLError()); 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class GLES2DecoderVertexArraysOESTest : public GLES2DecoderWithShaderTest { 232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLES2DecoderVertexArraysOESTest() {} 234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool vertex_array_deleted_manually_; 236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetUp() { 238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InitState init; 239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "opengl es 2.0"; 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.bind_generates_resource = true; 241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InitDecoder(init); 242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetupDefaultProgram(); 243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddExpectationsForGenVertexArraysOES(); 245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenHelper<GenVertexArraysOESImmediate>(client_vertexarray_id_); 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) vertex_array_deleted_manually_ = false; 248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void TearDown() { 251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // This should only be set if the test handled deletion of the vertex array 252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // itself. Necessary because vertex_array_objects are not sharable, and thus 253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // not managed in the ContextGroup, meaning they will be destroyed during 254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // test tear down 255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!vertex_array_deleted_manually_) { 256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddExpectationsForDeleteVertexArraysOES(); 257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLES2DecoderWithShaderTest::TearDown(); 260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void GenVertexArraysOESImmediateValidArgs() { 263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddExpectationsForGenVertexArraysOES(); 264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenVertexArraysOESImmediate* cmd = 265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetImmediateAs<GenVertexArraysOESImmediate>(); 266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLuint temp = kNewClientId; 267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd->Init(1, &temp); 268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(*cmd, sizeof(temp))); 269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(GetVertexArrayInfo(kNewClientId) != NULL); 271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddExpectationsForDeleteVertexArraysOES(); 272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void GenVertexArraysOESImmediateInvalidArgs() { 275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, GenVertexArraysOES(_, _)).Times(0); 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenVertexArraysOESImmediate* cmd = 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetImmediateAs<GenVertexArraysOESImmediate>(); 278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd->Init(1, &client_vertexarray_id_); 279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kInvalidArguments, 280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ExecuteImmediateCmd(*cmd, sizeof(&client_vertexarray_id_))); 281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void DeleteVertexArraysOESImmediateValidArgs() { 284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddExpectationsForDeleteVertexArraysOES(); 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediate& cmd = 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *GetImmediateAs<DeleteVertexArraysOESImmediate>(); 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(1, &client_vertexarray_id_); 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ExecuteImmediateCmd(cmd, sizeof(client_vertexarray_id_))); 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(GetVertexArrayInfo(client_vertexarray_id_) == NULL); 292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) vertex_array_deleted_manually_ = true; 293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void DeleteVertexArraysOESImmediateInvalidArgs() { 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediate& cmd = 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *GetImmediateAs<DeleteVertexArraysOESImmediate>(); 298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLuint temp = kInvalidClientId; 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(1, &temp); 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void DeleteBoundVertexArraysOESImmediateValidArgs() { 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindVertexArrayOESValidArgs(); 305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddExpectationsForDeleteBoundVertexArraysOES(); 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediate& cmd = 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *GetImmediateAs<DeleteVertexArraysOESImmediate>(); 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(1, &client_vertexarray_id_); 310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, 311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ExecuteImmediateCmd(cmd, sizeof(client_vertexarray_id_))); 312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE(GetVertexArrayInfo(client_vertexarray_id_) == NULL); 314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) vertex_array_deleted_manually_ = true; 315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void IsVertexArrayOESValidArgs() { 318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsVertexArrayOES cmd; 319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(client_vertexarray_id_, shared_memory_id_, shared_memory_offset_); 320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void IsVertexArrayOESInvalidArgsBadSharedMemoryId() { 325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsVertexArrayOES cmd; 326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init( 327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) client_vertexarray_id_, kInvalidSharedMemoryId, shared_memory_offset_); 328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); 329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init( 330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) client_vertexarray_id_, shared_memory_id_, kInvalidSharedMemoryOffset); 331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); 332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void BindVertexArrayOESValidArgs() { 335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddExpectationsForBindVertexArrayOES(); 336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindVertexArrayOES cmd; 337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(client_vertexarray_id_); 338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_NO_ERROR, GetGLError()); 340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void BindVertexArrayOESValidArgsNewId() { 343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindVertexArrayOES cmd; 344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(kNewClientId); 345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); 347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service, 351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLES2DecoderVertexArraysOESTest, 352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ::testing::Bool()); 353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class GLES2DecoderEmulatedVertexArraysOESTest 355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : public GLES2DecoderVertexArraysOESTest { 356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLES2DecoderEmulatedVertexArraysOESTest() {} 358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetUp() { 360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InitState init; 361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.gl_version = "3.0"; 362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) init.bind_generates_resource = true; 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) init.use_native_vao = false; 364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) InitDecoder(init); 365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SetupDefaultProgram(); 366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AddExpectationsForGenVertexArraysOES(); 368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenHelper<GenVertexArraysOESImmediate>(client_vertexarray_id_); 369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) vertex_array_deleted_manually_ = false; 371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service, 375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLES2DecoderEmulatedVertexArraysOESTest, 376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ::testing::Bool()); 377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test vertex array objects with native support 379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESImmediateValidArgs) { 380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenVertexArraysOESImmediateValidArgs(); 381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, 383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenVertexArraysOESImmediateValidArgs) { 384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenVertexArraysOESImmediateValidArgs(); 385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderVertexArraysOESTest, 388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenVertexArraysOESImmediateInvalidArgs) { 389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenVertexArraysOESImmediateInvalidArgs(); 390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, 392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenVertexArraysOESImmediateInvalidArgs) { 393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GenVertexArraysOESImmediateInvalidArgs(); 394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderVertexArraysOESTest, 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediateValidArgs) { 398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediateValidArgs(); 399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, 401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediateValidArgs) { 402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediateValidArgs(); 403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderVertexArraysOESTest, 406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediateInvalidArgs) { 407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediateInvalidArgs(); 408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, 410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediateInvalidArgs) { 411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteVertexArraysOESImmediateInvalidArgs(); 412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderVertexArraysOESTest, 415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteBoundVertexArraysOESImmediateValidArgs) { 416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteBoundVertexArraysOESImmediateValidArgs(); 417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, 419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteBoundVertexArraysOESImmediateValidArgs) { 420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeleteBoundVertexArraysOESImmediateValidArgs(); 421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderVertexArraysOESTest, IsVertexArrayOESValidArgs) { 424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsVertexArrayOESValidArgs(); 425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, IsVertexArrayOESValidArgs) { 427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsVertexArrayOESValidArgs(); 428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderVertexArraysOESTest, 431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsVertexArrayOESInvalidArgsBadSharedMemoryId) { 432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsVertexArrayOESInvalidArgsBadSharedMemoryId(); 433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, 435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsVertexArrayOESInvalidArgsBadSharedMemoryId) { 436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) IsVertexArrayOESInvalidArgsBadSharedMemoryId(); 437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderVertexArraysOESTest, BindVertexArrayOESValidArgs) { 440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindVertexArrayOESValidArgs(); 441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, BindVertexArrayOESValidArgs) { 443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindVertexArrayOESValidArgs(); 444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderVertexArraysOESTest, BindVertexArrayOESValidArgsNewId) { 447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindVertexArrayOESValidArgsNewId(); 448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, 450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindVertexArrayOESValidArgsNewId) { 451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BindVertexArrayOESValidArgsNewId(); 452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, BufferDataGLError) { 455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLenum target = GL_ARRAY_BUFFER; 456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLsizeiptr size = 4; 457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); 458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BufferManager* manager = group().buffer_manager(); 459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Buffer* buffer = manager->GetBuffer(client_buffer_id_); 460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_TRUE(buffer != NULL); 461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, buffer->size()); 462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, GetError()) 463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(GL_NO_ERROR)) 464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .WillOnce(Return(GL_OUT_OF_MEMORY)) 465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*gl_, BufferData(target, size, _, GL_STREAM_DRAW)) 467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .Times(1) 468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) .RetiresOnSaturation(); 469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BufferData cmd; 470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cmd.Init(target, size, 0, 0, GL_STREAM_DRAW); 471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); 473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_EQ(0, buffer->size()); 474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): BufferData 477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): BufferDataImmediate 479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): BufferSubData 481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): BufferSubDataImmediate 483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace gles2 485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace gpu 486