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(GLES2DecoderTest, GenerateMipmapWrongFormatsFails) {
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0);
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenerateMipmap cmd;
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D);
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, GenerateMipmapHandlesOutOfMemory) {
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureManager* manager = group().texture_manager();
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint width = 0;
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint height = 0;
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height));
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               16,
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               16,
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryId,
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryOffset);
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)).Times(1);
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_OUT_OF_MEMORY))
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenerateMipmap cmd;
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D);
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height));
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, GenerateMipmapClearsUnclearedTexture) {
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0);
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupClearTextureExpectations(kServiceTextureId,
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                kServiceTextureId,
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                0,
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_UNSIGNED_BYTE,
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                2,
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                2);
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D));
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenerateMipmap cmd;
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D);
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Same as GenerateMipmapClearsUnclearedTexture, but with workaround
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// |set_texture_filters_before_generating_mipmap|.
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, SetTextureFiltersBeforeGenerateMipmap) {
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CommandLine command_line(0, NULL);
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  command_line.AppendSwitchASCII(
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      switches::kGpuDriverBugWorkarounds,
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::IntToString(gpu::SET_TEXTURE_FILTER_BEFORE_GENERATING_MIPMAP));
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoderWithCommandLine(init, &command_line);
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0);
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupClearTextureExpectations(kServiceTextureId,
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                kServiceTextureId,
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                0,
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_UNSIGNED_BYTE,
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                2,
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                2);
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      *gl_,
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      TexParameteri(
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST))
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D));
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      *gl_,
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      TexParameteri(
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR))
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenerateMipmap cmd;
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D);
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, ActiveTextureValidArgs) {
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1));
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SpecializedSetup<ActiveTexture, 0>(true);
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ActiveTexture cmd;
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE1);
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, ActiveTextureInvalidArgs) {
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(_)).Times(0);
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SpecializedSetup<ActiveTexture, 0>(false);
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ActiveTexture cmd;
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE0 - 1);
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(kNumTextureUnits);
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, TexSubImage2DValidArgs) {
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kWidth = 16;
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kHeight = 8;
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kWidth,
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kHeight,
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryId,
208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryOffset);
209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexSubImage2D(GL_TEXTURE_2D,
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            kWidth - 1,
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            kHeight,
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_RGBA,
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_UNSIGNED_BYTE,
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            shared_memory_address_))
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D cmd;
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth - 1,
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, TexSubImage2DBadArgs) {
238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kWidth = 16;
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kHeight = 8;
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kWidth,
245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kHeight,
246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0);
251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D cmd;
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE0,
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_TRUE,
272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_INT,
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           -1,
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           -1,
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth + 1,
348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight + 1,
362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGB,
376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT_4_4_4_4,
390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kInvalidSharedMemoryId,
404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kInvalidSharedMemoryOffset,
417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, CopyTexSubImage2DValidArgs) {
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kWidth = 16;
423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kHeight = 8;
424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kWidth,
429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kHeight,
430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryId,
434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryOffset);
435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              CopyTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight))
437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CopyTexSubImage2D cmd;
440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight);
441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, CopyTexSubImage2DBadArgs) {
446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kWidth = 16;
447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kHeight = 8;
448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kWidth,
453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kHeight,
454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0);
459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CopyTexSubImage2D cmd;
460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE0, 1, 0, 0, 0, 0, kWidth, kHeight);
461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 1, -1, 0, 0, 0, kWidth, kHeight);
464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 1, 1, 0, 0, 0, kWidth, kHeight);
467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 1, 0, -1, 0, 0, kWidth, kHeight);
470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 1, 0, 1, 0, 0, kWidth, kHeight);
473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth + 1, kHeight);
476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight + 1);
479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, TexImage2DRedefinitionSucceeds) {
484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kWidth = 16;
485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kHeight = 8;
486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError()).WillRepeatedly(Return(GL_NO_ERROR));
488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (int ii = 0; ii < 2; ++ii) {
489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TexImage2D cmd;
490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (ii == 0) {
491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      EXPECT_CALL(*gl_,
492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  TexImage2D(GL_TEXTURE_2D,
493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             0,
494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             GL_RGBA,
495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             kWidth,
496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             kHeight,
497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             0,
498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             GL_RGBA,
499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             GL_UNSIGNED_BYTE,
500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             _))
501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          .Times(1)
502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          .RetiresOnSaturation();
503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cmd.Init(GL_TEXTURE_2D,
504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kWidth,
507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kHeight,
508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryId,
511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryOffset);
512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    } else {
513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      SetupClearTextureExpectations(kServiceTextureId,
514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    kServiceTextureId,
515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_TEXTURE_2D,
516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_TEXTURE_2D,
517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_RGBA,
519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_RGBA,
520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_UNSIGNED_BYTE,
521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    kWidth,
522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    kHeight);
523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cmd.Init(GL_TEXTURE_2D,
524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kWidth,
527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kHeight,
528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0);
532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_,
535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                TexSubImage2D(GL_TEXTURE_2D,
536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              0,
537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              0,
538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              0,
539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              kWidth,
540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              kHeight - 1,
541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              GL_RGBA,
542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              GL_UNSIGNED_BYTE,
543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              shared_memory_address_))
544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1)
545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Consider this TexSubImage2D command part of the previous TexImage2D
547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // (last GL_TRUE argument). It will be skipped if there are bugs in the
548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // redefinition case.
549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TexSubImage2D cmd2;
550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd2.Init(GL_TEXTURE_2D,
551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              0,
552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              0,
553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              0,
554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              kWidth,
555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              kHeight - 1,
556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              GL_RGBA,
557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              GL_UNSIGNED_BYTE,
558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              kSharedMemoryId,
559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              kSharedMemoryOffset,
560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              GL_TRUE);
561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, TexImage2DGLError) {
566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum target = GL_TEXTURE_2D;
567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint level = 0;
568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum internal_format = GL_RGBA;
569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei width = 2;
570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei height = 4;
571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint border = 0;
572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum format = GL_RGBA;
573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum type = GL_UNSIGNED_BYTE;
574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureManager* manager = group().texture_manager();
576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_OUT_OF_MEMORY))
583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexImage2D(target,
586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         level,
587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         internal_format,
588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         width,
589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         height,
590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         border,
591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         format,
592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         type,
593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         _))
594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexImage2D cmd;
597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(target,
598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           level,
599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           internal_format,
600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           width,
601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           height,
602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           format,
603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           type,
604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, CopyTexImage2DGLError) {
612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum target = GL_TEXTURE_2D;
613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint level = 0;
614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum internal_format = GL_RGBA;
615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei width = 2;
616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei height = 4;
617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint border = 0;
618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureManager* manager = group().texture_manager();
620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_OUT_OF_MEMORY))
627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              CopyTexImage2D(
630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  target, level, internal_format, 0, 0, width, height, border))
631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CopyTexImage2D cmd;
634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(target, level, internal_format, 0, 0, width, height);
635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
637010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, CompressedTexImage2DBucketBadBucket) {
641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_EXT_texture_compression_s3tc";
643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
646010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const uint32 kBadBucketId = 123;
648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CompressedTexImage2DBucket cmd;
650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           4,
654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           4,
655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kBadBucketId);
656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CompressedTexSubImage2DBucket cmd2;
658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd2.Init(GL_TEXTURE_2D,
659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            0,
660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            0,
661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            0,
662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            4,
663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            4,
664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            kBadBucketId);
666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace {
670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)struct S3TCTestData {
672010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum format;
673010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  size_t block_size;
674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // anonymous namespace.
677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, CompressedTexImage2DS3TC) {
679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_EXT_texture_compression_s3tc";
681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const uint32 kBucketId = 123;
685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId);
686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(bucket != NULL);
687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static const S3TCTestData test_data[] = {
691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8,
693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8,
696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 16,
699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
701010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 16,
702010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
703010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t ii = 0; ii < arraysize(test_data); ++ii) {
706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const S3TCTestData& test = test_data[ii];
707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CompressedTexImage2DBucket cmd;
708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // test small width.
709010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DoCompressedTexImage2D(
710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        GL_TEXTURE_2D, 0, test.format, 2, 4, 0, test.block_size, kBucketId);
711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
713010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // test bad width.
714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cmd.Init(GL_TEXTURE_2D, 0, test.format, 5, 4, kBucketId);
715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bucket->SetSize(test.block_size * 2);
716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
719010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // test small height.
720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DoCompressedTexImage2D(
721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        GL_TEXTURE_2D, 0, test.format, 4, 2, 0, test.block_size, kBucketId);
722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // test too bad height.
725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cmd.Init(GL_TEXTURE_2D, 0, test.format, 4, 5, kBucketId);
726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bucket->SetSize(test.block_size * 2);
727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
730010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // test small for level 0.
731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DoCompressedTexImage2D(
732010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        GL_TEXTURE_2D, 0, test.format, 1, 1, 0, test.block_size, kBucketId);
733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
734010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // test small for level 0.
736010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DoCompressedTexImage2D(
737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        GL_TEXTURE_2D, 0, test.format, 2, 2, 0, test.block_size, kBucketId);
738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // test size too large.
741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cmd.Init(GL_TEXTURE_2D, 0, test.format, 4, 4, kBucketId);
742010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bucket->SetSize(test.block_size * 2);
743010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
744010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
745010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
746010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // test size too small.
747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cmd.Init(GL_TEXTURE_2D, 0, test.format, 4, 4, kBucketId);
748010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bucket->SetSize(test.block_size / 2);
749010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // test with 3 mips.
753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DoCompressedTexImage2D(
754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        GL_TEXTURE_2D, 0, test.format, 4, 4, 0, test.block_size, kBucketId);
755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DoCompressedTexImage2D(
756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        GL_TEXTURE_2D, 1, test.format, 2, 2, 0, test.block_size, kBucketId);
757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DoCompressedTexImage2D(
758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        GL_TEXTURE_2D, 2, test.format, 1, 1, 0, test.block_size, kBucketId);
759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Test a 16x16
762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DoCompressedTexImage2D(GL_TEXTURE_2D,
763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           0,
764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           test.format,
765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           16,
766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           16,
767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           0,
768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           test.block_size * 4 * 4,
769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           kBucketId);
770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CompressedTexSubImage2DBucket sub_cmd;
773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bucket->SetSize(test.block_size);
774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Test sub image bad xoffset
775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    sub_cmd.Init(GL_TEXTURE_2D, 0, 1, 0, 4, 4, test.format, kBucketId);
776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Test sub image bad yoffset
780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 2, 4, 4, test.format, kBucketId);
781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Test sub image bad width
785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bucket->SetSize(test.block_size * 2);
786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 5, 4, test.format, kBucketId);
787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Test sub image bad height
791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 5, test.format, kBucketId);
792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Test sub image bad size
796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bucket->SetSize(test.block_size + 1);
797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, test.format, kBucketId);
798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (GLint yoffset = 0; yoffset <= 8; yoffset += 4) {
802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      for (GLint xoffset = 0; xoffset <= 8; xoffset += 4) {
803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        for (GLsizei height = 4; height <= 8; height += 4) {
804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          for (GLsizei width = 4; width <= 8; width += 4) {
805010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            GLsizei size = test.block_size * (width / 4) * (height / 4);
806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            bucket->SetSize(size);
807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            EXPECT_CALL(*gl_,
808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        CompressedTexSubImage2D(GL_TEXTURE_2D,
809010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                0,
810010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                xoffset,
811010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                yoffset,
812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                width,
813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                height,
814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                test.format,
815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                size,
816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                _))
817010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                .Times(1)
818010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                .RetiresOnSaturation();
819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            sub_cmd.Init(GL_TEXTURE_2D,
820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         0,
821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         xoffset,
822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         yoffset,
823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         width,
824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         height,
825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         test.format,
826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         kBucketId);
827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            EXPECT_EQ(GL_NO_ERROR, GetGLError());
829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          }
830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        }
831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
832010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
833010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
834010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
835010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, CompressedTexImage2DETC1) {
837010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
838010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_compressed_ETC1_RGB8_texture";
839010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
840010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const uint32 kBucketId = 123;
843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId);
844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(bucket != NULL);
845010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLenum kFormat = GL_ETC1_RGB8_OES;
849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const size_t kBlockSize = 8;
850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CompressedTexImage2DBucket cmd;
852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // test small width.
853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 4, 8, 0, 16, kBucketId);
854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // test small height.
857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 8, 4, 0, 16, kBucketId);
858010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // test size too large.
861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, kBucketId);
862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bucket->SetSize(kBlockSize * 2);
863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
865010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
866010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // test size too small.
867cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, kBucketId);
868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bucket->SetSize(kBlockSize / 2);
869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test a 16x16
873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoCompressedTexImage2D(
874010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, kFormat, 16, 16, 0, kBlockSize * 16, kBucketId);
875010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
876010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test CompressedTexSubImage not allowed
878010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CompressedTexSubImage2DBucket sub_cmd;
879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bucket->SetSize(kBlockSize);
880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, kFormat, kBucketId);
881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test TexSubImage not allowed for ETC1 compressed texture
885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = GetTexture(client_texture_id_);
886010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum type, internal_format;
889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kFormat, internal_format);
891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D texsub_cmd;
892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  texsub_cmd.Init(GL_TEXTURE_2D,
893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  0,
894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  0,
895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  0,
896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  4,
897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  4,
898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  GL_RGBA,
899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  GL_UNSIGNED_BYTE,
900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kSharedMemoryId,
901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kSharedMemoryOffset,
902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  GL_FALSE);
903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(texsub_cmd));
904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test CopyTexSubImage not allowed for ETC1 compressed texture
907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CopyTexSubImage2D copy_cmd;
908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  copy_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4);
909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd));
910010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, EGLImageExternalBindTexture) {
914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_EGL_image_external";
916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
919010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_EXTERNAL_OES, kNewServiceId));
920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GenTextures(1, _))
921010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kNewServiceId));
922010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexture cmd;
923010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_EXTERNAL_OES, kNewClientId);
924010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
925010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
926010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = GetTexture(kNewClientId);
927010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture_ref != NULL);
928010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture_ref->texture()->target() == GL_TEXTURE_EXTERNAL_OES);
929010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
930010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
931010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, EGLImageExternalGetBinding) {
932010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_EGL_image_external";
934010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
935010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
936010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
937010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
938010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
939010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
940010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
941010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
942010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  typedef GetIntegerv::Result Result;
944010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Result* result = static_cast<Result*>(shared_memory_address_);
945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
946010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              GetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, result->GetData()))
947010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(0);
948010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  result->size = 0;
949010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetIntegerv cmd;
950010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_BINDING_EXTERNAL_OES,
951010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           shared_memory_id_,
952010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           shared_memory_offset_);
953010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
954010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
955010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                GL_TEXTURE_BINDING_EXTERNAL_OES),
956010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            result->GetNumResults());
957010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
958010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]);
959010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
960010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
961010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTextureDefaults) {
962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
963010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_EGL_image_external";
964010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
965010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
966010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
967010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
968010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
969010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = GetTexture(client_texture_id_);
970010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture_ref != NULL);
971010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
972010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES);
973010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
977010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
978010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTextureParam) {
979010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
980010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_EGL_image_external";
981010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
982010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
984010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
985010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
986010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
987010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexParameteri(
988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
989010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(
990010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      *gl_,
991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      TexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
992010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(
993010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      *gl_,
994010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      TexParameteri(
995010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
996010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(
997010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      *gl_,
998010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      TexParameteri(
999010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
1000010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexParameteri cmd;
1001010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1002010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1003010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1004010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1005010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1006010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1007010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1008010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1009010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1010010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1011010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1012010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1013010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1014010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1015010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1016010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1017010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = GetTexture(client_texture_id_);
1018010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture_ref != NULL);
1019010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
1020010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES);
1021010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
1022010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
1023010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
1024010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1025010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTextureParamInvalid) {
1027010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1028010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_EGL_image_external";
1029010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
1030010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1031010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1032010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
1033010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1034010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexParameteri cmd;
1035010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_EXTERNAL_OES,
1036010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_TEXTURE_MIN_FILTER,
1037010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_NEAREST_MIPMAP_NEAREST);
1038010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1039010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1040010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_REPEAT);
1042010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1043010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1044010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1045010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_REPEAT);
1046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1048010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1049010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = GetTexture(client_texture_id_);
1050010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture_ref != NULL);
1051010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
1052010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES);
1053010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
1054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
1055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
1056010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1057010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTexImage2DError) {
1059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_EGL_image_external";
1061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
1062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1063010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum target = GL_TEXTURE_EXTERNAL_OES;
1066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint level = 0;
1067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum internal_format = GL_RGBA;
1068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei width = 2;
1069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei height = 4;
1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum format = GL_RGBA;
1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum type = GL_UNSIGNED_BYTE;
1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(GetTexture(client_texture_id_) != NULL);
1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexImage2D cmd;
1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(target,
1076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           level,
1077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           internal_format,
1078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           width,
1079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           height,
1080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           format,
1081010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           type,
1082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
1083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
1084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1085010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // TexImage2D is not allowed with GL_TEXTURE_EXTERNAL_OES targets.
1087010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, DefaultTextureZero) {
1091010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1092010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1093010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1094010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1095010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexture cmd1;
1096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd1.Init(GL_TEXTURE_2D, 0);
1097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1098010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexture cmd2;
1102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd2.Init(GL_TEXTURE_CUBE_MAP, 0);
1103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
1104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, DefaultTextureBGR) {
1109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexture cmd1;
1115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd1.Init(GL_TEXTURE_2D, 0);
1116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(
1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      *gl_, BindTexture(GL_TEXTURE_2D, TestHelper::kServiceDefaultTexture2dId));
1118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexture cmd2;
1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd2.Init(GL_TEXTURE_CUBE_MAP, 0);
1123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              BindTexture(GL_TEXTURE_CUBE_MAP,
1125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          TestHelper::kServiceDefaultTextureCubemapId));
1126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test that default texture 0 is immutable.
1131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameterf) {
1132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
1137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BindTexture cmd1;
1138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd1.Init(GL_TEXTURE_2D, 0);
1139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
1142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TexParameterf cmd2;
1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BindTexture cmd1;
1151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
1152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
1153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
1155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TexParameterf cmd2;
1157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameteri) {
1164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
1169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BindTexture cmd1;
1170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd1.Init(GL_TEXTURE_2D, 0);
1171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
1174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TexParameteri cmd2;
1176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
1182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BindTexture cmd1;
1183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
1184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
1185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
1187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TexParameteri cmd2;
1189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameterfv) {
1196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
1201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BindTexture cmd1;
1202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd1.Init(GL_TEXTURE_2D, 0);
1203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
1206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GLfloat data = GL_NEAREST;
1208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TexParameterfvImmediate& cmd2 =
1209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      *GetImmediateAs<TexParameterfvImmediate>();
1210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd2.Init(GL_TEXTURE_2D,
1211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              GL_TEXTURE_MAG_FILTER,
1212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              &data);
1213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd2, sizeof(data)));
1214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
1218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BindTexture cmd1;
1219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
1220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
1221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
1223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GLfloat data = GL_NEAREST;
1225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TexParameterfvImmediate& cmd2 =
1226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      *GetImmediateAs<TexParameterfvImmediate>();
1227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd2.Init(GL_TEXTURE_CUBE_MAP,
1228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              GL_TEXTURE_MAG_FILTER,
1229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              &data);
1230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd2, sizeof(data)));
1231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameteriv) {
1236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
1241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BindTexture cmd1;
1242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd1.Init(GL_TEXTURE_2D, 0);
1243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
1246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GLfloat data = GL_NEAREST;
1248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TexParameterfvImmediate& cmd2 =
1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      *GetImmediateAs<TexParameterfvImmediate>();
1250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd2.Init(GL_TEXTURE_2D,
1251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              GL_TEXTURE_MAG_FILTER,
1252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              &data);
1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd2, sizeof(data)));
1254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
1258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    BindTexture cmd1;
1259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
1260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
1261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
1263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GLfloat data = GL_NEAREST;
1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TexParameterfvImmediate& cmd2 =
1266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      *GetImmediateAs<TexParameterfvImmediate>();
1267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd2.Init(GL_TEXTURE_CUBE_MAP,
1268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              GL_TEXTURE_MAG_FILTER,
1269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              &data);
1270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd2, sizeof(data)));
1271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, NoDefaultTexImage2D) {
1276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexture cmd1;
1281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd1.Init(GL_TEXTURE_2D, 0);
1282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexImage2D cmd2;
1287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd2.Init(GL_TEXTURE_2D,
1288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            0,
1289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            GL_RGBA,
1290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            2,
1291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            2,
1292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            GL_RGBA,
1293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            GL_UNSIGNED_BYTE,
1294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            kSharedMemoryId,
1295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            kSharedMemoryOffset);
1296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
1298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, NoDefaultTexSubImage2D) {
1301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexture cmd1;
1306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd1.Init(GL_TEXTURE_2D, 0);
1307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D cmd2;
1312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd2.Init(GL_TEXTURE_2D,
1313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            0,
1314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            1,
1315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            1,
1316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            1,
1317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            1,
1318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            GL_RGBA,
1319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            GL_UNSIGNED_BYTE,
1320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            kSharedMemoryId,
1321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            kSharedMemoryOffset,
1322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            GL_FALSE);
1323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
1325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleBindTexture) {
1328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_ARB_texture_rectangle";
1330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_RECTANGLE_ARB, kNewServiceId));
1334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GenTextures(1, _))
1335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kNewServiceId));
1336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexture cmd;
1337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_RECTANGLE_ARB, kNewClientId);
1338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = GetTexture(kNewClientId)->texture();
1341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture != NULL);
1342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
1343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleGetBinding) {
1346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_ARB_texture_rectangle";
1348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(
1352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
1353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
1355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
1356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
1357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  typedef GetIntegerv::Result Result;
1359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Result* result = static_cast<Result*>(shared_memory_address_);
1360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              GetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, result->GetData()))
1362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(0);
1363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  result->size = 0;
1364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetIntegerv cmd;
1365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_BINDING_RECTANGLE_ARB,
1366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           shared_memory_id_,
1367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           shared_memory_offset_);
1368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
1370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                GL_TEXTURE_BINDING_RECTANGLE_ARB),
1371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            result->GetNumResults());
1372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]);
1374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTextureDefaults) {
1377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_ARB_texture_rectangle";
1379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(
1383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
1384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = GetTexture(client_texture_id_)->texture();
1386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture != NULL);
1387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
1388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
1389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
1390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
1391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParam) {
1394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_ARB_texture_rectangle";
1396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(
1401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
1402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexParameteri(
1405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
1406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexParameteri(
1408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
1409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(
1410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      *gl_,
1411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      TexParameteri(
1412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
1413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(
1414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      *gl_,
1415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      TexParameteri(
1416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
1417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexParameteri cmd;
1418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = GetTexture(client_texture_id_)->texture();
1435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture != NULL);
1436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
1437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
1438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
1439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
1440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParamInvalid) {
1443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_ARB_texture_rectangle";
1445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(
1450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
1451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexParameteri cmd;
1453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_RECTANGLE_ARB,
1454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_TEXTURE_MIN_FILTER,
1455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_NEAREST_MIPMAP_NEAREST);
1456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_REPEAT);
1460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_REPEAT);
1464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = GetTexture(client_texture_id_)->texture();
1468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture != NULL);
1469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
1470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
1471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
1472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
1473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTexImage2DError) {
1476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_ARB_texture_rectangle";
1478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum target = GL_TEXTURE_RECTANGLE_ARB;
1483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint level = 0;
1484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum internal_format = GL_RGBA;
1485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei width = 2;
1486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei height = 4;
1487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum format = GL_RGBA;
1488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum type = GL_UNSIGNED_BYTE;
1489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(
1490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
1491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(GetTexture(client_texture_id_) != NULL);
1492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexImage2D cmd;
1493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(target,
1494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           level,
1495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           internal_format,
1496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           width,
1497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           height,
1498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           format,
1499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           type,
1500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
1501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
1502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // TexImage2D is not allowed with GL_TEXTURE_RECTANGLE_ARB targets.
1505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, TexSubImage2DClearsAfterTexImage2DNULL) {
1509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
1511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_alpha = true;
1512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_depth = true;
1513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_alpha = true;
1514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_depth = true;
1515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
1519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupClearTextureExpectations(kServiceTextureId,
1521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                kServiceTextureId,
1522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
1523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
1524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                0,
1525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
1526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
1527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_UNSIGNED_BYTE,
1528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                2,
1529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                2);
1530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexSubImage2D(GL_TEXTURE_2D,
1532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
1533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_RGBA,
1538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_UNSIGNED_BYTE,
1539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            shared_memory_address_))
1540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D cmd;
1543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
1544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
1545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
1550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
1551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
1552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
1553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
1554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test if we call it again it does not clear.
1556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexSubImage2D(GL_TEXTURE_2D,
1558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
1559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_RGBA,
1564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_UNSIGNED_BYTE,
1565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            shared_memory_address_))
1566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, TexSubImage2DDoesNotClearAfterTexImage2DNULLThenData) {
1572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
1574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
1576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
1577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
1578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               2,
1579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               2,
1580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
1581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
1582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
1583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryId,
1584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryOffset);
1585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexSubImage2D(GL_TEXTURE_2D,
1587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
1588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_RGBA,
1593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_UNSIGNED_BYTE,
1594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            shared_memory_address_))
1595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D cmd;
1598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
1599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
1600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
1605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
1606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
1607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
1608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
1609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test if we call it again it does not clear.
1611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexSubImage2D(GL_TEXTURE_2D,
1613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
1614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_RGBA,
1619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_UNSIGNED_BYTE,
1620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            shared_memory_address_))
1621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(
1627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GLES2DecoderManualInitTest,
1628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TexSubImage2DDoesNotClearAfterTexImage2DNULLThenDataWithTexImage2DIsFaster) {
1629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CommandLine command_line(0, NULL);
1630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  command_line.AppendSwitchASCII(
1631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      switches::kGpuDriverBugWorkarounds,
1632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      base::IntToString(gpu::TEXSUBIMAGE2D_FASTER_THAN_TEXIMAGE2D));
1633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoderWithCommandLine(init, &command_line);
1637010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
1639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
1642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Uses texSubimage internally because the above workaround is active and
1643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // the update is for the full size of the texture.
1644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_,
1645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                TexSubImage2D(
1646010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, _))
1647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .Times(1)
1648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
1649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmds::TexImage2D cmd;
1650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd.Init(GL_TEXTURE_2D,
1651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             0,
1652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             GL_RGBA,
1653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             2,
1654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             2,
1655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             GL_RGBA,
1656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             GL_UNSIGNED_BYTE,
1657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             kSharedMemoryId,
1658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             kSharedMemoryOffset);
1659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexSubImage2D(GL_TEXTURE_2D,
1664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
1665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_RGBA,
1670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_UNSIGNED_BYTE,
1671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            shared_memory_address_))
1672010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1673010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D cmd;
1675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
1676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
1677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
1682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
1683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
1684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
1685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
1686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Test if we call it again it does not clear.
1688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexSubImage2D(GL_TEXTURE_2D,
1690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
1691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_RGBA,
1696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_UNSIGNED_BYTE,
1697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            shared_memory_address_))
1698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1701010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1702010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1703010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, TexSubImage2DClearsAfterTexImage2DWithDataThenNULL) {
1704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Put in data (so it should be marked as cleared)
1706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
1707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
1708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
1709010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               2,
1710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               2,
1711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
1712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
1713010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
1714010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryId,
1715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryOffset);
1716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Put in no data.
1717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexImage2D tex_cmd;
1718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  tex_cmd.Init(
1719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // It won't actually call TexImage2D, just mark it as uncleared.
1721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd));
1722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Next call to TexSubImage2d should clear.
1723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupClearTextureExpectations(kServiceTextureId,
1724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                kServiceTextureId,
1725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
1726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
1727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                0,
1728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
1729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
1730010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_UNSIGNED_BYTE,
1731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                2,
1732010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                2);
1733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
1734010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexSubImage2D(GL_TEXTURE_2D,
1735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
1736010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
1740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_RGBA,
1741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_UNSIGNED_BYTE,
1742010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            shared_memory_address_))
1743010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1744010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1745010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D cmd;
1746010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
1747010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
1748010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1749010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
1752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
1753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_BYTE,
1754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
1755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
1756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
1757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, CopyTexImage2DMarksTextureAsCleared) {
1761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureManager* manager = group().texture_manager();
1764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
1765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
1766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
1767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
1769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
1770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0))
1772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
1775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
1776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CopyTexImage2D cmd;
1778cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1);
1779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->SafeToRenderFrom());
1782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, CopyTexSubImage2DClearsUnclearedTexture) {
1785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
1787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupClearTextureExpectations(kServiceTextureId,
1790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                kServiceTextureId,
1791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
1792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
1793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                0,
1794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
1795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
1796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_UNSIGNED_BYTE,
1797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                2,
1798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                2);
1799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, CopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1))
1800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CopyTexSubImage2D cmd;
1803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
1804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1805010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, CompressedImage2DMarksTextureAsCleared) {
1808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
1809010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_EXT_texture_compression_s3tc";
1810010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
1811010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
1812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
1813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
1816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
1817010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1818010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(
1819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      *gl_,
1820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      CompressedTexImage2D(
1821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, 8, _))
1822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
1825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
1826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CompressedTexImage2D cmd;
1828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
1829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
1830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
1831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           4,
1832010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           4,
1833010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           8,
1834010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
1835010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset);
1836010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1837010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureManager* manager = group().texture_manager();
1838010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
1839010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture_ref->texture()->SafeToRenderFrom());
1840010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1842010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, TextureUsageAngleExtNotEnabledByDefault) {
1843010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1844010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1845010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexParameteri cmd;
1846010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(
1847010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE);
1848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1849010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1850010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1851010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1852010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, ProduceAndConsumeTextureCHROMIUM) {
1853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Mailbox mailbox = Mailbox::Generate();
1854010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1855010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
1857010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1858010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
1859010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref =
1861010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      group().texture_manager()->GetTexture(client_texture_id_);
1862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
1863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
1864010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kServiceTextureId, texture->service_id());
1865010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1866cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ProduceTextureCHROMIUMImmediate& produce_cmd =
1867cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      *GetImmediateAs<ProduceTextureCHROMIUMImmediate>();
1868cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  produce_cmd.Init(GL_TEXTURE_2D, mailbox.name);
1869cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
1870cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            ExecuteImmediateCmd(produce_cmd, sizeof(mailbox.name)));
1871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1873010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Texture didn't change.
1874010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei width;
1875010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei height;
1876010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum type;
1877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum internal_format;
1878010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
1880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(3, width);
1881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, height);
1882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
1883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
1884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1886010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
1887010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(2, width);
1888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(4, height);
1889010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format));
1890010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
1891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Service ID has not changed.
1894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kServiceTextureId, texture->service_id());
1895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Create new texture for consume.
1897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GenTextures(_, _))
1898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kNewServiceId))
1899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, kNewClientId, kNewServiceId);
1901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Assigns and binds original service size texture ID.
1903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, DeleteTextures(1, _)).Times(1).RetiresOnSaturation();
1904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
1905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
1906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
1907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ConsumeTextureCHROMIUMImmediate& consume_cmd =
1909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      *GetImmediateAs<ConsumeTextureCHROMIUMImmediate>();
1910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  consume_cmd.Init(GL_TEXTURE_2D, mailbox.name);
1911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
1912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            ExecuteImmediateCmd(consume_cmd, sizeof(mailbox.name)));
1913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Texture is redefined.
1916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
1917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(3, width);
1918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, height);
1919010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
1920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
1921010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1922010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1923010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
1924010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(2, width);
1925010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(4, height);
1926010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format));
1927010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
1928010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1929010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1930010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Service ID is restored.
1931010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kServiceTextureId, texture->service_id());
1932010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1934f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_P(GLES2DecoderTest, ProduceAndConsumeDirectTextureCHROMIUM) {
1935f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Mailbox mailbox = Mailbox::Generate();
1936f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1937f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1938f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DoTexImage2D(
1939f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1940f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DoTexImage2D(
1941f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1942f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TextureRef* texture_ref =
1943f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      group().texture_manager()->GetTexture(client_texture_id_);
1944f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
1945f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Texture* texture = texture_ref->texture();
1946f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kServiceTextureId, texture->service_id());
1947f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1948f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ProduceTextureDirectCHROMIUMImmediate& produce_cmd =
1949f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      *GetImmediateAs<ProduceTextureDirectCHROMIUMImmediate>();
1950f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  produce_cmd.Init(client_texture_id_, GL_TEXTURE_2D, mailbox.name);
1951f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
1952f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            ExecuteImmediateCmd(produce_cmd, sizeof(mailbox.name)));
1953f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1954f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Texture didn't change.
1956f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GLsizei width;
1957f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GLsizei height;
1958f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GLenum type;
1959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GLenum internal_format;
1960f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1961f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
1962f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(3, width);
1963f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1, height);
1964f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
1965f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
1966f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1967f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1968f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
1969f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2, width);
1970f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(4, height);
1971f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format));
1972f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
1973f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1974f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1975f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Service ID has not changed.
1976f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kServiceTextureId, texture->service_id());
1977f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1978f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Consume the texture into a new client ID.
1979f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GLuint new_texture_id = kNewClientId;
1980f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CreateAndConsumeTextureCHROMIUMImmediate& consume_cmd =
1981f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      *GetImmediateAs<CreateAndConsumeTextureCHROMIUMImmediate>();
1982f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  consume_cmd.Init(GL_TEXTURE_2D, new_texture_id, mailbox.name);
1983f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
1984f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            ExecuteImmediateCmd(consume_cmd, sizeof(mailbox.name)));
1985f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
1986f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1987f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Make sure the new client ID is associated with the produced service ID.
1988f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  texture_ref = group().texture_manager()->GetTexture(new_texture_id);
1989f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
1990f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  texture = texture_ref->texture();
1991f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kServiceTextureId, texture->service_id());
1992f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1993f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, kNewClientId, kServiceTextureId);
1994f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1995f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Texture is redefined.
1996f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
1997f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(3, width);
1998f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(1, height);
1999f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
2000f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
2001f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
2002f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2003f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
2004f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(2, width);
2005f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(4, height);
2006f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format));
2007f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
2008f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
2009f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
2010f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2011f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_P(GLES2DecoderTest, ProduceTextureCHROMIUMInvalidTarget) {
2012f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Mailbox mailbox = Mailbox::Generate();
2013f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2014f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId);
2015f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DoTexImage2D(
2016f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 3, 1, 0, GL_RGBA,
2017f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GL_UNSIGNED_BYTE, 0, 0);
2018f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TextureRef* texture_ref =
2019f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      group().texture_manager()->GetTexture(client_texture_id_);
2020f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
2021f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Texture* texture = texture_ref->texture();
2022f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(kServiceTextureId, texture->service_id());
2023f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2024f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ProduceTextureDirectCHROMIUMImmediate& produce_cmd =
2025f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      *GetImmediateAs<ProduceTextureDirectCHROMIUMImmediate>();
2026f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  produce_cmd.Init(client_texture_id_, GL_TEXTURE_2D, mailbox.name);
2027f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
2028f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            ExecuteImmediateCmd(produce_cmd, sizeof(mailbox.name)));
2029f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2030f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // ProduceTexture should fail it the texture and produce targets don't match.
2031f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2032f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
2033f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2034010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, DepthTextureBadArgs) {
2035010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
2036010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_ANGLE_depth_texture";
2037010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
2038010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_depth = true;
2039010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_stencil = true;
2040010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_depth = true;
2041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_stencil = true;
2042010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
2043010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
2044010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2045010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check trying to upload data fails.
2047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexImage2D tex_cmd;
2048010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  tex_cmd.Init(GL_TEXTURE_2D,
2049010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2050010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_DEPTH_COMPONENT,
2051010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
2052010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
2053010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_DEPTH_COMPONENT,
2054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_INT,
2055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryId,
2056010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryOffset);
2057010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd));
2058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Try level > 0.
2060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  tex_cmd.Init(GL_TEXTURE_2D,
2061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
2062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_DEPTH_COMPONENT,
2063010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
2064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
2065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_DEPTH_COMPONENT,
2066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_INT,
2067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0);
2069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd));
2070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Make a 1 pixel depth texture.
2072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
2073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_DEPTH_COMPONENT,
2075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
2076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
2077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_DEPTH_COMPONENT,
2079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_INT,
2080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2081010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0);
2082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check that trying to update it fails.
2085010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D tex_sub_cmd;
2086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  tex_sub_cmd.Init(GL_TEXTURE_2D,
2087010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   0,
2088010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   0,
2089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   0,
2090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   1,
2091010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   1,
2092010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   GL_DEPTH_COMPONENT,
2093010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   GL_UNSIGNED_INT,
2094010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   kSharedMemoryId,
2095010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   kSharedMemoryOffset,
2096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   GL_FALSE);
2097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(tex_sub_cmd));
2098010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check that trying to CopyTexImage2D fails
2101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CopyTexImage2D copy_tex_cmd;
2102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  copy_tex_cmd.Init(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, 1, 1);
2103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(copy_tex_cmd));
2104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Check that trying to CopyTexSubImage2D fails
2107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CopyTexSubImage2D copy_sub_cmd;
2108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  copy_sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
2109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(copy_sub_cmd));
2110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, GenerateMipmapDepthTexture) {
2114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
2115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_ANGLE_depth_texture";
2116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
2117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_depth = true;
2118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_stencil = true;
2119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_depth = true;
2120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_stencil = true;
2121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
2122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
2123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
2125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_DEPTH_COMPONENT,
2127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               2,
2128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               2,
2129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_DEPTH_COMPONENT,
2131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_INT,
2132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0);
2134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GenerateMipmap cmd;
2135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D);
2136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, BindTexImage2DCHROMIUM) {
2141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
2143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
2144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref =
2145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      group().texture_manager()->GetTexture(client_texture_id_);
2146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
2147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
2148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kServiceTextureId, texture->service_id());
2149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
2151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL);
2152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei width;
2154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei height;
2155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum type;
2156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum internal_format;
2157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(3, width);
2160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, height);
2161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
2162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
2163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
2164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Bind image to texture.
2167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
2173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1);
2174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
2175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Image should now be set.
2177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Define new texture image.
2180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
2181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
2182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Image should no longer be set.
2184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, BindTexImage2DCHROMIUMCubeMapNotAllowed) {
2188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
2189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId);
2190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
2192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1);
2193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
2194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
2195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, OrphanGLImageWithTexImage2D) {
2198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
2199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId);
2200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
2202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1);
2203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
2204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
2205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
2207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
2208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref =
2209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      group().texture_manager()->GetTexture(client_texture_id_);
2210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
2211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
2212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderTest, ReleaseTexImage2DCHROMIUM) {
2216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
2218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
2219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref =
2220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      group().texture_manager()->GetTexture(client_texture_id_);
2221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
2222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
2223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kServiceTextureId, texture->service_id());
2224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
2226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL);
2227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei width;
2229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLsizei height;
2230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum type;
2231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLenum internal_format;
2232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(3, width);
2235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, height);
2236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
2237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
2238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
2239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Bind image to texture.
2242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
2248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1);
2249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
2250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Image should now be set.
2252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Release image from texture.
2255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ReleaseTexImage2DCHROMIUM release_tex_image_2d_cmd;
2261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  release_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1);
2262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(release_tex_image_2d_cmd));
2263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Image should no longer be set.
2265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class MockGLImage : public gfx::GLImage {
2269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
2270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MockGLImage() {}
2271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Overridden from gfx::GLImage:
2273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MOCK_METHOD0(Destroy, void());
2274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MOCK_METHOD0(GetSize, gfx::Size());
2275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MOCK_METHOD1(BindTexImage, bool(unsigned));
2276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MOCK_METHOD1(ReleaseTexImage, void(unsigned));
2277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MOCK_METHOD0(WillUseTexImage, void());
2278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MOCK_METHOD0(DidUseTexImage, void());
2279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MOCK_METHOD0(WillModifyTexImage, void());
2280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MOCK_METHOD0(DidModifyTexImage, void());
2281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected:
2283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~MockGLImage() {}
2284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
2285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderWithShaderTest, UseTexImage) {
2287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
2289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
2291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
2292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               1,
2293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
2295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_UNSIGNED_BYTE,
2296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryId,
2297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kSharedMemoryOffset);
2298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref =
2300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      group().texture_manager()->GetTexture(client_texture_id_);
2301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(texture_ref != NULL);
2302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Texture* texture = texture_ref->texture();
2303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(kServiceTextureId, texture->service_id());
2304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int32 kImageId = 1;
2306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<MockGLImage> image(new MockGLImage);
2307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  group().image_manager()->AddImage(image.get(), kImageId);
2308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Bind image to texture.
2310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*image, BindTexImage(GL_TEXTURE_2D))
2311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
2312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(true))
2313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*image, GetSize())
2315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
2316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(gfx::Size(1, 1)))
2317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
2324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, kImageId);
2325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
2326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
2328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForApplyingDefaultDirtyState();
2329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(3).RetiresOnSaturation();
2338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*image, WillUseTexImage()).Times(1).RetiresOnSaturation();
2339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*image, DidUseTexImage()).Times(1).RetiresOnSaturation();
2340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
2341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
2342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DrawArrays cmd;
2344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TRIANGLES, 0, kNumVertices);
2345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindFramebuffer(
2349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
2350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation();
2356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
2357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(2)
2358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Image will be 'in use' as long as bound to a framebuffer.
2360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*image, WillUseTexImage()).Times(1).RetiresOnSaturation();
2361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
2362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              FramebufferTexture2DEXT(GL_FRAMEBUFFER,
2363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      GL_COLOR_ATTACHMENT0,
2364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      GL_TEXTURE_2D,
2365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      kServiceTextureId,
2366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      0))
2367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
2368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  FramebufferTexture2D fbtex_cmd;
2374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fbtex_cmd.Init(GL_FRAMEBUFFER,
2375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 GL_COLOR_ATTACHMENT0,
2376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 GL_TEXTURE_2D,
2377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 client_texture_id_);
2378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd));
2379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
2387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              FramebufferRenderbufferEXT(GL_FRAMEBUFFER,
2388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         GL_COLOR_ATTACHMENT0,
2389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         GL_RENDERBUFFER,
2390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         kServiceRenderbufferId))
2391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
2392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation();
2394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
2395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(2)
2396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Image should no longer be 'in use' after being unbound from framebuffer.
2398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*image, DidUseTexImage()).Times(1).RetiresOnSaturation();
2399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  FramebufferRenderbuffer fbrb_cmd;
2404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fbrb_cmd.Init(GL_FRAMEBUFFER,
2405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                GL_COLOR_ATTACHMENT0,
2406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                GL_RENDERBUFFER,
2407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                client_renderbuffer_id_);
2408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd));
2409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, DrawWithGLImageExternal) {
2412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
2413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_EGL_image_external";
2414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
2415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_alpha = true;
2416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.has_depth = true;
2417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_alpha = true;
2418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.request_depth = true;
2419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
2420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
2421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TextureRef* texture_ref = GetTexture(client_texture_id_);
2423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<MockGLImage> image(new MockGLImage);
2424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  group().texture_manager()->SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES);
2425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  group().texture_manager()->SetLevelInfo(texture_ref,
2426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          GL_TEXTURE_EXTERNAL_OES,
2427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          0,
2428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          GL_RGBA,
2429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          0,
2430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          0,
2431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          1,
2432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          0,
2433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          GL_RGBA,
2434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          GL_UNSIGNED_BYTE,
2435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                          true);
2436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  group().texture_manager()->SetLevelImage(
2437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      texture_ref, GL_TEXTURE_EXTERNAL_OES, 0, image);
2438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
2440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupSamplerExternalProgram();
2443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupIndexBuffer();
2444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0);
2445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForApplyingDefaultDirtyState();
2446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(group().texture_manager()->CanRender(texture_ref));
2447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InSequence s;
2449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation();
2453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*image, WillUseTexImage()).Times(1).RetiresOnSaturation();
2454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(1);
2458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation();
2462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*image, DidUseTexImage()).Times(1).RetiresOnSaturation();
2463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation();
2467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DrawElements cmd;
2468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TRIANGLES,
2469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeCount,
2470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_UNSIGNED_SHORT,
2471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kValidIndexRangeStart * 2);
2472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES2) {
2477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
2478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_texture_float";
2479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 2.0";
2480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
2481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0);
2483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0);
2484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
2485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, GL_LUMINANCE, GL_FLOAT, 0, 0);
2486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, GL_ALPHA, GL_FLOAT, 0, 0);
2487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
2488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_LUMINANCE_ALPHA,
2490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               16,
2491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               17,
2492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_LUMINANCE_ALPHA,
2494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_FLOAT,
2495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0);
2497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES3) {
2500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
2501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
2502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 3.0";
2503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
2504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0);
2506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0);
2507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
2508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0);
2509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
2510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, GL_LUMINANCE, GL_FLOAT, 0, 0);
2511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, GL_ALPHA, GL_FLOAT, 0, 0);
2512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
2513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_LUMINANCE_ALPHA,
2515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               16,
2516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               17,
2517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_LUMINANCE_ALPHA,
2519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_FLOAT,
2520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0);
2522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, TexSubImage2DFloatOnGLES3) {
2525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
2526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
2527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 3.0";
2528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
2529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kWidth = 8;
2530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kHeight = 4;
2531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
2533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA32F,
2535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kWidth,
2536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kHeight,
2537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
2539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_FLOAT,
2540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0);
2542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
2543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexImage2D(GL_TEXTURE_2D,
2544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         0,
2545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         GL_RGBA32F,
2546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         kWidth,
2547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         kHeight,
2548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         0,
2549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         GL_RGBA,
2550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         GL_FLOAT,
2551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                         shared_memory_address_))
2552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
2553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D cmd;
2555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
2556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
2557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
2558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
2559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth,
2560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
2561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
2562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FLOAT,
2563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
2564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
2565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
2566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, TexSubImage2DFloatDoesClearOnGLES3) {
2571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
2572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
2573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "opengl es 3.0";
2574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
2575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kWidth = 8;
2576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const int kHeight = 4;
2577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D,
2579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA32F,
2581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kWidth,
2582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               kHeight,
2583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_RGBA,
2585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               GL_FLOAT,
2586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0,
2587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)               0);
2588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupClearTextureExpectations(kServiceTextureId,
2589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                kServiceTextureId,
2590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
2591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_TEXTURE_2D,
2592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                0,
2593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA32F,
2594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_RGBA,
2595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                GL_FLOAT,
2596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                kWidth,
2597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                kHeight);
2598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_,
2599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              TexSubImage2D(GL_TEXTURE_2D,
2600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
2601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            1,
2602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            0,
2603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            kWidth - 1,
2604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            kHeight,
2605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_RGBA,
2606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_FLOAT,
2607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            shared_memory_address_))
2608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .Times(1)
2609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TexSubImage2D cmd;
2611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_TEXTURE_2D,
2612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
2613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           1,
2614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           0,
2615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kWidth - 1,
2616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kHeight,
2617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_RGBA,
2618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FLOAT,
2619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryId,
2620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           kSharedMemoryOffset,
2621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           GL_FALSE);
2622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, TexImage2DFloatConvertsFormatDesktop) {
2627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
2628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.extensions = "GL_ARB_texture_float";
2629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "2.1";
2630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
2631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(
2633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0);
2634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0);
2635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D,
2636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2637010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_RGBA,
2638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    16,
2639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    17,
2640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_RGBA,
2642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_FLOAT,
2643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_RGBA32F_ARB);
2646010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D,
2647010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_RGB,
2649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    16,
2650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    17,
2651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_RGB,
2653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_FLOAT,
2654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_RGB32F_ARB);
2657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D,
2658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_LUMINANCE,
2660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    16,
2661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    17,
2662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_LUMINANCE,
2664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_FLOAT,
2665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_LUMINANCE32F_ARB);
2668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D,
2669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_ALPHA,
2671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    16,
2672010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    17,
2673010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_ALPHA,
2675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_FLOAT,
2676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_ALPHA32F_ARB);
2679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D,
2680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_LUMINANCE_ALPHA,
2682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    16,
2683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    17,
2684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_LUMINANCE_ALPHA,
2686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_FLOAT,
2687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    0,
2689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    GL_LUMINANCE_ALPHA32F_ARB);
2690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class GLES2DecoderCompressedFormatsTest : public GLES2DecoderManualInitTest {
2693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
2694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLES2DecoderCompressedFormatsTest() {}
2695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static bool ValueInArray(GLint value, GLint* array, GLint count) {
2697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (GLint ii = 0; ii < count; ++ii) {
2698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (array[ii] == value) {
2699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return true;
2700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
2701010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
2702010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return false;
2703010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
2704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void CheckFormats(const char* extension, const GLenum* formats, int count) {
2706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    InitState init;
2707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    init.extensions = extension;
2708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    init.gl_version = "3.0";
2709010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    init.bind_generates_resource = true;
2710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    InitDecoder(init);
2711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, GetError())
2713010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(Return(GL_NO_ERROR))
2714010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(Return(GL_NO_ERROR))
2715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(Return(GL_NO_ERROR))
2716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillOnce(Return(GL_NO_ERROR))
2717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .RetiresOnSaturation();
2718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2719010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    typedef GetIntegerv::Result Result;
2720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Result* result = static_cast<Result*>(shared_memory_address_);
2721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GetIntegerv cmd;
2722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    result->size = 0;
2723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0).RetiresOnSaturation();
2724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd.Init(GL_NUM_COMPRESSED_TEXTURE_FORMATS,
2725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             shared_memory_id_,
2726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             shared_memory_offset_);
2727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(1, result->GetNumResults());
2729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GLint num_formats = result->GetData()[0];
2730010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(count, num_formats);
2731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
2732010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    result->size = 0;
2734010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cmd.Init(GL_COMPRESSED_TEXTURE_FORMATS,
2735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             shared_memory_id_,
2736010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             shared_memory_offset_);
2737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(num_formats, result->GetNumResults());
2739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (int i = 0; i < count; ++i) {
2741010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      EXPECT_TRUE(
2742010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ValueInArray(formats[i], result->GetData(), result->GetNumResults()));
2743010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
2744010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2745010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(GL_NO_ERROR, GetGLError());
2746010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
2747010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
2748010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2749010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(Service,
2750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        GLES2DecoderCompressedFormatsTest,
2751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        ::testing::Bool());
2752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsS3TC) {
2754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLenum formats[] = {
2755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
2756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT};
2757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckFormats("GL_EXT_texture_compression_s3tc", formats, 4);
2758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsATC) {
2761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLenum formats[] = {GL_ATC_RGB_AMD, GL_ATC_RGBA_EXPLICIT_ALPHA_AMD,
2762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD};
2763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckFormats("GL_AMD_compressed_ATC_texture", formats, 3);
2764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsPVRTC) {
2767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLenum formats[] = {
2768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG,
2769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG};
2770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckFormats("GL_IMG_texture_compression_pvrtc", formats, 4);
2771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsETC1) {
2774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const GLenum formats[] = {GL_ETC1_RGB8_OES};
2775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckFormats("GL_OES_compressed_ETC1_RGB8_texture", formats, 1);
2776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(GLES2DecoderManualInitTest, GetNoCompressedTextureFormats) {
2779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitState init;
2780010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.gl_version = "3.0";
2781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  init.bind_generates_resource = true;
2782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  InitDecoder(init);
2783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
2785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
2789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .RetiresOnSaturation();
2790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  typedef GetIntegerv::Result Result;
2792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Result* result = static_cast<Result*>(shared_memory_address_);
2793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GetIntegerv cmd;
2794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  result->size = 0;
2795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0).RetiresOnSaturation();
2796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(GL_NUM_COMPRESSED_TEXTURE_FORMATS,
2797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           shared_memory_id_,
2798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)           shared_memory_offset_);
2799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(1, result->GetNumResults());
2801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLint num_formats = result->GetData()[0];
2802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(0, num_formats);
2803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2805010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  result->size = 0;
2806010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(
2807010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GL_COMPRESSED_TEXTURE_FORMATS, shared_memory_id_, shared_memory_offset_);
2808010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2809010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(num_formats, result->GetNumResults());
2810010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2811010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
2812010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): Complete this test.
2815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TEST_P(GLES2DecoderTest, CompressedTexImage2DGLError) {
2816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// }
2817010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2818010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): CompressedTexImage2D
2819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2820010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): CompressedTexImage2DImmediate
2821010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2822010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): CompressedTexSubImage2DImmediate
2823010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2824010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): TexImage2D
2825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2826010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): TexImage2DImmediate
2827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(gman): TexSubImage2DImmediate
2829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2830010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace gles2
2831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace gpu
2832