1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
7 #include "base/command_line.h"
8 #include "base/strings/string_number_conversions.h"
9 #include "gpu/command_buffer/common/gles2_cmd_format.h"
10 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
11 #include "gpu/command_buffer/common/id_allocator.h"
12 #include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h"
13 #include "gpu/command_buffer/service/async_pixel_transfer_manager.h"
14 #include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h"
15 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
16 #include "gpu/command_buffer/service/context_group.h"
17 #include "gpu/command_buffer/service/context_state.h"
18 #include "gpu/command_buffer/service/gl_surface_mock.h"
19 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h"
21 #include "gpu/command_buffer/service/gpu_switches.h"
22 #include "gpu/command_buffer/service/image_manager.h"
23 #include "gpu/command_buffer/service/mailbox_manager.h"
24 #include "gpu/command_buffer/service/mocks.h"
25 #include "gpu/command_buffer/service/program_manager.h"
26 #include "gpu/command_buffer/service/test_helper.h"
27 #include "testing/gtest/include/gtest/gtest.h"
28 #include "ui/gl/gl_implementation.h"
29 #include "ui/gl/gl_mock.h"
30 #include "ui/gl/gl_surface_stub.h"
32 #if !defined(GL_DEPTH24_STENCIL8)
33 #define GL_DEPTH24_STENCIL8 0x88F0
36 using ::gfx::MockGLInterface;
38 using ::testing::DoAll;
39 using ::testing::InSequence;
40 using ::testing::Invoke;
41 using ::testing::MatcherCast;
42 using ::testing::Mock;
43 using ::testing::Pointee;
44 using ::testing::Return;
45 using ::testing::SaveArg;
46 using ::testing::SetArrayArgument;
47 using ::testing::SetArgumentPointee;
48 using ::testing::SetArgPointee;
49 using ::testing::StrEq;
50 using ::testing::StrictMock;
57 TEST_P(GLES2DecoderTest, GenerateMipmapWrongFormatsFails) {
58 EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0);
59 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
61 GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
63 cmd.Init(GL_TEXTURE_2D);
64 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
65 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
68 TEST_P(GLES2DecoderTest, GenerateMipmapHandlesOutOfMemory) {
69 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
70 TextureManager* manager = group().texture_manager();
71 TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
72 ASSERT_TRUE(texture_ref != NULL);
73 Texture* texture = texture_ref->texture();
76 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height));
77 DoTexImage2D(GL_TEXTURE_2D,
87 EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)).Times(1);
88 EXPECT_CALL(*gl_, GetError())
89 .WillOnce(Return(GL_NO_ERROR))
90 .WillOnce(Return(GL_OUT_OF_MEMORY))
91 .RetiresOnSaturation();
93 cmd.Init(GL_TEXTURE_2D);
94 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
95 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
96 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height));
99 TEST_P(GLES2DecoderTest, GenerateMipmapClearsUnclearedTexture) {
100 EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0);
101 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
103 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
104 SetupClearTextureExpectations(kServiceTextureId,
114 EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D));
115 EXPECT_CALL(*gl_, GetError())
116 .WillOnce(Return(GL_NO_ERROR))
117 .WillOnce(Return(GL_NO_ERROR))
118 .RetiresOnSaturation();
120 cmd.Init(GL_TEXTURE_2D);
121 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
122 EXPECT_EQ(GL_NO_ERROR, GetGLError());
125 // Same as GenerateMipmapClearsUnclearedTexture, but with workaround
126 // |set_texture_filters_before_generating_mipmap|.
127 TEST_P(GLES2DecoderManualInitTest, SetTextureFiltersBeforeGenerateMipmap) {
128 CommandLine command_line(0, NULL);
129 command_line.AppendSwitchASCII(
130 switches::kGpuDriverBugWorkarounds,
131 base::IntToString(gpu::SET_TEXTURE_FILTER_BEFORE_GENERATING_MIPMAP));
133 init.gl_version = "3.0";
134 init.bind_generates_resource = true;
135 InitDecoderWithCommandLine(init, &command_line);
137 EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0);
138 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
140 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
141 SetupClearTextureExpectations(kServiceTextureId,
154 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST))
156 .RetiresOnSaturation();
157 EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D));
161 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR))
163 .RetiresOnSaturation();
164 EXPECT_CALL(*gl_, GetError())
165 .WillOnce(Return(GL_NO_ERROR))
166 .WillOnce(Return(GL_NO_ERROR))
167 .RetiresOnSaturation();
169 cmd.Init(GL_TEXTURE_2D);
170 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
171 EXPECT_EQ(GL_NO_ERROR, GetGLError());
174 TEST_P(GLES2DecoderTest, ActiveTextureValidArgs) {
175 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1));
176 SpecializedSetup<ActiveTexture, 0>(true);
178 cmd.Init(GL_TEXTURE1);
179 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
180 EXPECT_EQ(GL_NO_ERROR, GetGLError());
183 TEST_P(GLES2DecoderTest, ActiveTextureInvalidArgs) {
184 EXPECT_CALL(*gl_, ActiveTexture(_)).Times(0);
185 SpecializedSetup<ActiveTexture, 0>(false);
187 cmd.Init(GL_TEXTURE0 - 1);
188 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
189 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
190 cmd.Init(kNumTextureUnits);
191 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
192 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
195 TEST_P(GLES2DecoderTest, TexSubImage2DValidArgs) {
196 const int kWidth = 16;
197 const int kHeight = 8;
198 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
199 DoTexImage2D(GL_TEXTURE_2D,
208 kSharedMemoryOffset);
210 TexSubImage2D(GL_TEXTURE_2D,
218 shared_memory_address_))
220 .RetiresOnSaturation();
222 cmd.Init(GL_TEXTURE_2D,
233 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
234 EXPECT_EQ(GL_NO_ERROR, GetGLError());
237 TEST_P(GLES2DecoderTest, TexSubImage2DBadArgs) {
238 const int kWidth = 16;
239 const int kHeight = 8;
240 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
241 DoTexImage2D(GL_TEXTURE_2D,
252 cmd.Init(GL_TEXTURE0,
263 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
264 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
265 cmd.Init(GL_TEXTURE_2D,
276 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
277 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
278 cmd.Init(GL_TEXTURE_2D,
289 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
290 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
291 cmd.Init(GL_TEXTURE_2D,
302 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
303 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
304 cmd.Init(GL_TEXTURE_2D,
315 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
316 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
317 cmd.Init(GL_TEXTURE_2D,
328 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
329 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
330 cmd.Init(GL_TEXTURE_2D,
341 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
342 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
343 cmd.Init(GL_TEXTURE_2D,
354 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
355 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
356 cmd.Init(GL_TEXTURE_2D,
367 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
368 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
369 cmd.Init(GL_TEXTURE_2D,
380 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
381 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
382 cmd.Init(GL_TEXTURE_2D,
389 GL_UNSIGNED_SHORT_4_4_4_4,
393 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
394 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
395 cmd.Init(GL_TEXTURE_2D,
403 kInvalidSharedMemoryId,
406 EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
407 cmd.Init(GL_TEXTURE_2D,
416 kInvalidSharedMemoryOffset,
418 EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
421 TEST_P(GLES2DecoderTest, CopyTexSubImage2DValidArgs) {
422 const int kWidth = 16;
423 const int kHeight = 8;
424 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
425 DoTexImage2D(GL_TEXTURE_2D,
434 kSharedMemoryOffset);
436 CopyTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight))
438 .RetiresOnSaturation();
439 CopyTexSubImage2D cmd;
440 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight);
441 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
442 EXPECT_EQ(GL_NO_ERROR, GetGLError());
445 TEST_P(GLES2DecoderTest, CopyTexSubImage2DBadArgs) {
446 const int kWidth = 16;
447 const int kHeight = 8;
448 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
449 DoTexImage2D(GL_TEXTURE_2D,
459 CopyTexSubImage2D cmd;
460 cmd.Init(GL_TEXTURE0, 1, 0, 0, 0, 0, kWidth, kHeight);
461 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
462 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
463 cmd.Init(GL_TEXTURE_2D, 1, -1, 0, 0, 0, kWidth, kHeight);
464 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
465 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
466 cmd.Init(GL_TEXTURE_2D, 1, 1, 0, 0, 0, kWidth, kHeight);
467 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
468 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
469 cmd.Init(GL_TEXTURE_2D, 1, 0, -1, 0, 0, kWidth, kHeight);
470 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
471 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
472 cmd.Init(GL_TEXTURE_2D, 1, 0, 1, 0, 0, kWidth, kHeight);
473 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
474 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
475 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth + 1, kHeight);
476 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
477 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
478 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight + 1);
479 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
480 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
483 TEST_P(GLES2DecoderTest, TexImage2DRedefinitionSucceeds) {
484 const int kWidth = 16;
485 const int kHeight = 8;
486 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
487 EXPECT_CALL(*gl_, GetError()).WillRepeatedly(Return(GL_NO_ERROR));
488 for (int ii = 0; ii < 2; ++ii) {
492 TexImage2D(GL_TEXTURE_2D,
502 .RetiresOnSaturation();
503 cmd.Init(GL_TEXTURE_2D,
512 kSharedMemoryOffset);
514 SetupClearTextureExpectations(kServiceTextureId,
524 cmd.Init(GL_TEXTURE_2D,
535 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
537 TexSubImage2D(GL_TEXTURE_2D,
545 shared_memory_address_))
547 .RetiresOnSaturation();
548 // Consider this TexSubImage2D command part of the previous TexImage2D
549 // (last GL_TRUE argument). It will be skipped if there are bugs in the
550 // redefinition case.
552 cmd2.Init(GL_TEXTURE_2D,
563 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
567 TEST_P(GLES2DecoderTest, TexImage2DGLError) {
568 GLenum target = GL_TEXTURE_2D;
570 GLenum internal_format = GL_RGBA;
574 GLenum format = GL_RGBA;
575 GLenum type = GL_UNSIGNED_BYTE;
576 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
577 TextureManager* manager = group().texture_manager();
578 TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
579 ASSERT_TRUE(texture_ref != NULL);
580 Texture* texture = texture_ref->texture();
581 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
582 EXPECT_CALL(*gl_, GetError())
583 .WillOnce(Return(GL_NO_ERROR))
584 .WillOnce(Return(GL_OUT_OF_MEMORY))
585 .RetiresOnSaturation();
597 .RetiresOnSaturation();
608 kSharedMemoryOffset);
609 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
610 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
611 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
614 TEST_P(GLES2DecoderTest, CopyTexImage2DGLError) {
615 GLenum target = GL_TEXTURE_2D;
617 GLenum internal_format = GL_RGBA;
621 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
622 TextureManager* manager = group().texture_manager();
623 TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
624 ASSERT_TRUE(texture_ref != NULL);
625 Texture* texture = texture_ref->texture();
626 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
627 EXPECT_CALL(*gl_, GetError())
628 .WillOnce(Return(GL_NO_ERROR))
629 .WillOnce(Return(GL_OUT_OF_MEMORY))
630 .RetiresOnSaturation();
633 target, level, internal_format, 0, 0, width, height, border))
635 .RetiresOnSaturation();
637 cmd.Init(target, level, internal_format, 0, 0, width, height, border);
638 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
639 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
640 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height));
643 TEST_P(GLES2DecoderManualInitTest, CompressedTexImage2DBucketBadBucket) {
645 init.extensions = "GL_EXT_texture_compression_s3tc";
646 init.gl_version = "3.0";
647 init.bind_generates_resource = true;
650 const uint32 kBadBucketId = 123;
651 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
652 CompressedTexImage2DBucket cmd;
653 cmd.Init(GL_TEXTURE_2D,
655 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
660 EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
661 CompressedTexSubImage2DBucket cmd2;
662 cmd2.Init(GL_TEXTURE_2D,
668 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
670 EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
675 struct S3TCTestData {
680 } // anonymous namespace.
682 TEST_P(GLES2DecoderManualInitTest, CompressedTexImage2DS3TC) {
684 init.extensions = "GL_EXT_texture_compression_s3tc";
685 init.gl_version = "3.0";
686 init.bind_generates_resource = true;
688 const uint32 kBucketId = 123;
689 CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId);
690 ASSERT_TRUE(bucket != NULL);
692 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
694 static const S3TCTestData test_data[] = {
696 GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8,
699 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8,
702 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 16,
705 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 16,
709 for (size_t ii = 0; ii < arraysize(test_data); ++ii) {
710 const S3TCTestData& test = test_data[ii];
711 CompressedTexImage2DBucket cmd;
713 DoCompressedTexImage2D(
714 GL_TEXTURE_2D, 0, test.format, 2, 4, 0, test.block_size, kBucketId);
715 EXPECT_EQ(GL_NO_ERROR, GetGLError());
718 cmd.Init(GL_TEXTURE_2D, 0, test.format, 5, 4, 0, kBucketId);
719 bucket->SetSize(test.block_size * 2);
720 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
721 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
723 // test small height.
724 DoCompressedTexImage2D(
725 GL_TEXTURE_2D, 0, test.format, 4, 2, 0, test.block_size, kBucketId);
726 EXPECT_EQ(GL_NO_ERROR, GetGLError());
728 // test too bad height.
729 cmd.Init(GL_TEXTURE_2D, 0, test.format, 4, 5, 0, kBucketId);
730 bucket->SetSize(test.block_size * 2);
731 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
732 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
734 // test small for level 0.
735 DoCompressedTexImage2D(
736 GL_TEXTURE_2D, 0, test.format, 1, 1, 0, test.block_size, kBucketId);
737 EXPECT_EQ(GL_NO_ERROR, GetGLError());
739 // test small for level 0.
740 DoCompressedTexImage2D(
741 GL_TEXTURE_2D, 0, test.format, 2, 2, 0, test.block_size, kBucketId);
742 EXPECT_EQ(GL_NO_ERROR, GetGLError());
744 // test size too large.
745 cmd.Init(GL_TEXTURE_2D, 0, test.format, 4, 4, 0, kBucketId);
746 bucket->SetSize(test.block_size * 2);
747 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
748 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
750 // test size too small.
751 cmd.Init(GL_TEXTURE_2D, 0, test.format, 4, 4, 0, kBucketId);
752 bucket->SetSize(test.block_size / 2);
753 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
754 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
757 DoCompressedTexImage2D(
758 GL_TEXTURE_2D, 0, test.format, 4, 4, 0, test.block_size, kBucketId);
759 DoCompressedTexImage2D(
760 GL_TEXTURE_2D, 1, test.format, 2, 2, 0, test.block_size, kBucketId);
761 DoCompressedTexImage2D(
762 GL_TEXTURE_2D, 2, test.format, 1, 1, 0, test.block_size, kBucketId);
763 EXPECT_EQ(GL_NO_ERROR, GetGLError());
766 DoCompressedTexImage2D(GL_TEXTURE_2D,
772 test.block_size * 4 * 4,
774 EXPECT_EQ(GL_NO_ERROR, GetGLError());
776 CompressedTexSubImage2DBucket sub_cmd;
777 bucket->SetSize(test.block_size);
778 // Test sub image bad xoffset
779 sub_cmd.Init(GL_TEXTURE_2D, 0, 1, 0, 4, 4, test.format, kBucketId);
780 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
781 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
783 // Test sub image bad yoffset
784 sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 2, 4, 4, test.format, kBucketId);
785 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
786 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
788 // Test sub image bad width
789 bucket->SetSize(test.block_size * 2);
790 sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 5, 4, test.format, kBucketId);
791 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
792 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
794 // Test sub image bad height
795 sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 5, test.format, kBucketId);
796 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
797 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
799 // Test sub image bad size
800 bucket->SetSize(test.block_size + 1);
801 sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, test.format, kBucketId);
802 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
803 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
805 for (GLint yoffset = 0; yoffset <= 8; yoffset += 4) {
806 for (GLint xoffset = 0; xoffset <= 8; xoffset += 4) {
807 for (GLsizei height = 4; height <= 8; height += 4) {
808 for (GLsizei width = 4; width <= 8; width += 4) {
809 GLsizei size = test.block_size * (width / 4) * (height / 4);
810 bucket->SetSize(size);
812 CompressedTexSubImage2D(GL_TEXTURE_2D,
822 .RetiresOnSaturation();
823 sub_cmd.Init(GL_TEXTURE_2D,
831 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
832 EXPECT_EQ(GL_NO_ERROR, GetGLError());
840 TEST_P(GLES2DecoderManualInitTest, CompressedTexImage2DETC1) {
842 init.extensions = "GL_OES_compressed_ETC1_RGB8_texture";
843 init.gl_version = "opengl es 2.0";
844 init.bind_generates_resource = true;
846 const uint32 kBucketId = 123;
847 CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId);
848 ASSERT_TRUE(bucket != NULL);
850 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
852 const GLenum kFormat = GL_ETC1_RGB8_OES;
853 const size_t kBlockSize = 8;
855 CompressedTexImage2DBucket cmd;
857 DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 4, 8, 0, 16, kBucketId);
858 EXPECT_EQ(GL_NO_ERROR, GetGLError());
860 // test small height.
861 DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 8, 4, 0, 16, kBucketId);
862 EXPECT_EQ(GL_NO_ERROR, GetGLError());
864 // test size too large.
865 cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, 0, kBucketId);
866 bucket->SetSize(kBlockSize * 2);
867 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
868 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
870 // test size too small.
871 cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, 0, kBucketId);
872 bucket->SetSize(kBlockSize / 2);
873 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
874 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
877 DoCompressedTexImage2D(
878 GL_TEXTURE_2D, 0, kFormat, 16, 16, 0, kBlockSize * 16, kBucketId);
879 EXPECT_EQ(GL_NO_ERROR, GetGLError());
881 // Test CompressedTexSubImage not allowed
882 CompressedTexSubImage2DBucket sub_cmd;
883 bucket->SetSize(kBlockSize);
884 sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, kFormat, kBucketId);
885 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd));
886 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
888 // Test TexSubImage not allowed for ETC1 compressed texture
889 TextureRef* texture_ref = GetTexture(client_texture_id_);
890 ASSERT_TRUE(texture_ref != NULL);
891 Texture* texture = texture_ref->texture();
892 GLenum type, internal_format;
893 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
894 EXPECT_EQ(kFormat, internal_format);
895 TexSubImage2D texsub_cmd;
896 texsub_cmd.Init(GL_TEXTURE_2D,
907 EXPECT_EQ(error::kNoError, ExecuteCmd(texsub_cmd));
908 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
910 // Test CopyTexSubImage not allowed for ETC1 compressed texture
911 CopyTexSubImage2D copy_cmd;
912 copy_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4);
913 EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd));
914 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
917 TEST_P(GLES2DecoderManualInitTest, EGLImageExternalBindTexture) {
919 init.extensions = "GL_OES_EGL_image_external";
920 init.gl_version = "opengl es 2.0";
921 init.bind_generates_resource = true;
923 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_EXTERNAL_OES, kNewServiceId));
924 EXPECT_CALL(*gl_, GenTextures(1, _))
925 .WillOnce(SetArgumentPointee<1>(kNewServiceId));
927 cmd.Init(GL_TEXTURE_EXTERNAL_OES, kNewClientId);
928 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
929 EXPECT_EQ(GL_NO_ERROR, GetGLError());
930 TextureRef* texture_ref = GetTexture(kNewClientId);
931 EXPECT_TRUE(texture_ref != NULL);
932 EXPECT_TRUE(texture_ref->texture()->target() == GL_TEXTURE_EXTERNAL_OES);
935 TEST_P(GLES2DecoderManualInitTest, EGLImageExternalGetBinding) {
937 init.extensions = "GL_OES_EGL_image_external";
938 init.gl_version = "opengl es 2.0";
939 init.bind_generates_resource = true;
941 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
943 EXPECT_CALL(*gl_, GetError())
944 .WillOnce(Return(GL_NO_ERROR))
945 .WillOnce(Return(GL_NO_ERROR))
946 .RetiresOnSaturation();
947 typedef GetIntegerv::Result Result;
948 Result* result = static_cast<Result*>(shared_memory_address_);
950 GetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, result->GetData()))
954 cmd.Init(GL_TEXTURE_BINDING_EXTERNAL_OES,
956 shared_memory_offset_);
957 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
958 EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
959 GL_TEXTURE_BINDING_EXTERNAL_OES),
960 result->GetNumResults());
961 EXPECT_EQ(GL_NO_ERROR, GetGLError());
962 EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]);
965 TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTextureDefaults) {
967 init.extensions = "GL_OES_EGL_image_external";
968 init.gl_version = "opengl es 2.0";
969 init.bind_generates_resource = true;
971 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
973 TextureRef* texture_ref = GetTexture(client_texture_id_);
974 EXPECT_TRUE(texture_ref != NULL);
975 Texture* texture = texture_ref->texture();
976 EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES);
977 EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
978 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
979 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
982 TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTextureParam) {
984 init.extensions = "GL_OES_EGL_image_external";
985 init.gl_version = "opengl es 2.0";
986 init.bind_generates_resource = true;
988 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
992 GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
995 TexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
999 GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
1003 GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
1005 cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1006 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1007 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1009 cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1010 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1011 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1013 cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1014 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1015 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1017 cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1018 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1019 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1021 TextureRef* texture_ref = GetTexture(client_texture_id_);
1022 EXPECT_TRUE(texture_ref != NULL);
1023 Texture* texture = texture_ref->texture();
1024 EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES);
1025 EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
1026 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
1027 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
1030 TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTextureParamInvalid) {
1032 init.extensions = "GL_OES_EGL_image_external";
1033 init.gl_version = "opengl es 2.0";
1034 init.bind_generates_resource = true;
1036 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
1039 cmd.Init(GL_TEXTURE_EXTERNAL_OES,
1040 GL_TEXTURE_MIN_FILTER,
1041 GL_NEAREST_MIPMAP_NEAREST);
1042 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1043 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1045 cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_REPEAT);
1046 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1047 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1049 cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_REPEAT);
1050 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1051 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1053 TextureRef* texture_ref = GetTexture(client_texture_id_);
1054 EXPECT_TRUE(texture_ref != NULL);
1055 Texture* texture = texture_ref->texture();
1056 EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES);
1057 EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
1058 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
1059 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
1062 TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTexImage2DError) {
1064 init.extensions = "GL_OES_EGL_image_external";
1065 init.gl_version = "opengl es 2.0";
1066 init.bind_generates_resource = true;
1069 GLenum target = GL_TEXTURE_EXTERNAL_OES;
1071 GLenum internal_format = GL_RGBA;
1075 GLenum format = GL_RGBA;
1076 GLenum type = GL_UNSIGNED_BYTE;
1077 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
1078 ASSERT_TRUE(GetTexture(client_texture_id_) != NULL);
1089 kSharedMemoryOffset);
1090 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1092 // TexImage2D is not allowed with GL_TEXTURE_EXTERNAL_OES targets.
1093 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1096 TEST_P(GLES2DecoderManualInitTest, DefaultTextureZero) {
1098 init.gl_version = "3.0";
1102 cmd1.Init(GL_TEXTURE_2D, 0);
1103 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1104 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1105 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1108 cmd2.Init(GL_TEXTURE_CUBE_MAP, 0);
1109 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
1110 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1111 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1114 TEST_P(GLES2DecoderManualInitTest, DefaultTextureBGR) {
1116 init.gl_version = "3.0";
1117 init.bind_generates_resource = true;
1121 cmd1.Init(GL_TEXTURE_2D, 0);
1123 *gl_, BindTexture(GL_TEXTURE_2D, TestHelper::kServiceDefaultTexture2dId));
1124 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1125 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1128 cmd2.Init(GL_TEXTURE_CUBE_MAP, 0);
1130 BindTexture(GL_TEXTURE_CUBE_MAP,
1131 TestHelper::kServiceDefaultTextureCubemapId));
1132 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1133 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1136 // Test that default texture 0 is immutable.
1137 TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameterf) {
1139 init.gl_version = "3.0";
1144 cmd1.Init(GL_TEXTURE_2D, 0);
1145 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1146 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1147 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1150 cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1151 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1152 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1157 cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
1158 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
1159 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1160 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1163 cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1164 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1165 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1169 TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameteri) {
1171 init.gl_version = "3.0";
1176 cmd1.Init(GL_TEXTURE_2D, 0);
1177 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1178 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1179 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1182 cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1183 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1184 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1189 cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
1190 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
1191 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1192 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1195 cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1196 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1197 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1201 TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameterfv) {
1203 init.gl_version = "3.0";
1208 cmd1.Init(GL_TEXTURE_2D, 0);
1209 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1210 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1211 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1213 TexParameterfv cmd2;
1214 cmd2.Init(GL_TEXTURE_2D,
1215 GL_TEXTURE_MAG_FILTER,
1217 shared_memory_offset_);
1218 GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST;
1219 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1220 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1225 cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
1226 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
1227 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1228 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1230 TexParameterfv cmd2;
1231 cmd2.Init(GL_TEXTURE_CUBE_MAP,
1232 GL_TEXTURE_MAG_FILTER,
1234 shared_memory_offset_);
1235 GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST;
1236 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1237 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1241 TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameteriv) {
1243 init.gl_version = "3.0";
1248 cmd1.Init(GL_TEXTURE_2D, 0);
1249 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1250 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1251 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1253 TexParameteriv cmd2;
1254 cmd2.Init(GL_TEXTURE_2D,
1255 GL_TEXTURE_MAG_FILTER,
1257 shared_memory_offset_);
1258 GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST;
1259 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1260 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1265 cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
1266 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
1267 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1268 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1270 TexParameteriv cmd2;
1271 cmd2.Init(GL_TEXTURE_CUBE_MAP,
1272 GL_TEXTURE_MAG_FILTER,
1274 shared_memory_offset_);
1275 GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST;
1276 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1277 EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
1281 TEST_P(GLES2DecoderManualInitTest, NoDefaultTexImage2D) {
1283 init.gl_version = "3.0";
1287 cmd1.Init(GL_TEXTURE_2D, 0);
1288 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1289 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1290 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1293 cmd2.Init(GL_TEXTURE_2D,
1302 kSharedMemoryOffset);
1303 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1304 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
1307 TEST_P(GLES2DecoderManualInitTest, NoDefaultTexSubImage2D) {
1309 init.gl_version = "3.0";
1313 cmd1.Init(GL_TEXTURE_2D, 0);
1314 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
1315 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
1316 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1319 cmd2.Init(GL_TEXTURE_2D,
1328 kSharedMemoryOffset,
1330 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
1331 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
1334 TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleBindTexture) {
1336 init.extensions = "GL_ARB_texture_rectangle";
1337 init.gl_version = "3.0";
1338 init.bind_generates_resource = true;
1340 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_RECTANGLE_ARB, kNewServiceId));
1341 EXPECT_CALL(*gl_, GenTextures(1, _))
1342 .WillOnce(SetArgumentPointee<1>(kNewServiceId));
1344 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, kNewClientId);
1345 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1346 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1347 Texture* texture = GetTexture(kNewClientId)->texture();
1348 EXPECT_TRUE(texture != NULL);
1349 EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
1352 TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleGetBinding) {
1354 init.extensions = "GL_ARB_texture_rectangle";
1355 init.gl_version = "3.0";
1356 init.bind_generates_resource = true;
1359 GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
1361 EXPECT_CALL(*gl_, GetError())
1362 .WillOnce(Return(GL_NO_ERROR))
1363 .WillOnce(Return(GL_NO_ERROR))
1364 .RetiresOnSaturation();
1365 typedef GetIntegerv::Result Result;
1366 Result* result = static_cast<Result*>(shared_memory_address_);
1368 GetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, result->GetData()))
1372 cmd.Init(GL_TEXTURE_BINDING_RECTANGLE_ARB,
1374 shared_memory_offset_);
1375 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1376 EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
1377 GL_TEXTURE_BINDING_RECTANGLE_ARB),
1378 result->GetNumResults());
1379 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1380 EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]);
1383 TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTextureDefaults) {
1385 init.extensions = "GL_ARB_texture_rectangle";
1386 init.gl_version = "3.0";
1387 init.bind_generates_resource = true;
1390 GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
1392 Texture* texture = GetTexture(client_texture_id_)->texture();
1393 EXPECT_TRUE(texture != NULL);
1394 EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
1395 EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
1396 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
1397 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
1400 TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParam) {
1402 init.extensions = "GL_ARB_texture_rectangle";
1403 init.gl_version = "3.0";
1404 init.bind_generates_resource = true;
1408 GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
1412 GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
1415 GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
1419 GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
1423 GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
1425 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1426 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1427 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1429 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1430 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1431 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1433 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1434 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1435 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1437 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1438 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1439 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1441 Texture* texture = GetTexture(client_texture_id_)->texture();
1442 EXPECT_TRUE(texture != NULL);
1443 EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
1444 EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
1445 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
1446 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
1449 TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParamInvalid) {
1451 init.extensions = "GL_ARB_texture_rectangle";
1452 init.gl_version = "3.0";
1453 init.bind_generates_resource = true;
1457 GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
1460 cmd.Init(GL_TEXTURE_RECTANGLE_ARB,
1461 GL_TEXTURE_MIN_FILTER,
1462 GL_NEAREST_MIPMAP_NEAREST);
1463 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1464 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1466 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_REPEAT);
1467 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1468 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1470 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_REPEAT);
1471 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1472 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1474 Texture* texture = GetTexture(client_texture_id_)->texture();
1475 EXPECT_TRUE(texture != NULL);
1476 EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB);
1477 EXPECT_TRUE(texture->min_filter() == GL_LINEAR);
1478 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE);
1479 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE);
1482 TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTexImage2DError) {
1484 init.extensions = "GL_ARB_texture_rectangle";
1485 init.gl_version = "3.0";
1486 init.bind_generates_resource = true;
1489 GLenum target = GL_TEXTURE_RECTANGLE_ARB;
1491 GLenum internal_format = GL_RGBA;
1495 GLenum format = GL_RGBA;
1496 GLenum type = GL_UNSIGNED_BYTE;
1498 GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId);
1499 ASSERT_TRUE(GetTexture(client_texture_id_) != NULL);
1510 kSharedMemoryOffset);
1511 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1513 // TexImage2D is not allowed with GL_TEXTURE_RECTANGLE_ARB targets.
1514 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1517 TEST_P(GLES2DecoderManualInitTest, TexSubImage2DClearsAfterTexImage2DNULL) {
1519 init.gl_version = "opengl es 2.0";
1520 init.has_alpha = true;
1521 init.has_depth = true;
1522 init.request_alpha = true;
1523 init.request_depth = true;
1526 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1528 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1529 SetupClearTextureExpectations(kServiceTextureId,
1540 TexSubImage2D(GL_TEXTURE_2D,
1548 shared_memory_address_))
1550 .RetiresOnSaturation();
1552 cmd.Init(GL_TEXTURE_2D,
1561 kSharedMemoryOffset,
1563 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1564 // Test if we call it again it does not clear.
1566 TexSubImage2D(GL_TEXTURE_2D,
1574 shared_memory_address_))
1576 .RetiresOnSaturation();
1577 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1580 TEST_P(GLES2DecoderTest, TexSubImage2DDoesNotClearAfterTexImage2DNULLThenData) {
1581 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1583 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1584 DoTexImage2D(GL_TEXTURE_2D,
1593 kSharedMemoryOffset);
1595 TexSubImage2D(GL_TEXTURE_2D,
1603 shared_memory_address_))
1605 .RetiresOnSaturation();
1607 cmd.Init(GL_TEXTURE_2D,
1616 kSharedMemoryOffset,
1618 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1619 // Test if we call it again it does not clear.
1621 TexSubImage2D(GL_TEXTURE_2D,
1629 shared_memory_address_))
1631 .RetiresOnSaturation();
1632 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1636 GLES2DecoderManualInitTest,
1637 TexSubImage2DDoesNotClearAfterTexImage2DNULLThenDataWithTexImage2DIsFaster) {
1638 CommandLine command_line(0, NULL);
1639 command_line.AppendSwitchASCII(
1640 switches::kGpuDriverBugWorkarounds,
1641 base::IntToString(gpu::TEXSUBIMAGE2D_FASTER_THAN_TEXIMAGE2D));
1643 init.gl_version = "3.0";
1644 init.bind_generates_resource = true;
1645 InitDecoderWithCommandLine(init, &command_line);
1646 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1648 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1651 // Uses texSubimage internally because the above workaround is active and
1652 // the update is for the full size of the texture.
1655 GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, _))
1657 .RetiresOnSaturation();
1658 cmds::TexImage2D cmd;
1659 cmd.Init(GL_TEXTURE_2D,
1668 kSharedMemoryOffset);
1669 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1673 TexSubImage2D(GL_TEXTURE_2D,
1681 shared_memory_address_))
1683 .RetiresOnSaturation();
1685 cmd.Init(GL_TEXTURE_2D,
1694 kSharedMemoryOffset,
1696 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1697 // Test if we call it again it does not clear.
1699 TexSubImage2D(GL_TEXTURE_2D,
1707 shared_memory_address_))
1709 .RetiresOnSaturation();
1710 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1713 TEST_P(GLES2DecoderTest, TexSubImage2DClearsAfterTexImage2DWithDataThenNULL) {
1714 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1715 // Put in data (so it should be marked as cleared)
1716 DoTexImage2D(GL_TEXTURE_2D,
1725 kSharedMemoryOffset);
1729 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1730 // It won't actually call TexImage2D, just mark it as uncleared.
1731 EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd));
1732 // Next call to TexSubImage2d should clear.
1733 SetupClearTextureExpectations(kServiceTextureId,
1744 TexSubImage2D(GL_TEXTURE_2D,
1752 shared_memory_address_))
1754 .RetiresOnSaturation();
1756 cmd.Init(GL_TEXTURE_2D,
1765 kSharedMemoryOffset,
1767 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1770 TEST_P(GLES2DecoderTest, CopyTexImage2DMarksTextureAsCleared) {
1771 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1773 TextureManager* manager = group().texture_manager();
1774 TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
1775 ASSERT_TRUE(texture_ref != NULL);
1776 Texture* texture = texture_ref->texture();
1778 EXPECT_CALL(*gl_, GetError())
1779 .WillOnce(Return(GL_NO_ERROR))
1780 .RetiresOnSaturation();
1781 EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0))
1783 .RetiresOnSaturation();
1784 EXPECT_CALL(*gl_, GetError())
1785 .WillOnce(Return(GL_NO_ERROR))
1786 .RetiresOnSaturation();
1788 cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
1789 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1791 EXPECT_TRUE(texture->SafeToRenderFrom());
1794 TEST_P(GLES2DecoderTest, CopyTexSubImage2DClearsUnclearedTexture) {
1795 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1797 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1799 SetupClearTextureExpectations(kServiceTextureId,
1809 EXPECT_CALL(*gl_, CopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1))
1811 .RetiresOnSaturation();
1812 CopyTexSubImage2D cmd;
1813 cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
1814 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1817 TEST_P(GLES2DecoderManualInitTest, CompressedImage2DMarksTextureAsCleared) {
1819 init.extensions = "GL_EXT_texture_compression_s3tc";
1820 init.gl_version = "3.0";
1821 init.bind_generates_resource = true;
1824 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1825 EXPECT_CALL(*gl_, GetError())
1826 .WillOnce(Return(GL_NO_ERROR))
1827 .RetiresOnSaturation();
1830 CompressedTexImage2D(
1831 GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, 8, _))
1833 .RetiresOnSaturation();
1834 EXPECT_CALL(*gl_, GetError())
1835 .WillOnce(Return(GL_NO_ERROR))
1836 .RetiresOnSaturation();
1837 CompressedTexImage2D cmd;
1838 cmd.Init(GL_TEXTURE_2D,
1840 GL_COMPRESSED_RGB_S3TC_DXT1_EXT,
1846 kSharedMemoryOffset);
1847 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1848 TextureManager* manager = group().texture_manager();
1849 TextureRef* texture_ref = manager->GetTexture(client_texture_id_);
1850 EXPECT_TRUE(texture_ref->texture()->SafeToRenderFrom());
1853 TEST_P(GLES2DecoderTest, TextureUsageAngleExtNotEnabledByDefault) {
1854 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1858 GL_TEXTURE_2D, GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE);
1859 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
1860 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
1863 TEST_P(GLES2DecoderTest, ProduceAndConsumeTextureCHROMIUM) {
1864 Mailbox mailbox = Mailbox::Generate();
1866 memcpy(shared_memory_address_, mailbox.name, sizeof(mailbox.name));
1868 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1870 GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1872 GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
1873 TextureRef* texture_ref =
1874 group().texture_manager()->GetTexture(client_texture_id_);
1875 ASSERT_TRUE(texture_ref != NULL);
1876 Texture* texture = texture_ref->texture();
1877 EXPECT_EQ(kServiceTextureId, texture->service_id());
1879 ProduceTextureCHROMIUM produce_cmd;
1880 produce_cmd.Init(GL_TEXTURE_2D, kSharedMemoryId, kSharedMemoryOffset);
1881 EXPECT_EQ(error::kNoError, ExecuteCmd(produce_cmd));
1882 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1884 // Texture didn't change.
1888 GLenum internal_format;
1890 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
1891 EXPECT_EQ(3, width);
1892 EXPECT_EQ(1, height);
1893 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
1894 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
1895 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1897 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
1898 EXPECT_EQ(2, width);
1899 EXPECT_EQ(4, height);
1900 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format));
1901 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
1902 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1904 // Service ID has not changed.
1905 EXPECT_EQ(kServiceTextureId, texture->service_id());
1907 // Create new texture for consume.
1908 EXPECT_CALL(*gl_, GenTextures(_, _))
1909 .WillOnce(SetArgumentPointee<1>(kNewServiceId))
1910 .RetiresOnSaturation();
1911 DoBindTexture(GL_TEXTURE_2D, kNewClientId, kNewServiceId);
1913 // Assigns and binds original service size texture ID.
1914 EXPECT_CALL(*gl_, DeleteTextures(1, _)).Times(1).RetiresOnSaturation();
1915 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
1917 .RetiresOnSaturation();
1919 memcpy(shared_memory_address_, mailbox.name, sizeof(mailbox.name));
1920 ConsumeTextureCHROMIUM consume_cmd;
1921 consume_cmd.Init(GL_TEXTURE_2D, kSharedMemoryId, kSharedMemoryOffset);
1922 EXPECT_EQ(error::kNoError, ExecuteCmd(consume_cmd));
1923 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1925 // Texture is redefined.
1926 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
1927 EXPECT_EQ(3, width);
1928 EXPECT_EQ(1, height);
1929 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
1930 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
1931 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1933 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
1934 EXPECT_EQ(2, width);
1935 EXPECT_EQ(4, height);
1936 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format));
1937 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
1938 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
1940 // Service ID is restored.
1941 EXPECT_EQ(kServiceTextureId, texture->service_id());
1944 TEST_P(GLES2DecoderManualInitTest, DepthTextureBadArgs) {
1946 init.extensions = "GL_ANGLE_depth_texture";
1947 init.gl_version = "opengl es 2.0";
1948 init.has_depth = true;
1949 init.has_stencil = true;
1950 init.request_depth = true;
1951 init.request_stencil = true;
1952 init.bind_generates_resource = true;
1955 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
1956 // Check trying to upload data fails.
1958 tex_cmd.Init(GL_TEXTURE_2D,
1967 kSharedMemoryOffset);
1968 EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd));
1969 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
1971 tex_cmd.Init(GL_TEXTURE_2D,
1981 EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd));
1982 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
1983 // Make a 1 pixel depth texture.
1984 DoTexImage2D(GL_TEXTURE_2D,
1994 EXPECT_EQ(GL_NO_ERROR, GetGLError());
1996 // Check that trying to update it fails.
1997 TexSubImage2D tex_sub_cmd;
1998 tex_sub_cmd.Init(GL_TEXTURE_2D,
2007 kSharedMemoryOffset,
2009 EXPECT_EQ(error::kNoError, ExecuteCmd(tex_sub_cmd));
2010 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2012 // Check that trying to CopyTexImage2D fails
2013 CopyTexImage2D copy_tex_cmd;
2014 copy_tex_cmd.Init(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, 1, 1, 0);
2015 EXPECT_EQ(error::kNoError, ExecuteCmd(copy_tex_cmd));
2016 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2018 // Check that trying to CopyTexSubImage2D fails
2019 CopyTexSubImage2D copy_sub_cmd;
2020 copy_sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
2021 EXPECT_EQ(error::kNoError, ExecuteCmd(copy_sub_cmd));
2022 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2025 TEST_P(GLES2DecoderManualInitTest, GenerateMipmapDepthTexture) {
2027 init.extensions = "GL_ANGLE_depth_texture";
2028 init.gl_version = "opengl es 2.0";
2029 init.has_depth = true;
2030 init.has_stencil = true;
2031 init.request_depth = true;
2032 init.request_stencil = true;
2033 init.bind_generates_resource = true;
2035 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2036 DoTexImage2D(GL_TEXTURE_2D,
2047 cmd.Init(GL_TEXTURE_2D);
2048 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2049 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
2052 TEST_P(GLES2DecoderTest, BindTexImage2DCHROMIUM) {
2053 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2055 GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
2056 TextureRef* texture_ref =
2057 group().texture_manager()->GetTexture(client_texture_id_);
2058 ASSERT_TRUE(texture_ref != NULL);
2059 Texture* texture = texture_ref->texture();
2060 EXPECT_EQ(kServiceTextureId, texture->service_id());
2062 group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
2063 EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL);
2068 GLenum internal_format;
2070 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2071 EXPECT_EQ(3, width);
2072 EXPECT_EQ(1, height);
2073 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
2074 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
2075 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
2076 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2078 // Bind image to texture.
2079 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2080 EXPECT_CALL(*gl_, GetError())
2081 .WillOnce(Return(GL_NO_ERROR))
2082 .WillOnce(Return(GL_NO_ERROR))
2083 .RetiresOnSaturation();
2084 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
2085 bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1);
2086 EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
2087 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2088 // Image should now be set.
2089 EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2091 // Define new texture image.
2093 GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
2094 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2095 // Image should no longer be set.
2096 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2099 TEST_P(GLES2DecoderTest, BindTexImage2DCHROMIUMCubeMapNotAllowed) {
2100 group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
2101 DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId);
2103 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
2104 bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1);
2105 EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
2106 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
2109 TEST_P(GLES2DecoderTest, OrphanGLImageWithTexImage2D) {
2110 group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
2111 DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId);
2113 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
2114 bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1);
2115 EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
2116 EXPECT_EQ(GL_INVALID_ENUM, GetGLError());
2119 GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
2120 TextureRef* texture_ref =
2121 group().texture_manager()->GetTexture(client_texture_id_);
2122 ASSERT_TRUE(texture_ref != NULL);
2123 Texture* texture = texture_ref->texture();
2124 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2127 TEST_P(GLES2DecoderTest, ReleaseTexImage2DCHROMIUM) {
2128 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2130 GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0);
2131 TextureRef* texture_ref =
2132 group().texture_manager()->GetTexture(client_texture_id_);
2133 ASSERT_TRUE(texture_ref != NULL);
2134 Texture* texture = texture_ref->texture();
2135 EXPECT_EQ(kServiceTextureId, texture->service_id());
2137 group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1);
2138 EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL);
2143 GLenum internal_format;
2145 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2146 EXPECT_EQ(3, width);
2147 EXPECT_EQ(1, height);
2148 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format));
2149 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format);
2150 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
2151 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2153 // Bind image to texture.
2154 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2155 EXPECT_CALL(*gl_, GetError())
2156 .WillOnce(Return(GL_NO_ERROR))
2157 .WillOnce(Return(GL_NO_ERROR))
2158 .RetiresOnSaturation();
2159 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
2160 bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1);
2161 EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
2162 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2163 // Image should now be set.
2164 EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2166 // Release image from texture.
2167 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2168 EXPECT_CALL(*gl_, GetError())
2169 .WillOnce(Return(GL_NO_ERROR))
2170 .WillOnce(Return(GL_NO_ERROR))
2171 .RetiresOnSaturation();
2172 ReleaseTexImage2DCHROMIUM release_tex_image_2d_cmd;
2173 release_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1);
2174 EXPECT_EQ(error::kNoError, ExecuteCmd(release_tex_image_2d_cmd));
2175 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
2176 // Image should no longer be set.
2177 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
2180 class MockGLImage : public gfx::GLImage {
2184 // Overridden from gfx::GLImage:
2185 MOCK_METHOD0(Destroy, void());
2186 MOCK_METHOD0(GetSize, gfx::Size());
2187 MOCK_METHOD1(BindTexImage, bool(unsigned));
2188 MOCK_METHOD1(ReleaseTexImage, void(unsigned));
2189 MOCK_METHOD0(WillUseTexImage, void());
2190 MOCK_METHOD0(DidUseTexImage, void());
2191 MOCK_METHOD0(WillModifyTexImage, void());
2192 MOCK_METHOD0(DidModifyTexImage, void());
2195 virtual ~MockGLImage() {}
2198 TEST_P(GLES2DecoderWithShaderTest, UseTexImage) {
2199 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2200 DoTexImage2D(GL_TEXTURE_2D,
2209 kSharedMemoryOffset);
2211 TextureRef* texture_ref =
2212 group().texture_manager()->GetTexture(client_texture_id_);
2213 ASSERT_TRUE(texture_ref != NULL);
2214 Texture* texture = texture_ref->texture();
2215 EXPECT_EQ(kServiceTextureId, texture->service_id());
2217 const int32 kImageId = 1;
2218 scoped_refptr<MockGLImage> image(new MockGLImage);
2219 group().image_manager()->AddImage(image.get(), kImageId);
2221 // Bind image to texture.
2222 EXPECT_CALL(*image, BindTexImage(GL_TEXTURE_2D))
2224 .WillOnce(Return(true))
2225 .RetiresOnSaturation();
2226 EXPECT_CALL(*image, GetSize())
2228 .WillOnce(Return(gfx::Size(1, 1)))
2229 .RetiresOnSaturation();
2230 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2231 EXPECT_CALL(*gl_, GetError())
2232 .WillOnce(Return(GL_NO_ERROR))
2233 .WillOnce(Return(GL_NO_ERROR))
2234 .RetiresOnSaturation();
2235 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
2236 bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, kImageId);
2237 EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
2239 AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
2240 SetupExpectationsForApplyingDefaultDirtyState();
2242 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2243 EXPECT_CALL(*gl_, GetError())
2244 .WillOnce(Return(GL_NO_ERROR))
2245 .WillOnce(Return(GL_NO_ERROR))
2246 .WillOnce(Return(GL_NO_ERROR))
2247 .WillOnce(Return(GL_NO_ERROR))
2248 .RetiresOnSaturation();
2249 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(3).RetiresOnSaturation();
2250 EXPECT_CALL(*image, WillUseTexImage()).Times(1).RetiresOnSaturation();
2251 EXPECT_CALL(*image, DidUseTexImage()).Times(1).RetiresOnSaturation();
2252 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
2254 .RetiresOnSaturation();
2256 cmd.Init(GL_TRIANGLES, 0, kNumVertices);
2257 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2258 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2261 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
2262 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2263 EXPECT_CALL(*gl_, GetError())
2264 .WillOnce(Return(GL_NO_ERROR))
2265 .WillOnce(Return(GL_NO_ERROR))
2266 .RetiresOnSaturation();
2267 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation();
2268 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
2270 .RetiresOnSaturation();
2271 // Image will be 'in use' as long as bound to a framebuffer.
2272 EXPECT_CALL(*image, WillUseTexImage()).Times(1).RetiresOnSaturation();
2274 FramebufferTexture2DEXT(GL_FRAMEBUFFER,
2275 GL_COLOR_ATTACHMENT0,
2280 .RetiresOnSaturation();
2281 EXPECT_CALL(*gl_, GetError())
2282 .WillOnce(Return(GL_NO_ERROR))
2283 .WillOnce(Return(GL_NO_ERROR))
2284 .RetiresOnSaturation();
2285 FramebufferTexture2D fbtex_cmd;
2286 fbtex_cmd.Init(GL_FRAMEBUFFER,
2287 GL_COLOR_ATTACHMENT0,
2291 EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd));
2292 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2294 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2295 EXPECT_CALL(*gl_, GetError())
2296 .WillOnce(Return(GL_NO_ERROR))
2297 .WillOnce(Return(GL_NO_ERROR))
2298 .RetiresOnSaturation();
2300 FramebufferRenderbufferEXT(GL_FRAMEBUFFER,
2301 GL_COLOR_ATTACHMENT0,
2303 kServiceRenderbufferId))
2305 .RetiresOnSaturation();
2306 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation();
2307 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId))
2309 .RetiresOnSaturation();
2310 // Image should no longer be 'in use' after being unbound from framebuffer.
2311 EXPECT_CALL(*image, DidUseTexImage()).Times(1).RetiresOnSaturation();
2312 EXPECT_CALL(*gl_, GetError())
2313 .WillOnce(Return(GL_NO_ERROR))
2314 .WillOnce(Return(GL_NO_ERROR))
2315 .RetiresOnSaturation();
2316 FramebufferRenderbuffer fbrb_cmd;
2317 fbrb_cmd.Init(GL_FRAMEBUFFER,
2318 GL_COLOR_ATTACHMENT0,
2320 client_renderbuffer_id_);
2321 EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd));
2324 TEST_P(GLES2DecoderManualInitTest, DrawWithGLImageExternal) {
2326 init.extensions = "GL_OES_EGL_image_external";
2327 init.gl_version = "opengl es 2.0";
2328 init.has_alpha = true;
2329 init.has_depth = true;
2330 init.request_alpha = true;
2331 init.request_depth = true;
2332 init.bind_generates_resource = true;
2335 TextureRef* texture_ref = GetTexture(client_texture_id_);
2336 scoped_refptr<MockGLImage> image(new MockGLImage);
2337 group().texture_manager()->SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES);
2338 group().texture_manager()->SetLevelInfo(texture_ref,
2339 GL_TEXTURE_EXTERNAL_OES,
2349 group().texture_manager()->SetLevelImage(
2350 texture_ref, GL_TEXTURE_EXTERNAL_OES, 0, image);
2352 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId);
2353 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2355 SetupSamplerExternalProgram();
2357 AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0);
2358 SetupExpectationsForApplyingDefaultDirtyState();
2359 EXPECT_TRUE(group().texture_manager()->CanRender(texture_ref));
2362 EXPECT_CALL(*gl_, GetError())
2363 .WillOnce(Return(GL_NO_ERROR))
2364 .RetiresOnSaturation();
2365 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation();
2366 EXPECT_CALL(*image, WillUseTexImage()).Times(1).RetiresOnSaturation();
2367 EXPECT_CALL(*gl_, GetError())
2368 .WillOnce(Return(GL_NO_ERROR))
2369 .RetiresOnSaturation();
2370 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(1);
2371 EXPECT_CALL(*gl_, GetError())
2372 .WillOnce(Return(GL_NO_ERROR))
2373 .RetiresOnSaturation();
2374 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation();
2375 EXPECT_CALL(*image, DidUseTexImage()).Times(1).RetiresOnSaturation();
2376 EXPECT_CALL(*gl_, GetError())
2377 .WillOnce(Return(GL_NO_ERROR))
2378 .RetiresOnSaturation();
2379 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation();
2381 cmd.Init(GL_TRIANGLES,
2382 kValidIndexRangeCount,
2384 kValidIndexRangeStart * 2);
2385 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2386 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2389 TEST_P(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES2) {
2391 init.extensions = "GL_OES_texture_float";
2392 init.gl_version = "opengl es 2.0";
2394 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2395 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0);
2396 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0);
2398 GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, GL_LUMINANCE, GL_FLOAT, 0, 0);
2399 DoTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, GL_ALPHA, GL_FLOAT, 0, 0);
2400 DoTexImage2D(GL_TEXTURE_2D,
2412 TEST_P(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES3) {
2414 init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
2415 init.gl_version = "opengl es 3.0";
2417 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2418 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0);
2419 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0);
2421 GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0);
2423 GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, GL_LUMINANCE, GL_FLOAT, 0, 0);
2424 DoTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, GL_ALPHA, GL_FLOAT, 0, 0);
2425 DoTexImage2D(GL_TEXTURE_2D,
2437 TEST_P(GLES2DecoderManualInitTest, TexSubImage2DFloatOnGLES3) {
2439 init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
2440 init.gl_version = "opengl es 3.0";
2442 const int kWidth = 8;
2443 const int kHeight = 4;
2444 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2445 DoTexImage2D(GL_TEXTURE_2D,
2456 TexImage2D(GL_TEXTURE_2D,
2464 shared_memory_address_))
2466 .RetiresOnSaturation();
2468 cmd.Init(GL_TEXTURE_2D,
2477 kSharedMemoryOffset,
2479 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2480 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2483 TEST_P(GLES2DecoderManualInitTest, TexSubImage2DFloatDoesClearOnGLES3) {
2485 init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float";
2486 init.gl_version = "opengl es 3.0";
2488 const int kWidth = 8;
2489 const int kHeight = 4;
2490 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2491 DoTexImage2D(GL_TEXTURE_2D,
2501 SetupClearTextureExpectations(kServiceTextureId,
2512 TexSubImage2D(GL_TEXTURE_2D,
2520 shared_memory_address_))
2522 .RetiresOnSaturation();
2524 cmd.Init(GL_TEXTURE_2D,
2533 kSharedMemoryOffset,
2535 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2536 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2539 TEST_P(GLES2DecoderManualInitTest, TexImage2DFloatConvertsFormatDesktop) {
2541 init.extensions = "GL_ARB_texture_float";
2542 init.gl_version = "2.1";
2544 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
2546 GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0);
2547 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0);
2548 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D,
2559 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D,
2570 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D,
2580 GL_LUMINANCE32F_ARB);
2581 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D,
2592 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D,
2602 GL_LUMINANCE_ALPHA32F_ARB);
2605 class GLES2DecoderCompressedFormatsTest : public GLES2DecoderManualInitTest {
2607 GLES2DecoderCompressedFormatsTest() {}
2609 static bool ValueInArray(GLint value, GLint* array, GLint count) {
2610 for (GLint ii = 0; ii < count; ++ii) {
2611 if (array[ii] == value) {
2618 void CheckFormats(const char* extension, const GLenum* formats, int count) {
2620 init.extensions = extension;
2621 init.gl_version = "3.0";
2622 init.bind_generates_resource = true;
2625 EXPECT_CALL(*gl_, GetError())
2626 .WillOnce(Return(GL_NO_ERROR))
2627 .WillOnce(Return(GL_NO_ERROR))
2628 .WillOnce(Return(GL_NO_ERROR))
2629 .WillOnce(Return(GL_NO_ERROR))
2630 .RetiresOnSaturation();
2632 typedef GetIntegerv::Result Result;
2633 Result* result = static_cast<Result*>(shared_memory_address_);
2636 EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0).RetiresOnSaturation();
2637 cmd.Init(GL_NUM_COMPRESSED_TEXTURE_FORMATS,
2639 shared_memory_offset_);
2640 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2641 EXPECT_EQ(1, result->GetNumResults());
2642 GLint num_formats = result->GetData()[0];
2643 EXPECT_EQ(count, num_formats);
2644 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2647 cmd.Init(GL_COMPRESSED_TEXTURE_FORMATS,
2649 shared_memory_offset_);
2650 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2651 EXPECT_EQ(num_formats, result->GetNumResults());
2653 for (int i = 0; i < count; ++i) {
2655 ValueInArray(formats[i], result->GetData(), result->GetNumResults()));
2658 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2662 INSTANTIATE_TEST_CASE_P(Service,
2663 GLES2DecoderCompressedFormatsTest,
2666 TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsS3TC) {
2667 const GLenum formats[] = {
2668 GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
2669 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT};
2670 CheckFormats("GL_EXT_texture_compression_s3tc", formats, 4);
2673 TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsATC) {
2674 const GLenum formats[] = {GL_ATC_RGB_AMD, GL_ATC_RGBA_EXPLICIT_ALPHA_AMD,
2675 GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD};
2676 CheckFormats("GL_AMD_compressed_ATC_texture", formats, 3);
2679 TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsPVRTC) {
2680 const GLenum formats[] = {
2681 GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG,
2682 GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG};
2683 CheckFormats("GL_IMG_texture_compression_pvrtc", formats, 4);
2686 TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsETC1) {
2687 const GLenum formats[] = {GL_ETC1_RGB8_OES};
2688 CheckFormats("GL_OES_compressed_ETC1_RGB8_texture", formats, 1);
2691 TEST_P(GLES2DecoderManualInitTest, GetNoCompressedTextureFormats) {
2693 init.gl_version = "3.0";
2694 init.bind_generates_resource = true;
2697 EXPECT_CALL(*gl_, GetError())
2698 .WillOnce(Return(GL_NO_ERROR))
2699 .WillOnce(Return(GL_NO_ERROR))
2700 .WillOnce(Return(GL_NO_ERROR))
2701 .WillOnce(Return(GL_NO_ERROR))
2702 .RetiresOnSaturation();
2704 typedef GetIntegerv::Result Result;
2705 Result* result = static_cast<Result*>(shared_memory_address_);
2708 EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0).RetiresOnSaturation();
2709 cmd.Init(GL_NUM_COMPRESSED_TEXTURE_FORMATS,
2711 shared_memory_offset_);
2712 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2713 EXPECT_EQ(1, result->GetNumResults());
2714 GLint num_formats = result->GetData()[0];
2715 EXPECT_EQ(0, num_formats);
2716 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2720 GL_COMPRESSED_TEXTURE_FORMATS, shared_memory_id_, shared_memory_offset_);
2721 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
2722 EXPECT_EQ(num_formats, result->GetNumResults());
2724 EXPECT_EQ(GL_NO_ERROR, GetGLError());
2727 // TODO(gman): Complete this test.
2728 // TEST_P(GLES2DecoderTest, CompressedTexImage2DGLError) {
2731 // TODO(gman): CompressedTexImage2D
2733 // TODO(gman): CompressedTexImage2DImmediate
2735 // TODO(gman): CompressedTexSubImage2DImmediate
2737 // TODO(gman): TexImage2D
2739 // TODO(gman): TexImage2DImmediate
2741 // TODO(gman): TexSubImage2DImmediate
2743 } // namespace gles2