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