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/cmd_buffer_engine.h"
13 #include "gpu/command_buffer/service/context_group.h"
14 #include "gpu/command_buffer/service/context_state.h"
15 #include "gpu/command_buffer/service/gl_surface_mock.h"
16 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h"
17 #include "gpu/command_buffer/service/image_manager.h"
18 #include "gpu/command_buffer/service/mailbox_manager.h"
19 #include "gpu/command_buffer/service/mocks.h"
20 #include "gpu/command_buffer/service/program_manager.h"
21 #include "gpu/command_buffer/service/test_helper.h"
22 #include "gpu/config/gpu_switches.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24 #include "ui/gl/gl_image_stub.h"
25 #include "ui/gl/gl_implementation.h"
26 #include "ui/gl/gl_mock.h"
27 #include "ui/gl/gl_surface_stub.h"
29 #if !defined(GL_DEPTH24_STENCIL8)
30 #define GL_DEPTH24_STENCIL8 0x88F0
33 using ::gfx::MockGLInterface
;
35 using ::testing::DoAll
;
36 using ::testing::InSequence
;
37 using ::testing::Invoke
;
38 using ::testing::MatcherCast
;
39 using ::testing::Mock
;
40 using ::testing::Pointee
;
41 using ::testing::Return
;
42 using ::testing::SaveArg
;
43 using ::testing::SetArrayArgument
;
44 using ::testing::SetArgumentPointee
;
45 using ::testing::SetArgPointee
;
46 using ::testing::StrEq
;
47 using ::testing::StrictMock
;
54 TEST_P(GLES2DecoderTest
, GenerateMipmapWrongFormatsFails
) {
55 EXPECT_CALL(*gl_
, GenerateMipmapEXT(_
)).Times(0);
56 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
58 GL_TEXTURE_2D
, 0, GL_RGBA
, 16, 17, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
60 cmd
.Init(GL_TEXTURE_2D
);
61 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
62 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
65 TEST_P(GLES2DecoderTest
, GenerateMipmapHandlesOutOfMemory
) {
66 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
67 TextureManager
* manager
= group().texture_manager();
68 TextureRef
* texture_ref
= manager
->GetTexture(client_texture_id_
);
69 ASSERT_TRUE(texture_ref
!= NULL
);
70 Texture
* texture
= texture_ref
->texture();
74 texture
->GetLevelSize(GL_TEXTURE_2D
, 2, &width
, &height
, nullptr));
75 DoTexImage2D(GL_TEXTURE_2D
,
85 EXPECT_CALL(*gl_
, GenerateMipmapEXT(GL_TEXTURE_2D
)).Times(1);
86 EXPECT_CALL(*gl_
, GetError())
87 .WillOnce(Return(GL_NO_ERROR
))
88 .WillOnce(Return(GL_OUT_OF_MEMORY
))
89 .RetiresOnSaturation();
91 cmd
.Init(GL_TEXTURE_2D
);
92 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
93 EXPECT_EQ(GL_OUT_OF_MEMORY
, GetGLError());
95 texture
->GetLevelSize(GL_TEXTURE_2D
, 2, &width
, &height
, nullptr));
98 TEST_P(GLES2DecoderTest
, GenerateMipmapClearsUnclearedTexture
) {
99 EXPECT_CALL(*gl_
, GenerateMipmapEXT(_
)).Times(0);
100 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
102 GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
103 SetupClearTextureExpectations(kServiceTextureId
, kServiceTextureId
,
104 GL_TEXTURE_2D
, GL_TEXTURE_2D
, 0, GL_RGBA
,
105 GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0, 2, 2);
106 EXPECT_CALL(*gl_
, GenerateMipmapEXT(GL_TEXTURE_2D
));
107 EXPECT_CALL(*gl_
, GetError())
108 .WillOnce(Return(GL_NO_ERROR
))
109 .WillOnce(Return(GL_NO_ERROR
))
110 .RetiresOnSaturation();
112 cmd
.Init(GL_TEXTURE_2D
);
113 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
114 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
117 // Same as GenerateMipmapClearsUnclearedTexture, but with workaround
118 // |set_texture_filters_before_generating_mipmap|.
119 TEST_P(GLES2DecoderManualInitTest
, SetTextureFiltersBeforeGenerateMipmap
) {
120 base::CommandLine
command_line(0, NULL
);
121 command_line
.AppendSwitchASCII(
122 switches::kGpuDriverBugWorkarounds
,
123 base::IntToString(gpu::SET_TEXTURE_FILTER_BEFORE_GENERATING_MIPMAP
));
125 init
.bind_generates_resource
= true;
126 InitDecoderWithCommandLine(init
, &command_line
);
128 EXPECT_CALL(*gl_
, GenerateMipmapEXT(_
)).Times(0);
129 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
131 GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
132 SetupClearTextureExpectations(kServiceTextureId
, kServiceTextureId
,
133 GL_TEXTURE_2D
, GL_TEXTURE_2D
, 0, GL_RGBA
,
134 GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0, 2, 2);
138 GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST_MIPMAP_NEAREST
))
140 .RetiresOnSaturation();
141 EXPECT_CALL(*gl_
, GenerateMipmapEXT(GL_TEXTURE_2D
));
145 GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST_MIPMAP_LINEAR
))
147 .RetiresOnSaturation();
148 EXPECT_CALL(*gl_
, GetError())
149 .WillOnce(Return(GL_NO_ERROR
))
150 .WillOnce(Return(GL_NO_ERROR
))
151 .RetiresOnSaturation();
153 cmd
.Init(GL_TEXTURE_2D
);
154 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
155 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
158 TEST_P(GLES2DecoderTest
, ActiveTextureValidArgs
) {
159 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE1
));
160 SpecializedSetup
<ActiveTexture
, 0>(true);
162 cmd
.Init(GL_TEXTURE1
);
163 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
164 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
167 TEST_P(GLES2DecoderTest
, ActiveTextureInvalidArgs
) {
168 EXPECT_CALL(*gl_
, ActiveTexture(_
)).Times(0);
169 SpecializedSetup
<ActiveTexture
, 0>(false);
171 cmd
.Init(GL_TEXTURE0
- 1);
172 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
173 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
174 cmd
.Init(kNumTextureUnits
);
175 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
176 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
179 TEST_P(GLES2DecoderTest
, TexSubImage2DValidArgs
) {
180 const int kWidth
= 16;
181 const int kHeight
= 8;
182 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
183 DoTexImage2D(GL_TEXTURE_2D
,
192 kSharedMemoryOffset
);
194 TexSubImage2D(GL_TEXTURE_2D
,
202 shared_memory_address_
))
204 .RetiresOnSaturation();
206 cmd
.Init(GL_TEXTURE_2D
,
217 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
218 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
221 TEST_P(GLES2DecoderTest
, TexSubImage2DBadArgs
) {
222 const int kWidth
= 16;
223 const int kHeight
= 8;
224 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
225 DoTexImage2D(GL_TEXTURE_2D
,
236 cmd
.Init(GL_TEXTURE0
,
247 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
248 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
249 cmd
.Init(GL_TEXTURE_2D
,
260 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
261 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
262 cmd
.Init(GL_TEXTURE_2D
,
273 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
274 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
275 cmd
.Init(GL_TEXTURE_2D
,
286 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
287 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
288 cmd
.Init(GL_TEXTURE_2D
,
299 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
300 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
301 cmd
.Init(GL_TEXTURE_2D
,
312 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
313 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
314 cmd
.Init(GL_TEXTURE_2D
,
325 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
326 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
327 cmd
.Init(GL_TEXTURE_2D
,
338 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
339 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
340 cmd
.Init(GL_TEXTURE_2D
,
351 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
352 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
353 cmd
.Init(GL_TEXTURE_2D
,
364 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
365 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
366 cmd
.Init(GL_TEXTURE_2D
,
373 GL_UNSIGNED_SHORT_4_4_4_4
,
377 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
378 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
379 cmd
.Init(GL_TEXTURE_2D
,
387 kInvalidSharedMemoryId
,
390 EXPECT_NE(error::kNoError
, ExecuteCmd(cmd
));
391 cmd
.Init(GL_TEXTURE_2D
,
400 kInvalidSharedMemoryOffset
,
402 EXPECT_NE(error::kNoError
, ExecuteCmd(cmd
));
405 TEST_P(GLES3DecoderTest
, TexSubImage2DTypesDoNotMatchUnsizedFormat
) {
406 const int kWidth
= 16;
407 const int kHeight
= 8;
408 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
409 DoTexImage2D(GL_TEXTURE_2D
,
416 GL_UNSIGNED_SHORT_4_4_4_4
,
418 kSharedMemoryOffset
);
420 TexSubImage2D(GL_TEXTURE_2D
,
428 shared_memory_address_
))
430 .RetiresOnSaturation();
432 cmd
.Init(GL_TEXTURE_2D
,
443 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
444 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
447 TEST_P(GLES3DecoderTest
, TexSubImage2DTypesDoNotMatchSizedFormat
) {
448 const int kWidth
= 16;
449 const int kHeight
= 8;
450 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
451 DoTexImage2D(GL_TEXTURE_2D
,
460 kSharedMemoryOffset
);
462 TexSubImage2D(GL_TEXTURE_2D
,
469 GL_UNSIGNED_SHORT_4_4_4_4
,
470 shared_memory_address_
))
472 .RetiresOnSaturation();
474 cmd
.Init(GL_TEXTURE_2D
,
481 GL_UNSIGNED_SHORT_4_4_4_4
,
485 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
486 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
489 TEST_P(GLES2DecoderTest
, CopyTexSubImage2DValidArgs
) {
490 const int kWidth
= 16;
491 const int kHeight
= 8;
492 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
493 DoTexImage2D(GL_TEXTURE_2D
,
502 kSharedMemoryOffset
);
504 CopyTexSubImage2D(GL_TEXTURE_2D
, 1, 0, 0, 0, 0, kWidth
, kHeight
))
506 .RetiresOnSaturation();
507 CopyTexSubImage2D cmd
;
508 cmd
.Init(GL_TEXTURE_2D
, 1, 0, 0, 0, 0, kWidth
, kHeight
);
509 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
510 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
513 TEST_P(GLES2DecoderTest
, CopyTexSubImage2DBadArgs
) {
514 const int kWidth
= 16;
515 const int kHeight
= 8;
516 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
517 DoTexImage2D(GL_TEXTURE_2D
,
527 CopyTexSubImage2D cmd
;
528 cmd
.Init(GL_TEXTURE0
, 1, 0, 0, 0, 0, kWidth
, kHeight
);
529 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
530 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
531 cmd
.Init(GL_TEXTURE_2D
, 1, -1, 0, 0, 0, kWidth
, kHeight
);
532 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
533 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
534 cmd
.Init(GL_TEXTURE_2D
, 1, 1, 0, 0, 0, kWidth
, kHeight
);
535 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
536 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
537 cmd
.Init(GL_TEXTURE_2D
, 1, 0, -1, 0, 0, kWidth
, kHeight
);
538 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
539 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
540 cmd
.Init(GL_TEXTURE_2D
, 1, 0, 1, 0, 0, kWidth
, kHeight
);
541 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
542 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
543 cmd
.Init(GL_TEXTURE_2D
, 1, 0, 0, 0, 0, kWidth
+ 1, kHeight
);
544 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
545 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
546 cmd
.Init(GL_TEXTURE_2D
, 1, 0, 0, 0, 0, kWidth
, kHeight
+ 1);
547 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
548 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
551 TEST_P(GLES2DecoderTest
, TexImage2DRedefinitionSucceeds
) {
552 const int kWidth
= 16;
553 const int kHeight
= 8;
554 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
555 EXPECT_CALL(*gl_
, GetError()).WillRepeatedly(Return(GL_NO_ERROR
));
556 for (int ii
= 0; ii
< 2; ++ii
) {
560 TexImage2D(GL_TEXTURE_2D
,
570 .RetiresOnSaturation();
571 cmd
.Init(GL_TEXTURE_2D
,
579 kSharedMemoryOffset
);
581 cmd
.Init(GL_TEXTURE_2D
,
591 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
593 TexSubImage2D(GL_TEXTURE_2D
,
601 shared_memory_address_
))
603 .RetiresOnSaturation();
604 // Consider this TexSubImage2D command part of the previous TexImage2D
605 // (last GL_TRUE argument). It will be skipped if there are bugs in the
606 // redefinition case.
608 cmd2
.Init(GL_TEXTURE_2D
,
619 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
623 TEST_P(GLES2DecoderTest
, TexImage2DGLError
) {
624 GLenum target
= GL_TEXTURE_2D
;
626 GLenum internal_format
= GL_RGBA
;
630 GLenum format
= GL_RGBA
;
631 GLenum type
= GL_UNSIGNED_BYTE
;
632 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
633 TextureManager
* manager
= group().texture_manager();
634 TextureRef
* texture_ref
= manager
->GetTexture(client_texture_id_
);
635 ASSERT_TRUE(texture_ref
!= NULL
);
636 Texture
* texture
= texture_ref
->texture();
638 texture
->GetLevelSize(GL_TEXTURE_2D
, level
, &width
, &height
, nullptr));
639 EXPECT_CALL(*gl_
, GetError())
640 .WillOnce(Return(GL_NO_ERROR
))
641 .WillOnce(Return(GL_OUT_OF_MEMORY
))
642 .RetiresOnSaturation();
654 .RetiresOnSaturation();
664 kSharedMemoryOffset
);
665 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
666 EXPECT_EQ(GL_OUT_OF_MEMORY
, GetGLError());
668 texture
->GetLevelSize(GL_TEXTURE_2D
, level
, &width
, &height
, nullptr));
671 TEST_P(GLES2DecoderTest
, CopyTexImage2DGLError
) {
672 GLenum target
= GL_TEXTURE_2D
;
674 GLenum internal_format
= GL_RGBA
;
678 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
679 TextureManager
* manager
= group().texture_manager();
680 TextureRef
* texture_ref
= manager
->GetTexture(client_texture_id_
);
681 ASSERT_TRUE(texture_ref
!= NULL
);
682 Texture
* texture
= texture_ref
->texture();
684 texture
->GetLevelSize(GL_TEXTURE_2D
, level
, &width
, &height
, nullptr));
685 EXPECT_CALL(*gl_
, GetError())
686 .WillOnce(Return(GL_NO_ERROR
))
687 .WillOnce(Return(GL_OUT_OF_MEMORY
))
688 .RetiresOnSaturation();
691 target
, level
, internal_format
, 0, 0, width
, height
, border
))
693 .RetiresOnSaturation();
695 cmd
.Init(target
, level
, internal_format
, 0, 0, width
, height
);
696 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
697 EXPECT_EQ(GL_OUT_OF_MEMORY
, GetGLError());
699 texture
->GetLevelSize(GL_TEXTURE_2D
, level
, &width
, &height
, nullptr));
702 TEST_P(GLES3DecoderTest
, CompressedTexImage3DBucket
) {
703 const uint32 kBucketId
= 123;
704 const uint32 kBadBucketId
= 99;
705 const GLenum kTarget
= GL_TEXTURE_2D_ARRAY
;
706 const GLint kLevel
= 0;
707 const GLenum kInternalFormat
= GL_COMPRESSED_R11_EAC
;
708 const GLsizei kWidth
= 4;
709 const GLsizei kHeight
= 4;
710 const GLsizei kDepth
= 4;
711 const GLint kBorder
= 0;
712 CommonDecoder::Bucket
* bucket
= decoder_
->CreateBucket(kBucketId
);
713 ASSERT_TRUE(bucket
!= NULL
);
714 const GLsizei kImageSize
= 32;
715 bucket
->SetSize(kImageSize
);
717 DoBindTexture(kTarget
, client_texture_id_
, kServiceTextureId
);
719 CompressedTexImage3DBucket cmd
;
727 EXPECT_NE(error::kNoError
, ExecuteCmd(cmd
));
737 CompressedTexImage3D(kTarget
, kLevel
, kInternalFormat
, kWidth
,
738 kHeight
, kDepth
, kBorder
, kImageSize
, _
))
740 .RetiresOnSaturation();
741 EXPECT_CALL(*gl_
, GetError())
742 .WillOnce(Return(GL_NO_ERROR
))
743 .WillOnce(Return(GL_NO_ERROR
))
744 .RetiresOnSaturation();
745 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
746 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
749 TEST_P(GLES2DecoderTest
, CompressedTexImage3DFailsOnES2
) {
750 const uint32 kBucketId
= 123;
751 const GLenum kTarget
= GL_TEXTURE_2D_ARRAY
;
752 const GLint kLevel
= 0;
753 const GLenum kInternalFormat
= GL_COMPRESSED_R11_EAC
;
754 const GLsizei kWidth
= 4;
755 const GLsizei kHeight
= 4;
756 const GLsizei kDepth
= 4;
757 CommonDecoder::Bucket
* bucket
= decoder_
->CreateBucket(kBucketId
);
758 ASSERT_TRUE(bucket
!= NULL
);
759 const GLsizei kImageSize
= 32;
760 bucket
->SetSize(kImageSize
);
763 CompressedTexImage3DBucket cmd
;
771 EXPECT_EQ(error::kUnknownCommand
, ExecuteCmd(cmd
));
775 CompressedTexSubImage3DBucket cmd
;
784 EXPECT_EQ(error::kUnknownCommand
, ExecuteCmd(cmd
));
788 TEST_P(GLES3DecoderTest
, CompressedTexImage3DFailsWithBadImageSize
) {
789 const uint32 kBucketId
= 123;
790 const GLenum kTarget
= GL_TEXTURE_2D_ARRAY
;
791 const GLint kLevel
= 0;
792 const GLenum kInternalFormat
= GL_COMPRESSED_RGBA8_ETC2_EAC
;
793 const GLsizei kWidth
= 4;
794 const GLsizei kHeight
= 8;
795 const GLsizei kDepth
= 4;
796 CommonDecoder::Bucket
* bucket
= decoder_
->CreateBucket(kBucketId
);
797 ASSERT_TRUE(bucket
!= NULL
);
798 const GLsizei kBadImageSize
= 64;
799 bucket
->SetSize(kBadImageSize
);
801 DoBindTexture(kTarget
, client_texture_id_
, kServiceTextureId
);
803 CompressedTexImage3DBucket cmd
;
811 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
812 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
815 TEST_P(GLES3DecoderTest
, CompressedTexSubImage3DFails
) {
816 const uint32 kBucketId
= 123;
817 const GLenum kTarget
= GL_TEXTURE_2D_ARRAY
;
818 const GLint kLevel
= 0;
819 const GLenum kInternalFormat
= GL_COMPRESSED_RGBA8_ETC2_EAC
;
820 const GLsizei kWidth
= 4;
821 const GLsizei kHeight
= 8;
822 const GLsizei kDepth
= 4;
823 const GLint kBorder
= 0;
824 CommonDecoder::Bucket
* bucket
= decoder_
->CreateBucket(kBucketId
);
825 ASSERT_TRUE(bucket
!= NULL
);
826 const GLsizei kImageSize
= 128;
827 bucket
->SetSize(kImageSize
);
829 DoBindTexture(kTarget
, client_texture_id_
, kServiceTextureId
);
831 CompressedTexImage3DBucket tex_cmd
;
832 tex_cmd
.Init(kTarget
,
840 CompressedTexImage3D(kTarget
, kLevel
, kInternalFormat
, kWidth
,
841 kHeight
, kDepth
, kBorder
, kImageSize
, _
))
843 .RetiresOnSaturation();
844 EXPECT_CALL(*gl_
, GetError())
845 .WillOnce(Return(GL_NO_ERROR
))
846 .WillOnce(Return(GL_NO_ERROR
))
847 .RetiresOnSaturation();
848 EXPECT_EQ(error::kNoError
, ExecuteCmd(tex_cmd
));
849 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
851 const GLint kXOffset
= 0;
852 const GLint kYOffset
= 0;
853 const GLint kZOffset
= 0;
854 const GLint kSubWidth
= 4;
855 const GLint kSubHeight
= 4;
856 const GLint kSubDepth
= 4;
857 const GLenum kFormat
= kInternalFormat
;
858 CompressedTexSubImage3DBucket cmd
;
860 // Incorrect image size.
871 const GLsizei kBadSubImageSize
= 32;
872 const GLsizei kSubImageSize
= 64;
873 bucket
->SetSize(kBadSubImageSize
);
874 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
875 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
878 const GLenum kBadFormat
= GL_COMPRESSED_R11_EAC
;
889 bucket
->SetSize(kSubImageSize
);
890 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
891 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
904 bucket
->SetSize(kSubImageSize
);
905 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
906 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
908 // offset + size > texture size
919 bucket
->SetSize(kSubImageSize
);
920 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
921 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
923 // offset not a multiple of 4.
934 bucket
->SetSize(kSubImageSize
);
935 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
936 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
938 // offset + width not a multlple of 4 .
949 const GLsizei kSubImageSize2
= 128;
950 bucket
->SetSize(kSubImageSize2
);
951 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
952 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
955 const uint32 kBadBucketId
= 444;
966 bucket
->SetSize(kSubImageSize
);
967 EXPECT_NE(error::kNoError
, ExecuteCmd(cmd
));
970 TEST_P(GLES2DecoderManualInitTest
, CompressedTexImage2DBucketBadBucket
) {
972 init
.extensions
= "GL_EXT_texture_compression_s3tc";
973 init
.bind_generates_resource
= true;
976 const uint32 kBadBucketId
= 123;
977 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
978 CompressedTexImage2DBucket cmd
;
979 cmd
.Init(GL_TEXTURE_2D
,
981 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
,
985 EXPECT_NE(error::kNoError
, ExecuteCmd(cmd
));
986 CompressedTexSubImage2DBucket cmd2
;
987 cmd2
.Init(GL_TEXTURE_2D
,
993 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
,
995 EXPECT_NE(error::kNoError
, ExecuteCmd(cmd
));
1000 struct S3TCTestData
{
1005 } // anonymous namespace.
1007 TEST_P(GLES2DecoderManualInitTest
, CompressedTexImage2DS3TC
) {
1009 init
.extensions
= "GL_EXT_texture_compression_s3tc";
1010 init
.bind_generates_resource
= true;
1012 const uint32 kBucketId
= 123;
1013 CommonDecoder::Bucket
* bucket
= decoder_
->CreateBucket(kBucketId
);
1014 ASSERT_TRUE(bucket
!= NULL
);
1016 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
1018 static const S3TCTestData test_data
[] = {
1020 GL_COMPRESSED_RGB_S3TC_DXT1_EXT
, 8,
1023 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
, 8,
1026 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
, 16,
1029 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
, 16,
1033 for (size_t ii
= 0; ii
< arraysize(test_data
); ++ii
) {
1034 const S3TCTestData
& test
= test_data
[ii
];
1035 CompressedTexImage2DBucket cmd
;
1036 // test small width.
1037 DoCompressedTexImage2D(
1038 GL_TEXTURE_2D
, 0, test
.format
, 2, 4, 0, test
.block_size
, kBucketId
);
1039 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1042 cmd
.Init(GL_TEXTURE_2D
, 0, test
.format
, 5, 4, kBucketId
);
1043 bucket
->SetSize(test
.block_size
* 2);
1044 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1045 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1047 // test small height.
1048 DoCompressedTexImage2D(
1049 GL_TEXTURE_2D
, 0, test
.format
, 4, 2, 0, test
.block_size
, kBucketId
);
1050 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1052 // test too bad height.
1053 cmd
.Init(GL_TEXTURE_2D
, 0, test
.format
, 4, 5, kBucketId
);
1054 bucket
->SetSize(test
.block_size
* 2);
1055 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1056 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1058 // test small for level 0.
1059 DoCompressedTexImage2D(
1060 GL_TEXTURE_2D
, 0, test
.format
, 1, 1, 0, test
.block_size
, kBucketId
);
1061 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1063 // test small for level 0.
1064 DoCompressedTexImage2D(
1065 GL_TEXTURE_2D
, 0, test
.format
, 2, 2, 0, test
.block_size
, kBucketId
);
1066 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1068 // test size too large.
1069 cmd
.Init(GL_TEXTURE_2D
, 0, test
.format
, 4, 4, kBucketId
);
1070 bucket
->SetSize(test
.block_size
* 2);
1071 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1072 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1074 // test size too small.
1075 cmd
.Init(GL_TEXTURE_2D
, 0, test
.format
, 4, 4, kBucketId
);
1076 bucket
->SetSize(test
.block_size
/ 2);
1077 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1078 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1080 // test with 3 mips.
1081 DoCompressedTexImage2D(
1082 GL_TEXTURE_2D
, 0, test
.format
, 4, 4, 0, test
.block_size
, kBucketId
);
1083 DoCompressedTexImage2D(
1084 GL_TEXTURE_2D
, 1, test
.format
, 2, 2, 0, test
.block_size
, kBucketId
);
1085 DoCompressedTexImage2D(
1086 GL_TEXTURE_2D
, 2, test
.format
, 1, 1, 0, test
.block_size
, kBucketId
);
1087 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1090 DoCompressedTexImage2D(GL_TEXTURE_2D
,
1096 test
.block_size
* 4 * 4,
1098 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1100 CompressedTexSubImage2DBucket sub_cmd
;
1101 bucket
->SetSize(test
.block_size
);
1102 // Test sub image bad xoffset
1103 sub_cmd
.Init(GL_TEXTURE_2D
, 0, 1, 0, 4, 4, test
.format
, kBucketId
);
1104 EXPECT_EQ(error::kNoError
, ExecuteCmd(sub_cmd
));
1105 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1107 // Test sub image bad yoffset
1108 sub_cmd
.Init(GL_TEXTURE_2D
, 0, 0, 2, 4, 4, test
.format
, kBucketId
);
1109 EXPECT_EQ(error::kNoError
, ExecuteCmd(sub_cmd
));
1110 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1112 // Test sub image bad width
1113 bucket
->SetSize(test
.block_size
* 2);
1114 sub_cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 5, 4, test
.format
, kBucketId
);
1115 EXPECT_EQ(error::kNoError
, ExecuteCmd(sub_cmd
));
1116 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1118 // Test sub image bad height
1119 sub_cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 4, 5, test
.format
, kBucketId
);
1120 EXPECT_EQ(error::kNoError
, ExecuteCmd(sub_cmd
));
1121 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1123 // Test sub image bad size
1124 bucket
->SetSize(test
.block_size
+ 1);
1125 sub_cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 4, 4, test
.format
, kBucketId
);
1126 EXPECT_EQ(error::kNoError
, ExecuteCmd(sub_cmd
));
1127 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1129 for (GLint yoffset
= 0; yoffset
<= 8; yoffset
+= 4) {
1130 for (GLint xoffset
= 0; xoffset
<= 8; xoffset
+= 4) {
1131 for (GLsizei height
= 4; height
<= 8; height
+= 4) {
1132 for (GLsizei width
= 4; width
<= 8; width
+= 4) {
1133 GLsizei size
= test
.block_size
* (width
/ 4) * (height
/ 4);
1134 bucket
->SetSize(size
);
1136 CompressedTexSubImage2D(GL_TEXTURE_2D
,
1146 .RetiresOnSaturation();
1147 sub_cmd
.Init(GL_TEXTURE_2D
,
1155 EXPECT_EQ(error::kNoError
, ExecuteCmd(sub_cmd
));
1156 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1164 TEST_P(GLES2DecoderManualInitTest
, CompressedTexImage2DETC1
) {
1166 init
.extensions
= "GL_OES_compressed_ETC1_RGB8_texture";
1167 init
.gl_version
= "opengl es 2.0";
1168 init
.bind_generates_resource
= true;
1170 const uint32 kBucketId
= 123;
1171 CommonDecoder::Bucket
* bucket
= decoder_
->CreateBucket(kBucketId
);
1172 ASSERT_TRUE(bucket
!= NULL
);
1174 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
1176 const GLenum kFormat
= GL_ETC1_RGB8_OES
;
1177 const size_t kBlockSize
= 8;
1179 CompressedTexImage2DBucket cmd
;
1180 // test small width.
1181 DoCompressedTexImage2D(GL_TEXTURE_2D
, 0, kFormat
, 4, 8, 0, 16, kBucketId
);
1182 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1184 // test small height.
1185 DoCompressedTexImage2D(GL_TEXTURE_2D
, 0, kFormat
, 8, 4, 0, 16, kBucketId
);
1186 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1188 // test size too large.
1189 cmd
.Init(GL_TEXTURE_2D
, 0, kFormat
, 4, 4, kBucketId
);
1190 bucket
->SetSize(kBlockSize
* 2);
1191 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1192 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1194 // test size too small.
1195 cmd
.Init(GL_TEXTURE_2D
, 0, kFormat
, 4, 4, kBucketId
);
1196 bucket
->SetSize(kBlockSize
/ 2);
1197 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1198 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1201 DoCompressedTexImage2D(
1202 GL_TEXTURE_2D
, 0, kFormat
, 16, 16, 0, kBlockSize
* 16, kBucketId
);
1203 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1205 // Test CompressedTexSubImage not allowed
1206 CompressedTexSubImage2DBucket sub_cmd
;
1207 bucket
->SetSize(kBlockSize
);
1208 sub_cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 4, 4, kFormat
, kBucketId
);
1209 EXPECT_EQ(error::kNoError
, ExecuteCmd(sub_cmd
));
1210 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1212 // Test TexSubImage not allowed for ETC1 compressed texture
1213 TextureRef
* texture_ref
= GetTexture(client_texture_id_
);
1214 ASSERT_TRUE(texture_ref
!= NULL
);
1215 Texture
* texture
= texture_ref
->texture();
1216 GLenum type
, internal_format
;
1217 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 0, &type
, &internal_format
));
1218 EXPECT_EQ(kFormat
, internal_format
);
1219 TexSubImage2D texsub_cmd
;
1220 texsub_cmd
.Init(GL_TEXTURE_2D
,
1229 kSharedMemoryOffset
,
1231 EXPECT_EQ(error::kNoError
, ExecuteCmd(texsub_cmd
));
1232 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1234 // Test CopyTexSubImage not allowed for ETC1 compressed texture
1235 CopyTexSubImage2D copy_cmd
;
1236 copy_cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 0, 0, 4, 4);
1237 EXPECT_EQ(error::kNoError
, ExecuteCmd(copy_cmd
));
1238 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1243 TEST_P(GLES2DecoderManualInitTest
, EGLImageExternalBindTexture
) {
1245 init
.extensions
= "GL_OES_EGL_image_external";
1246 init
.gl_version
= "opengl es 2.0";
1247 init
.bind_generates_resource
= true;
1249 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_EXTERNAL_OES
, kNewServiceId
));
1250 EXPECT_CALL(*gl_
, GenTextures(1, _
))
1251 .WillOnce(SetArgumentPointee
<1>(kNewServiceId
));
1253 cmd
.Init(GL_TEXTURE_EXTERNAL_OES
, kNewClientId
);
1254 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1255 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1256 TextureRef
* texture_ref
= GetTexture(kNewClientId
);
1257 EXPECT_TRUE(texture_ref
!= NULL
);
1258 EXPECT_TRUE(texture_ref
->texture()->target() == GL_TEXTURE_EXTERNAL_OES
);
1261 TEST_P(GLES2DecoderManualInitTest
, EGLImageExternalGetBinding
) {
1263 init
.extensions
= "GL_OES_EGL_image_external";
1264 init
.gl_version
= "opengl es 2.0";
1265 init
.bind_generates_resource
= true;
1267 DoBindTexture(GL_TEXTURE_EXTERNAL_OES
, client_texture_id_
, kServiceTextureId
);
1269 EXPECT_CALL(*gl_
, GetError())
1270 .WillOnce(Return(GL_NO_ERROR
))
1271 .WillOnce(Return(GL_NO_ERROR
))
1272 .RetiresOnSaturation();
1273 typedef GetIntegerv::Result Result
;
1274 Result
* result
= static_cast<Result
*>(shared_memory_address_
);
1276 GetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES
, result
->GetData()))
1280 cmd
.Init(GL_TEXTURE_BINDING_EXTERNAL_OES
,
1282 shared_memory_offset_
);
1283 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1284 EXPECT_EQ(decoder_
->GetGLES2Util()->GLGetNumValuesReturned(
1285 GL_TEXTURE_BINDING_EXTERNAL_OES
),
1286 result
->GetNumResults());
1287 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1288 EXPECT_EQ(client_texture_id_
, (uint32
)result
->GetData()[0]);
1291 TEST_P(GLES2DecoderManualInitTest
, EGLImageExternalTextureDefaults
) {
1293 init
.extensions
= "GL_OES_EGL_image_external";
1294 init
.gl_version
= "opengl es 2.0";
1295 init
.bind_generates_resource
= true;
1297 DoBindTexture(GL_TEXTURE_EXTERNAL_OES
, client_texture_id_
, kServiceTextureId
);
1299 TextureRef
* texture_ref
= GetTexture(client_texture_id_
);
1300 EXPECT_TRUE(texture_ref
!= NULL
);
1301 Texture
* texture
= texture_ref
->texture();
1302 EXPECT_TRUE(texture
->target() == GL_TEXTURE_EXTERNAL_OES
);
1303 EXPECT_TRUE(texture
->min_filter() == GL_LINEAR
);
1304 EXPECT_TRUE(texture
->wrap_s() == GL_CLAMP_TO_EDGE
);
1305 EXPECT_TRUE(texture
->wrap_t() == GL_CLAMP_TO_EDGE
);
1308 TEST_P(GLES2DecoderManualInitTest
, EGLImageExternalTextureParam
) {
1310 init
.extensions
= "GL_OES_EGL_image_external";
1311 init
.gl_version
= "opengl es 2.0";
1312 init
.bind_generates_resource
= true;
1314 DoBindTexture(GL_TEXTURE_EXTERNAL_OES
, client_texture_id_
, kServiceTextureId
);
1318 GL_TEXTURE_EXTERNAL_OES
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
));
1321 TexParameteri(GL_TEXTURE_EXTERNAL_OES
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
));
1325 GL_TEXTURE_EXTERNAL_OES
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
));
1329 GL_TEXTURE_EXTERNAL_OES
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
));
1331 cmd
.Init(GL_TEXTURE_EXTERNAL_OES
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
1332 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1333 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1335 cmd
.Init(GL_TEXTURE_EXTERNAL_OES
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
1336 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1337 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1339 cmd
.Init(GL_TEXTURE_EXTERNAL_OES
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
1340 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1341 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1343 cmd
.Init(GL_TEXTURE_EXTERNAL_OES
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
1344 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1345 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1347 TextureRef
* texture_ref
= GetTexture(client_texture_id_
);
1348 EXPECT_TRUE(texture_ref
!= NULL
);
1349 Texture
* texture
= texture_ref
->texture();
1350 EXPECT_TRUE(texture
->target() == GL_TEXTURE_EXTERNAL_OES
);
1351 EXPECT_TRUE(texture
->min_filter() == GL_LINEAR
);
1352 EXPECT_TRUE(texture
->wrap_s() == GL_CLAMP_TO_EDGE
);
1353 EXPECT_TRUE(texture
->wrap_t() == GL_CLAMP_TO_EDGE
);
1356 TEST_P(GLES2DecoderManualInitTest
, EGLImageExternalTextureParamInvalid
) {
1358 init
.extensions
= "GL_OES_EGL_image_external";
1359 init
.gl_version
= "opengl es 2.0";
1360 init
.bind_generates_resource
= true;
1362 DoBindTexture(GL_TEXTURE_EXTERNAL_OES
, client_texture_id_
, kServiceTextureId
);
1365 cmd
.Init(GL_TEXTURE_EXTERNAL_OES
,
1366 GL_TEXTURE_MIN_FILTER
,
1367 GL_NEAREST_MIPMAP_NEAREST
);
1368 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1369 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
1371 cmd
.Init(GL_TEXTURE_EXTERNAL_OES
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
1372 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1373 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
1375 cmd
.Init(GL_TEXTURE_EXTERNAL_OES
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
1376 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1377 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
1379 TextureRef
* texture_ref
= GetTexture(client_texture_id_
);
1380 EXPECT_TRUE(texture_ref
!= NULL
);
1381 Texture
* texture
= texture_ref
->texture();
1382 EXPECT_TRUE(texture
->target() == GL_TEXTURE_EXTERNAL_OES
);
1383 EXPECT_TRUE(texture
->min_filter() == GL_LINEAR
);
1384 EXPECT_TRUE(texture
->wrap_s() == GL_CLAMP_TO_EDGE
);
1385 EXPECT_TRUE(texture
->wrap_t() == GL_CLAMP_TO_EDGE
);
1388 TEST_P(GLES2DecoderManualInitTest
, EGLImageExternalTexImage2DError
) {
1390 init
.extensions
= "GL_OES_EGL_image_external";
1391 init
.gl_version
= "opengl es 2.0";
1392 init
.bind_generates_resource
= true;
1395 GLenum target
= GL_TEXTURE_EXTERNAL_OES
;
1397 GLenum internal_format
= GL_RGBA
;
1400 GLenum format
= GL_RGBA
;
1401 GLenum type
= GL_UNSIGNED_BYTE
;
1402 DoBindTexture(GL_TEXTURE_EXTERNAL_OES
, client_texture_id_
, kServiceTextureId
);
1403 ASSERT_TRUE(GetTexture(client_texture_id_
) != NULL
);
1413 kSharedMemoryOffset
);
1414 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1416 // TexImage2D is not allowed with GL_TEXTURE_EXTERNAL_OES targets.
1417 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
1420 TEST_P(GLES2DecoderManualInitTest
, DefaultTextureZero
) {
1425 cmd1
.Init(GL_TEXTURE_2D
, 0);
1426 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, 0));
1427 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1428 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1431 cmd2
.Init(GL_TEXTURE_CUBE_MAP
, 0);
1432 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_CUBE_MAP
, 0));
1433 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
1434 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1437 TEST_P(GLES2DecoderManualInitTest
, DefaultTextureBGR
) {
1439 init
.bind_generates_resource
= true;
1443 cmd1
.Init(GL_TEXTURE_2D
, 0);
1445 *gl_
, BindTexture(GL_TEXTURE_2D
, TestHelper::kServiceDefaultTexture2dId
));
1446 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1447 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1450 cmd2
.Init(GL_TEXTURE_CUBE_MAP
, 0);
1452 BindTexture(GL_TEXTURE_CUBE_MAP
,
1453 TestHelper::kServiceDefaultTextureCubemapId
));
1454 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
1455 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1458 // Test that default texture 0 is immutable.
1459 TEST_P(GLES2DecoderManualInitTest
, NoDefaultTexParameterf
) {
1465 cmd1
.Init(GL_TEXTURE_2D
, 0);
1466 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, 0));
1467 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1468 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1471 cmd2
.Init(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
1472 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
1473 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1478 cmd1
.Init(GL_TEXTURE_CUBE_MAP
, 0);
1479 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_CUBE_MAP
, 0));
1480 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1481 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1484 cmd2
.Init(GL_TEXTURE_CUBE_MAP
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
1485 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
1486 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1490 TEST_P(GLES2DecoderManualInitTest
, NoDefaultTexParameteri
) {
1496 cmd1
.Init(GL_TEXTURE_2D
, 0);
1497 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, 0));
1498 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1499 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1502 cmd2
.Init(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
1503 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
1504 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1509 cmd1
.Init(GL_TEXTURE_CUBE_MAP
, 0);
1510 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_CUBE_MAP
, 0));
1511 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1512 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1515 cmd2
.Init(GL_TEXTURE_CUBE_MAP
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
1516 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
1517 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1521 TEST_P(GLES2DecoderManualInitTest
, NoDefaultTexParameterfv
) {
1527 cmd1
.Init(GL_TEXTURE_2D
, 0);
1528 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, 0));
1529 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1530 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1532 GLfloat data
= GL_NEAREST
;
1533 TexParameterfvImmediate
& cmd2
=
1534 *GetImmediateAs
<TexParameterfvImmediate
>();
1535 cmd2
.Init(GL_TEXTURE_2D
,
1536 GL_TEXTURE_MAG_FILTER
,
1538 EXPECT_EQ(error::kNoError
, ExecuteImmediateCmd(cmd2
, sizeof(data
)));
1539 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1544 cmd1
.Init(GL_TEXTURE_CUBE_MAP
, 0);
1545 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_CUBE_MAP
, 0));
1546 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1547 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1549 GLfloat data
= GL_NEAREST
;
1550 TexParameterfvImmediate
& cmd2
=
1551 *GetImmediateAs
<TexParameterfvImmediate
>();
1552 cmd2
.Init(GL_TEXTURE_CUBE_MAP
,
1553 GL_TEXTURE_MAG_FILTER
,
1555 EXPECT_EQ(error::kNoError
, ExecuteImmediateCmd(cmd2
, sizeof(data
)));
1556 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1560 TEST_P(GLES2DecoderManualInitTest
, NoDefaultTexParameteriv
) {
1566 cmd1
.Init(GL_TEXTURE_2D
, 0);
1567 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, 0));
1568 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1569 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1571 GLfloat data
= GL_NEAREST
;
1572 TexParameterfvImmediate
& cmd2
=
1573 *GetImmediateAs
<TexParameterfvImmediate
>();
1574 cmd2
.Init(GL_TEXTURE_2D
,
1575 GL_TEXTURE_MAG_FILTER
,
1577 EXPECT_EQ(error::kNoError
, ExecuteImmediateCmd(cmd2
, sizeof(data
)));
1578 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1583 cmd1
.Init(GL_TEXTURE_CUBE_MAP
, 0);
1584 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_CUBE_MAP
, 0));
1585 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1586 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1588 GLfloat data
= GL_NEAREST
;
1589 TexParameterfvImmediate
& cmd2
=
1590 *GetImmediateAs
<TexParameterfvImmediate
>();
1591 cmd2
.Init(GL_TEXTURE_CUBE_MAP
,
1592 GL_TEXTURE_MAG_FILTER
,
1594 EXPECT_EQ(error::kNoError
, ExecuteImmediateCmd(cmd2
, sizeof(data
)));
1595 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1599 TEST_P(GLES2DecoderManualInitTest
, NoDefaultTexImage2D
) {
1604 cmd1
.Init(GL_TEXTURE_2D
, 0);
1605 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, 0));
1606 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1607 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1610 cmd2
.Init(GL_TEXTURE_2D
,
1618 kSharedMemoryOffset
);
1619 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
1620 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1623 TEST_P(GLES2DecoderManualInitTest
, NoDefaultTexSubImage2D
) {
1628 cmd1
.Init(GL_TEXTURE_2D
, 0);
1629 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, 0));
1630 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
1631 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1634 cmd2
.Init(GL_TEXTURE_2D
,
1643 kSharedMemoryOffset
,
1645 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
1646 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
1649 TEST_P(GLES2DecoderManualInitTest
, ARBTextureRectangleBindTexture
) {
1651 init
.extensions
= "GL_ARB_texture_rectangle";
1652 init
.bind_generates_resource
= true;
1654 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_RECTANGLE_ARB
, kNewServiceId
));
1655 EXPECT_CALL(*gl_
, GenTextures(1, _
))
1656 .WillOnce(SetArgumentPointee
<1>(kNewServiceId
));
1658 cmd
.Init(GL_TEXTURE_RECTANGLE_ARB
, kNewClientId
);
1659 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1660 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1661 Texture
* texture
= GetTexture(kNewClientId
)->texture();
1662 EXPECT_TRUE(texture
!= NULL
);
1663 EXPECT_TRUE(texture
->target() == GL_TEXTURE_RECTANGLE_ARB
);
1666 TEST_P(GLES2DecoderManualInitTest
, ARBTextureRectangleGetBinding
) {
1668 init
.extensions
= "GL_ARB_texture_rectangle";
1669 init
.bind_generates_resource
= true;
1672 GL_TEXTURE_RECTANGLE_ARB
, client_texture_id_
, kServiceTextureId
);
1674 EXPECT_CALL(*gl_
, GetError())
1675 .WillOnce(Return(GL_NO_ERROR
))
1676 .WillOnce(Return(GL_NO_ERROR
))
1677 .RetiresOnSaturation();
1678 typedef GetIntegerv::Result Result
;
1679 Result
* result
= static_cast<Result
*>(shared_memory_address_
);
1681 GetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB
, result
->GetData()))
1685 cmd
.Init(GL_TEXTURE_BINDING_RECTANGLE_ARB
,
1687 shared_memory_offset_
);
1688 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1689 EXPECT_EQ(decoder_
->GetGLES2Util()->GLGetNumValuesReturned(
1690 GL_TEXTURE_BINDING_RECTANGLE_ARB
),
1691 result
->GetNumResults());
1692 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1693 EXPECT_EQ(client_texture_id_
, (uint32
)result
->GetData()[0]);
1696 TEST_P(GLES2DecoderManualInitTest
, ARBTextureRectangleTextureDefaults
) {
1698 init
.extensions
= "GL_ARB_texture_rectangle";
1699 init
.bind_generates_resource
= true;
1702 GL_TEXTURE_RECTANGLE_ARB
, client_texture_id_
, kServiceTextureId
);
1704 Texture
* texture
= GetTexture(client_texture_id_
)->texture();
1705 EXPECT_TRUE(texture
!= NULL
);
1706 EXPECT_TRUE(texture
->target() == GL_TEXTURE_RECTANGLE_ARB
);
1707 EXPECT_TRUE(texture
->min_filter() == GL_LINEAR
);
1708 EXPECT_TRUE(texture
->wrap_s() == GL_CLAMP_TO_EDGE
);
1709 EXPECT_TRUE(texture
->wrap_t() == GL_CLAMP_TO_EDGE
);
1712 TEST_P(GLES2DecoderManualInitTest
, ARBTextureRectangleTextureParam
) {
1714 init
.extensions
= "GL_ARB_texture_rectangle";
1715 init
.bind_generates_resource
= true;
1719 GL_TEXTURE_RECTANGLE_ARB
, client_texture_id_
, kServiceTextureId
);
1723 GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
));
1726 GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
));
1730 GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
));
1734 GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
));
1736 cmd
.Init(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
1737 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1738 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1740 cmd
.Init(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
1741 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1742 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1744 cmd
.Init(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
1745 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1746 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1748 cmd
.Init(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
1749 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1750 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1752 Texture
* texture
= GetTexture(client_texture_id_
)->texture();
1753 EXPECT_TRUE(texture
!= NULL
);
1754 EXPECT_TRUE(texture
->target() == GL_TEXTURE_RECTANGLE_ARB
);
1755 EXPECT_TRUE(texture
->min_filter() == GL_LINEAR
);
1756 EXPECT_TRUE(texture
->wrap_s() == GL_CLAMP_TO_EDGE
);
1757 EXPECT_TRUE(texture
->wrap_t() == GL_CLAMP_TO_EDGE
);
1760 TEST_P(GLES2DecoderManualInitTest
, ARBTextureRectangleTextureParamInvalid
) {
1762 init
.extensions
= "GL_ARB_texture_rectangle";
1763 init
.bind_generates_resource
= true;
1767 GL_TEXTURE_RECTANGLE_ARB
, client_texture_id_
, kServiceTextureId
);
1770 cmd
.Init(GL_TEXTURE_RECTANGLE_ARB
,
1771 GL_TEXTURE_MIN_FILTER
,
1772 GL_NEAREST_MIPMAP_NEAREST
);
1773 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1774 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
1776 cmd
.Init(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
1777 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1778 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
1780 cmd
.Init(GL_TEXTURE_RECTANGLE_ARB
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
1781 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1782 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
1784 Texture
* texture
= GetTexture(client_texture_id_
)->texture();
1785 EXPECT_TRUE(texture
!= NULL
);
1786 EXPECT_TRUE(texture
->target() == GL_TEXTURE_RECTANGLE_ARB
);
1787 EXPECT_TRUE(texture
->min_filter() == GL_LINEAR
);
1788 EXPECT_TRUE(texture
->wrap_s() == GL_CLAMP_TO_EDGE
);
1789 EXPECT_TRUE(texture
->wrap_t() == GL_CLAMP_TO_EDGE
);
1792 TEST_P(GLES2DecoderManualInitTest
, ARBTextureRectangleTexImage2D
) {
1794 init
.extensions
= "GL_ARB_texture_rectangle";
1795 init
.bind_generates_resource
= true;
1798 GLenum target
= GL_TEXTURE_RECTANGLE_ARB
;
1800 GLenum internal_format
= GL_RGBA
;
1803 GLenum format
= GL_RGBA
;
1804 GLenum type
= GL_UNSIGNED_BYTE
;
1807 GL_TEXTURE_RECTANGLE_ARB
, client_texture_id_
, kServiceTextureId
);
1808 ASSERT_TRUE(GetTexture(client_texture_id_
) != NULL
);
1810 EXPECT_CALL(*gl_
, GetError())
1811 .WillOnce(Return(GL_NO_ERROR
))
1812 .WillOnce(Return(GL_NO_ERROR
))
1813 .RetiresOnSaturation();
1825 .RetiresOnSaturation();
1835 kSharedMemoryOffset
);
1836 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1838 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1841 TEST_P(GLES2DecoderManualInitTest
, ARBTextureRectangleTexImage2DInvalid
) {
1843 init
.extensions
= "GL_ARB_texture_rectangle";
1844 init
.bind_generates_resource
= true;
1847 GLenum target
= GL_TEXTURE_RECTANGLE_ARB
;
1849 GLenum internal_format
= GL_RGBA
;
1852 GLenum format
= GL_RGBA
;
1853 GLenum type
= GL_UNSIGNED_BYTE
;
1856 GL_TEXTURE_RECTANGLE_ARB
, client_texture_id_
, kServiceTextureId
);
1857 ASSERT_TRUE(GetTexture(client_texture_id_
) != NULL
);
1868 kSharedMemoryOffset
);
1869 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1871 // TexImage2D may only be used with level 0 on GL_TEXTURE_RECTANGLE_ARB
1873 EXPECT_EQ(GL_INVALID_VALUE
, GetGLError());
1876 TEST_P(GLES2DecoderManualInitTest
, TexSubImage2DClearsAfterTexImage2DNULL
) {
1878 init
.gl_version
= "opengl es 2.0";
1879 init
.has_alpha
= true;
1880 init
.has_depth
= true;
1881 init
.request_alpha
= true;
1882 init
.request_depth
= true;
1885 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
1887 GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
1888 SetupClearTextureExpectations(kServiceTextureId
, kServiceTextureId
,
1889 GL_TEXTURE_2D
, GL_TEXTURE_2D
, 0, GL_RGBA
,
1890 GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 1, 2, 1);
1891 EXPECT_CALL(*gl_
, TexSubImage2D(GL_TEXTURE_2D
, 0, 0, _
, _
, 1, GL_RGBA
,
1892 GL_UNSIGNED_BYTE
, shared_memory_address_
))
1894 .RetiresOnSaturation();
1896 cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 2, 1, GL_RGBA
, GL_UNSIGNED_BYTE
,
1897 kSharedMemoryId
, kSharedMemoryOffset
, GL_FALSE
);
1898 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1899 cmd
.Init(GL_TEXTURE_2D
, 0, 0, 1, 1, 1, GL_RGBA
, GL_UNSIGNED_BYTE
,
1900 kSharedMemoryId
, kSharedMemoryOffset
, GL_FALSE
);
1901 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1902 // Test if we call it again it does not clear.
1903 EXPECT_CALL(*gl_
, TexSubImage2D(GL_TEXTURE_2D
, 0, 0, 1, 1, 1, GL_RGBA
,
1904 GL_UNSIGNED_BYTE
, shared_memory_address_
))
1906 .RetiresOnSaturation();
1907 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1910 TEST_P(GLES2DecoderTest
, TexSubImage2DDoesNotClearAfterTexImage2DNULLThenData
) {
1911 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
1913 GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
1914 DoTexImage2D(GL_TEXTURE_2D
,
1923 kSharedMemoryOffset
);
1925 TexSubImage2D(GL_TEXTURE_2D
,
1933 shared_memory_address_
))
1935 .RetiresOnSaturation();
1937 cmd
.Init(GL_TEXTURE_2D
,
1946 kSharedMemoryOffset
,
1948 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1949 // Test if we call it again it does not clear.
1951 TexSubImage2D(GL_TEXTURE_2D
,
1959 shared_memory_address_
))
1961 .RetiresOnSaturation();
1962 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1966 GLES2DecoderManualInitTest
,
1967 TexSubImage2DDoesNotClearAfterTexImage2DNULLThenDataWithTexImage2DIsFaster
) {
1968 base::CommandLine
command_line(0, NULL
);
1969 command_line
.AppendSwitchASCII(
1970 switches::kGpuDriverBugWorkarounds
,
1971 base::IntToString(gpu::TEXSUBIMAGE_FASTER_THAN_TEXIMAGE
));
1973 init
.bind_generates_resource
= true;
1974 InitDecoderWithCommandLine(init
, &command_line
);
1975 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
1977 GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
1980 // Uses texSubimage internally because the above workaround is active and
1981 // the update is for the full size of the texture.
1984 GL_TEXTURE_2D
, 0, 0, 0, 2, 2, GL_RGBA
, GL_UNSIGNED_BYTE
, _
))
1986 .RetiresOnSaturation();
1987 cmds::TexImage2D cmd
;
1988 cmd
.Init(GL_TEXTURE_2D
,
1996 kSharedMemoryOffset
);
1997 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2001 TexSubImage2D(GL_TEXTURE_2D
,
2009 shared_memory_address_
))
2011 .RetiresOnSaturation();
2013 cmd
.Init(GL_TEXTURE_2D
,
2022 kSharedMemoryOffset
,
2024 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2025 // Test if we call it again it does not clear.
2027 TexSubImage2D(GL_TEXTURE_2D
,
2035 shared_memory_address_
))
2037 .RetiresOnSaturation();
2038 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2041 TEST_P(GLES2DecoderTest
, TexSubImage2DClearsAfterTexImage2DWithDataThenNULL
) {
2042 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2043 // Put in data (so it should be marked as cleared)
2044 DoTexImage2D(GL_TEXTURE_2D
,
2053 kSharedMemoryOffset
);
2057 GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2058 // It won't actually call TexImage2D, just mark it as uncleared.
2059 EXPECT_EQ(error::kNoError
, ExecuteCmd(tex_cmd
));
2060 // Next call to TexSubImage2d should clear.
2061 SetupClearTextureExpectations(kServiceTextureId
, kServiceTextureId
,
2062 GL_TEXTURE_2D
, GL_TEXTURE_2D
, 0, GL_RGBA
,
2063 GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 1, 2, 1);
2064 EXPECT_CALL(*gl_
, TexSubImage2D(GL_TEXTURE_2D
, 0, 0, _
, _
, 1, GL_RGBA
,
2065 GL_UNSIGNED_BYTE
, shared_memory_address_
))
2067 .RetiresOnSaturation();
2069 cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 2, 1, GL_RGBA
, GL_UNSIGNED_BYTE
,
2070 kSharedMemoryId
, kSharedMemoryOffset
, GL_FALSE
);
2071 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2072 cmd
.Init(GL_TEXTURE_2D
, 0, 0, 1, 1, 1, GL_RGBA
, GL_UNSIGNED_BYTE
,
2073 kSharedMemoryId
, kSharedMemoryOffset
, GL_FALSE
);
2074 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2077 TEST_P(GLES2DecoderTest
, CopyTexImage2DMarksTextureAsCleared
) {
2078 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2080 TextureManager
* manager
= group().texture_manager();
2081 TextureRef
* texture_ref
= manager
->GetTexture(client_texture_id_
);
2082 ASSERT_TRUE(texture_ref
!= NULL
);
2083 Texture
* texture
= texture_ref
->texture();
2085 EXPECT_CALL(*gl_
, GetError())
2086 .WillOnce(Return(GL_NO_ERROR
))
2087 .RetiresOnSaturation();
2088 EXPECT_CALL(*gl_
, CopyTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 0, 0, 1, 1, 0))
2090 .RetiresOnSaturation();
2091 EXPECT_CALL(*gl_
, GetError())
2092 .WillOnce(Return(GL_NO_ERROR
))
2093 .RetiresOnSaturation();
2095 cmd
.Init(GL_TEXTURE_2D
, 0, GL_RGBA
, 0, 0, 1, 1);
2096 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2098 EXPECT_TRUE(texture
->SafeToRenderFrom());
2101 TEST_P(GLES2DecoderTest
, CopyTexSubImage2DTwiceMarksTextureAsCleared
) {
2102 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2104 GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2106 // This will initialize the top part.
2108 EXPECT_CALL(*gl_
, CopyTexSubImage2D(GL_TEXTURE_2D
, 0, 0, 0, 0, 0, 2, 1))
2110 .RetiresOnSaturation();
2111 CopyTexSubImage2D cmd
;
2112 cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 0, 0, 2, 1);
2113 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2116 // This will initialize the bottom part.
2118 EXPECT_CALL(*gl_
, CopyTexSubImage2D(GL_TEXTURE_2D
, 0, 0, 1, 0, 0, 2, 1))
2120 .RetiresOnSaturation();
2121 CopyTexSubImage2D cmd
;
2122 cmd
.Init(GL_TEXTURE_2D
, 0, 0, 1, 0, 0, 2, 1);
2123 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2126 TextureManager
* manager
= group().texture_manager();
2127 TextureRef
* texture_ref
= manager
->GetTexture(client_texture_id_
);
2128 ASSERT_TRUE(texture_ref
!= NULL
);
2129 Texture
* texture
= texture_ref
->texture();
2130 EXPECT_TRUE(texture
->SafeToRenderFrom());
2133 TEST_P(GLES2DecoderTest
, CopyTexSubImage2DTwiceClearsUnclearedTexture
) {
2134 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2135 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0,
2138 // This will initialize the top part.
2140 EXPECT_CALL(*gl_
, CopyTexSubImage2D(GL_TEXTURE_2D
, 0, 0, 0, 0, 0, 2, 1))
2142 .RetiresOnSaturation();
2143 CopyTexSubImage2D cmd
;
2144 cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 0, 0, 2, 1);
2145 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2148 SetupClearTextureExpectations(kServiceTextureId
, kServiceTextureId
,
2149 GL_TEXTURE_2D
, GL_TEXTURE_2D
, 0, GL_RGBA
,
2150 GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 1, 2, 1);
2152 // This will clear the bottom part as a rectangle is not sufficient to keep
2153 // track of the initialized area.
2155 EXPECT_CALL(*gl_
, CopyTexSubImage2D(GL_TEXTURE_2D
, 0, 1, 1, 0, 0, 1, 1))
2157 .RetiresOnSaturation();
2158 CopyTexSubImage2D cmd
;
2159 cmd
.Init(GL_TEXTURE_2D
, 0, 1, 1, 0, 0, 1, 1);
2160 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2163 TextureManager
* manager
= group().texture_manager();
2164 TextureRef
* texture_ref
= manager
->GetTexture(client_texture_id_
);
2165 ASSERT_TRUE(texture_ref
!= NULL
);
2166 Texture
* texture
= texture_ref
->texture();
2167 EXPECT_TRUE(texture
->SafeToRenderFrom());
2170 TEST_P(GLES2DecoderTest
, CopyTexSubImage2DClearsUnclearedBackBufferSizedTexture
) {
2171 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2172 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, kBackBufferWidth
, kBackBufferHeight
,
2173 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2175 EXPECT_CALL(*gl_
, CopyTexSubImage2D(GL_TEXTURE_2D
, 0, 0, 0, 0, 0,
2176 kBackBufferWidth
, kBackBufferHeight
))
2178 .RetiresOnSaturation();
2179 CopyTexSubImage2D cmd
;
2180 cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 0, 0, kBackBufferWidth
, kBackBufferHeight
);
2181 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2183 TextureManager
* manager
= group().texture_manager();
2184 TextureRef
* texture_ref
= manager
->GetTexture(client_texture_id_
);
2185 ASSERT_TRUE(texture_ref
!= NULL
);
2186 Texture
* texture
= texture_ref
->texture();
2187 EXPECT_TRUE(texture
->SafeToRenderFrom());
2190 TEST_P(GLES2DecoderManualInitTest
, CompressedImage2DMarksTextureAsCleared
) {
2192 init
.extensions
= "GL_EXT_texture_compression_s3tc";
2193 init
.bind_generates_resource
= true;
2196 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2197 EXPECT_CALL(*gl_
, GetError())
2198 .WillOnce(Return(GL_NO_ERROR
))
2199 .RetiresOnSaturation();
2202 CompressedTexImage2D(
2203 GL_TEXTURE_2D
, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT
, 4, 4, 0, 8, _
))
2205 .RetiresOnSaturation();
2206 EXPECT_CALL(*gl_
, GetError())
2207 .WillOnce(Return(GL_NO_ERROR
))
2208 .RetiresOnSaturation();
2209 CompressedTexImage2D cmd
;
2210 cmd
.Init(GL_TEXTURE_2D
,
2212 GL_COMPRESSED_RGB_S3TC_DXT1_EXT
,
2217 kSharedMemoryOffset
);
2218 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2219 TextureManager
* manager
= group().texture_manager();
2220 TextureRef
* texture_ref
= manager
->GetTexture(client_texture_id_
);
2221 EXPECT_TRUE(texture_ref
->texture()->SafeToRenderFrom());
2224 TEST_P(GLES2DecoderTest
, TextureUsageAngleExtNotEnabledByDefault
) {
2225 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2229 GL_TEXTURE_2D
, GL_TEXTURE_USAGE_ANGLE
, GL_FRAMEBUFFER_ATTACHMENT_ANGLE
);
2230 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2231 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
2234 TEST_P(GLES2DecoderTest
, ProduceAndConsumeTextureCHROMIUM
) {
2235 Mailbox mailbox
= Mailbox::Generate();
2237 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2239 GL_TEXTURE_2D
, 0, GL_RGBA
, 3, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2241 GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 4, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2242 TextureRef
* texture_ref
=
2243 group().texture_manager()->GetTexture(client_texture_id_
);
2244 ASSERT_TRUE(texture_ref
!= NULL
);
2245 Texture
* texture
= texture_ref
->texture();
2246 EXPECT_EQ(kServiceTextureId
, texture
->service_id());
2248 ProduceTextureCHROMIUMImmediate
& produce_cmd
=
2249 *GetImmediateAs
<ProduceTextureCHROMIUMImmediate
>();
2250 produce_cmd
.Init(GL_TEXTURE_2D
, mailbox
.name
);
2251 EXPECT_EQ(error::kNoError
,
2252 ExecuteImmediateCmd(produce_cmd
, sizeof(mailbox
.name
)));
2253 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
2255 // Texture didn't change.
2259 GLenum internal_format
;
2262 texture
->GetLevelSize(GL_TEXTURE_2D
, 0, &width
, &height
, nullptr));
2263 EXPECT_EQ(3, width
);
2264 EXPECT_EQ(1, height
);
2265 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 0, &type
, &internal_format
));
2266 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), internal_format
);
2267 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
2270 texture
->GetLevelSize(GL_TEXTURE_2D
, 1, &width
, &height
, nullptr));
2271 EXPECT_EQ(2, width
);
2272 EXPECT_EQ(4, height
);
2273 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 1, &type
, &internal_format
));
2274 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), internal_format
);
2275 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
2277 // Service ID has not changed.
2278 EXPECT_EQ(kServiceTextureId
, texture
->service_id());
2280 // Create new texture for consume.
2281 EXPECT_CALL(*gl_
, GenTextures(_
, _
))
2282 .WillOnce(SetArgumentPointee
<1>(kNewServiceId
))
2283 .RetiresOnSaturation();
2284 DoBindTexture(GL_TEXTURE_2D
, kNewClientId
, kNewServiceId
);
2286 // Assigns and binds original service size texture ID.
2287 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, 0))
2289 .RetiresOnSaturation();
2290 EXPECT_CALL(*gl_
, DeleteTextures(1, _
)).Times(1).RetiresOnSaturation();
2291 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, kServiceTextureId
))
2293 .RetiresOnSaturation();
2295 ConsumeTextureCHROMIUMImmediate
& consume_cmd
=
2296 *GetImmediateAs
<ConsumeTextureCHROMIUMImmediate
>();
2297 consume_cmd
.Init(GL_TEXTURE_2D
, mailbox
.name
);
2298 EXPECT_EQ(error::kNoError
,
2299 ExecuteImmediateCmd(consume_cmd
, sizeof(mailbox
.name
)));
2300 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
2302 // Texture is redefined.
2304 texture
->GetLevelSize(GL_TEXTURE_2D
, 0, &width
, &height
, nullptr));
2305 EXPECT_EQ(3, width
);
2306 EXPECT_EQ(1, height
);
2307 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 0, &type
, &internal_format
));
2308 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), internal_format
);
2309 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
2312 texture
->GetLevelSize(GL_TEXTURE_2D
, 1, &width
, &height
, nullptr));
2313 EXPECT_EQ(2, width
);
2314 EXPECT_EQ(4, height
);
2315 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 1, &type
, &internal_format
));
2316 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), internal_format
);
2317 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
2319 // Service ID is restored.
2320 EXPECT_EQ(kServiceTextureId
, texture
->service_id());
2323 TEST_P(GLES2DecoderTest
, ProduceAndConsumeDirectTextureCHROMIUM
) {
2324 Mailbox mailbox
= Mailbox::Generate();
2326 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2328 GL_TEXTURE_2D
, 0, GL_RGBA
, 3, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2330 GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 4, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2331 TextureRef
* texture_ref
=
2332 group().texture_manager()->GetTexture(client_texture_id_
);
2333 ASSERT_TRUE(texture_ref
!= NULL
);
2334 Texture
* texture
= texture_ref
->texture();
2335 EXPECT_EQ(kServiceTextureId
, texture
->service_id());
2337 ProduceTextureDirectCHROMIUMImmediate
& produce_cmd
=
2338 *GetImmediateAs
<ProduceTextureDirectCHROMIUMImmediate
>();
2339 produce_cmd
.Init(client_texture_id_
, GL_TEXTURE_2D
, mailbox
.name
);
2340 EXPECT_EQ(error::kNoError
,
2341 ExecuteImmediateCmd(produce_cmd
, sizeof(mailbox
.name
)));
2342 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
2344 // Texture didn't change.
2348 GLenum internal_format
;
2351 texture
->GetLevelSize(GL_TEXTURE_2D
, 0, &width
, &height
, nullptr));
2352 EXPECT_EQ(3, width
);
2353 EXPECT_EQ(1, height
);
2354 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 0, &type
, &internal_format
));
2355 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), internal_format
);
2356 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
2359 texture
->GetLevelSize(GL_TEXTURE_2D
, 1, &width
, &height
, nullptr));
2360 EXPECT_EQ(2, width
);
2361 EXPECT_EQ(4, height
);
2362 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 1, &type
, &internal_format
));
2363 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), internal_format
);
2364 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
2366 // Service ID has not changed.
2367 EXPECT_EQ(kServiceTextureId
, texture
->service_id());
2369 // Consume the texture into a new client ID.
2370 GLuint new_texture_id
= kNewClientId
;
2371 CreateAndConsumeTextureCHROMIUMImmediate
& consume_cmd
=
2372 *GetImmediateAs
<CreateAndConsumeTextureCHROMIUMImmediate
>();
2373 consume_cmd
.Init(GL_TEXTURE_2D
, new_texture_id
, mailbox
.name
);
2374 EXPECT_EQ(error::kNoError
,
2375 ExecuteImmediateCmd(consume_cmd
, sizeof(mailbox
.name
)));
2376 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
2378 // Make sure the new client ID is associated with the produced service ID.
2379 texture_ref
= group().texture_manager()->GetTexture(new_texture_id
);
2380 ASSERT_TRUE(texture_ref
!= NULL
);
2381 texture
= texture_ref
->texture();
2382 EXPECT_EQ(kServiceTextureId
, texture
->service_id());
2384 DoBindTexture(GL_TEXTURE_2D
, kNewClientId
, kServiceTextureId
);
2386 // Texture is redefined.
2388 texture
->GetLevelSize(GL_TEXTURE_2D
, 0, &width
, &height
, nullptr));
2389 EXPECT_EQ(3, width
);
2390 EXPECT_EQ(1, height
);
2391 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 0, &type
, &internal_format
));
2392 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), internal_format
);
2393 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
2396 texture
->GetLevelSize(GL_TEXTURE_2D
, 1, &width
, &height
, nullptr));
2397 EXPECT_EQ(2, width
);
2398 EXPECT_EQ(4, height
);
2399 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 1, &type
, &internal_format
));
2400 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), internal_format
);
2401 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
2404 TEST_P(GLES2DecoderTest
, ProduceTextureCHROMIUMInvalidTarget
) {
2405 Mailbox mailbox
= Mailbox::Generate();
2407 DoBindTexture(GL_TEXTURE_CUBE_MAP
, client_texture_id_
, kServiceTextureId
);
2409 GL_TEXTURE_CUBE_MAP_POSITIVE_X
, 0, GL_RGBA
, 3, 1, 0, GL_RGBA
,
2410 GL_UNSIGNED_BYTE
, 0, 0);
2411 TextureRef
* texture_ref
=
2412 group().texture_manager()->GetTexture(client_texture_id_
);
2413 ASSERT_TRUE(texture_ref
!= NULL
);
2414 Texture
* texture
= texture_ref
->texture();
2415 EXPECT_EQ(kServiceTextureId
, texture
->service_id());
2417 ProduceTextureDirectCHROMIUMImmediate
& produce_cmd
=
2418 *GetImmediateAs
<ProduceTextureDirectCHROMIUMImmediate
>();
2419 produce_cmd
.Init(client_texture_id_
, GL_TEXTURE_2D
, mailbox
.name
);
2420 EXPECT_EQ(error::kNoError
,
2421 ExecuteImmediateCmd(produce_cmd
, sizeof(mailbox
.name
)));
2423 // ProduceTexture should fail it the texture and produce targets don't match.
2424 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
2427 TEST_P(GLES2DecoderTest
, CreateAndConsumeTextureCHROMIUMInvalidMailbox
) {
2428 // Attempt to consume the mailbox when no texture has been produced with it.
2429 Mailbox mailbox
= Mailbox::Generate();
2430 GLuint new_texture_id
= kNewClientId
;
2432 EXPECT_CALL(*gl_
, GenTextures(1, _
))
2433 .WillOnce(SetArgumentPointee
<1>(kNewServiceId
))
2434 .RetiresOnSaturation();
2435 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, _
))
2437 .RetiresOnSaturation();
2438 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
))
2440 .RetiresOnSaturation();
2442 CreateAndConsumeTextureCHROMIUMImmediate
& consume_cmd
=
2443 *GetImmediateAs
<CreateAndConsumeTextureCHROMIUMImmediate
>();
2444 consume_cmd
.Init(GL_TEXTURE_2D
, new_texture_id
, mailbox
.name
);
2445 EXPECT_EQ(error::kNoError
,
2446 ExecuteImmediateCmd(consume_cmd
, sizeof(mailbox
.name
)));
2448 // CreateAndConsumeTexture should fail if the mailbox isn't associated with a
2450 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
2452 // Make sure the new client_id is associated with a texture ref even though
2453 // CreateAndConsumeTexture failed.
2454 TextureRef
* texture_ref
=
2455 group().texture_manager()->GetTexture(new_texture_id
);
2456 ASSERT_TRUE(texture_ref
!= NULL
);
2457 Texture
* texture
= texture_ref
->texture();
2458 // New texture should have the correct target type.
2459 EXPECT_TRUE(texture
->target() == GL_TEXTURE_2D
);
2460 // New texture should have a valid service_id.
2461 EXPECT_EQ(kNewServiceId
, texture
->service_id());
2464 TEST_P(GLES2DecoderTest
, CreateAndConsumeTextureCHROMIUMInvalidTarget
) {
2465 Mailbox mailbox
= Mailbox::Generate();
2467 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2468 TextureRef
* texture_ref
=
2469 group().texture_manager()->GetTexture(client_texture_id_
);
2470 ASSERT_TRUE(texture_ref
!= NULL
);
2472 ProduceTextureDirectCHROMIUMImmediate
& produce_cmd
=
2473 *GetImmediateAs
<ProduceTextureDirectCHROMIUMImmediate
>();
2474 produce_cmd
.Init(client_texture_id_
, GL_TEXTURE_2D
, mailbox
.name
);
2475 EXPECT_EQ(error::kNoError
,
2476 ExecuteImmediateCmd(produce_cmd
, sizeof(mailbox
.name
)));
2477 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
2479 EXPECT_CALL(*gl_
, GenTextures(1, _
))
2480 .WillOnce(SetArgumentPointee
<1>(kNewServiceId
))
2481 .RetiresOnSaturation();
2482 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_CUBE_MAP
, _
))
2484 .RetiresOnSaturation();
2485 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
))
2487 .RetiresOnSaturation();
2489 // Attempt to consume the mailbox with a different target.
2490 GLuint new_texture_id
= kNewClientId
;
2491 CreateAndConsumeTextureCHROMIUMImmediate
& consume_cmd
=
2492 *GetImmediateAs
<CreateAndConsumeTextureCHROMIUMImmediate
>();
2493 consume_cmd
.Init(GL_TEXTURE_CUBE_MAP
, new_texture_id
, mailbox
.name
);
2494 EXPECT_EQ(error::kNoError
,
2495 ExecuteImmediateCmd(consume_cmd
, sizeof(mailbox
.name
)));
2497 // CreateAndConsumeTexture should fail if the produced texture had a different
2499 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
2501 // Make sure the new client_id is associated with a texture ref even though
2502 // CreateAndConsumeTexture failed.
2503 texture_ref
= group().texture_manager()->GetTexture(new_texture_id
);
2504 ASSERT_TRUE(texture_ref
!= NULL
);
2505 Texture
* texture
= texture_ref
->texture();
2506 // New texture should have the correct target type.
2507 EXPECT_TRUE(texture
->target() == GL_TEXTURE_CUBE_MAP
);
2508 // New texture should have a valid service_id.
2509 EXPECT_EQ(kNewServiceId
, texture
->service_id());
2511 // Make sure the client_id did not become associated with the produced texture
2513 EXPECT_NE(kServiceTextureId
, texture
->service_id());
2516 TEST_P(GLES2DecoderManualInitTest
, DepthTextureBadArgs
) {
2518 init
.extensions
= "GL_ANGLE_depth_texture";
2519 init
.gl_version
= "opengl es 2.0";
2520 init
.has_depth
= true;
2521 init
.has_stencil
= true;
2522 init
.request_depth
= true;
2523 init
.request_stencil
= true;
2524 init
.bind_generates_resource
= true;
2527 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2528 // Check trying to upload data fails.
2530 tex_cmd
.Init(GL_TEXTURE_2D
,
2538 kSharedMemoryOffset
);
2539 EXPECT_EQ(error::kNoError
, ExecuteCmd(tex_cmd
));
2540 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
2542 tex_cmd
.Init(GL_TEXTURE_2D
,
2551 EXPECT_EQ(error::kNoError
, ExecuteCmd(tex_cmd
));
2552 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
2553 // Make a 1 pixel depth texture.
2554 DoTexImage2D(GL_TEXTURE_2D
,
2564 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
2566 // Check that trying to update it fails.
2567 TexSubImage2D tex_sub_cmd
;
2568 tex_sub_cmd
.Init(GL_TEXTURE_2D
,
2577 kSharedMemoryOffset
,
2579 EXPECT_EQ(error::kNoError
, ExecuteCmd(tex_sub_cmd
));
2580 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
2582 // Check that trying to CopyTexImage2D fails
2583 CopyTexImage2D copy_tex_cmd
;
2584 copy_tex_cmd
.Init(GL_TEXTURE_2D
, 0, GL_DEPTH_COMPONENT
, 0, 0, 1, 1);
2585 EXPECT_EQ(error::kNoError
, ExecuteCmd(copy_tex_cmd
));
2586 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
2588 // Check that trying to CopyTexSubImage2D fails
2589 CopyTexSubImage2D copy_sub_cmd
;
2590 copy_sub_cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, 0, 0, 1, 1);
2591 EXPECT_EQ(error::kNoError
, ExecuteCmd(copy_sub_cmd
));
2592 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
2595 TEST_P(GLES2DecoderManualInitTest
, GenerateMipmapDepthTexture
) {
2597 init
.extensions
= "GL_ANGLE_depth_texture";
2598 init
.gl_version
= "opengl es 2.0";
2599 init
.has_depth
= true;
2600 init
.has_stencil
= true;
2601 init
.request_depth
= true;
2602 init
.request_stencil
= true;
2603 init
.bind_generates_resource
= true;
2605 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2606 DoTexImage2D(GL_TEXTURE_2D
,
2617 cmd
.Init(GL_TEXTURE_2D
);
2618 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2619 EXPECT_EQ(GL_INVALID_OPERATION
, GetGLError());
2622 TEST_P(GLES2DecoderTest
, BindTexImage2DCHROMIUM
) {
2623 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2625 GL_TEXTURE_2D
, 0, GL_RGBA
, 3, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2626 TextureRef
* texture_ref
=
2627 group().texture_manager()->GetTexture(client_texture_id_
);
2628 ASSERT_TRUE(texture_ref
!= NULL
);
2629 Texture
* texture
= texture_ref
->texture();
2630 EXPECT_EQ(kServiceTextureId
, texture
->service_id());
2632 scoped_refptr
<gfx::GLImage
> image(new gfx::GLImageStub
);
2633 GetImageManager()->AddImage(image
.get(), 1);
2634 EXPECT_FALSE(GetImageManager()->LookupImage(1) == NULL
);
2639 GLenum internal_format
;
2642 texture
->GetLevelSize(GL_TEXTURE_2D
, 0, &width
, &height
, nullptr));
2643 EXPECT_EQ(3, width
);
2644 EXPECT_EQ(1, height
);
2645 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 0, &type
, &internal_format
));
2646 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), internal_format
);
2647 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
2648 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == NULL
);
2650 // Bind image to texture.
2651 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2652 DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D
, 1);
2654 texture
->GetLevelSize(GL_TEXTURE_2D
, 0, &width
, &height
, nullptr));
2655 // Image should now be set.
2656 EXPECT_FALSE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == NULL
);
2658 // Define new texture image.
2660 GL_TEXTURE_2D
, 0, GL_RGBA
, 3, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2662 texture
->GetLevelSize(GL_TEXTURE_2D
, 0, &width
, &height
, nullptr));
2663 // Image should no longer be set.
2664 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == NULL
);
2667 TEST_P(GLES2DecoderTest
, BindTexImage2DCHROMIUMCubeMapNotAllowed
) {
2668 scoped_refptr
<gfx::GLImage
> image(new gfx::GLImageStub
);
2669 GetImageManager()->AddImage(image
.get(), 1);
2670 DoBindTexture(GL_TEXTURE_CUBE_MAP
, client_texture_id_
, kServiceTextureId
);
2672 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd
;
2673 bind_tex_image_2d_cmd
.Init(GL_TEXTURE_CUBE_MAP
, 1);
2674 EXPECT_EQ(error::kNoError
, ExecuteCmd(bind_tex_image_2d_cmd
));
2675 EXPECT_EQ(GL_INVALID_ENUM
, GetGLError());
2678 TEST_P(GLES2DecoderTest
, OrphanGLImageWithTexImage2D
) {
2679 scoped_refptr
<gfx::GLImage
> image(new gfx::GLImageStub
);
2680 GetImageManager()->AddImage(image
.get(), 1);
2681 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2683 DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D
, 1);
2685 TextureRef
* texture_ref
=
2686 group().texture_manager()->GetTexture(client_texture_id_
);
2687 ASSERT_TRUE(texture_ref
!= NULL
);
2688 Texture
* texture
= texture_ref
->texture();
2690 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == image
.get());
2692 GL_TEXTURE_2D
, 0, GL_RGBA
, 3, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2693 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == NULL
);
2696 TEST_P(GLES2DecoderTest
, GLImageAttachedAfterSubTexImage2D
) {
2697 // Specifically tests that TexSubImage2D is not optimized to TexImage2D
2698 // in the presence of image attachments.
2700 feature_info()->workarounds().texsubimage_faster_than_teximage
);
2702 scoped_refptr
<gfx::GLImage
> image(new gfx::GLImageStub
);
2703 GetImageManager()->AddImage(image
.get(), 1);
2704 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2706 GLenum target
= GL_TEXTURE_2D
;
2713 GLenum format
= GL_RGBA
;
2714 GLenum type
= GL_UNSIGNED_BYTE
;
2715 uint32_t pixels_shm_id
= kSharedMemoryId
;
2716 uint32_t pixels_shm_offset
= kSharedMemoryOffset
;
2717 GLboolean internal
= 0;
2719 // Define texture first.
2720 DoTexImage2D(target
, level
, format
, width
, height
, border
, format
, type
,
2721 pixels_shm_id
, pixels_shm_offset
);
2723 // Bind texture to GLImage.
2724 DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D
, 1);
2727 TextureRef
* texture_ref
=
2728 group().texture_manager()->GetTexture(client_texture_id_
);
2729 ASSERT_TRUE(texture_ref
!= NULL
);
2730 Texture
* texture
= texture_ref
->texture();
2731 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == image
.get());
2733 // TexSubImage2D should not unbind GLImage.
2734 EXPECT_CALL(*gl_
, TexSubImage2D(target
, level
, xoffset
, yoffset
, width
,
2735 height
, format
, type
, _
))
2737 .RetiresOnSaturation();
2738 cmds::TexSubImage2D tex_sub_image_2d_cmd
;
2739 tex_sub_image_2d_cmd
.Init(target
, level
, xoffset
, yoffset
, width
, height
,
2740 format
, type
, pixels_shm_id
, pixels_shm_offset
,
2742 EXPECT_EQ(error::kNoError
, ExecuteCmd(tex_sub_image_2d_cmd
));
2743 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == image
.get());
2746 TEST_P(GLES2DecoderTest
, GLImageAttachedAfterClearLevel
) {
2747 scoped_refptr
<gfx::GLImage
> image(new gfx::GLImageStub
);
2748 GetImageManager()->AddImage(image
.get(), 1);
2749 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2751 GLenum target
= GL_TEXTURE_2D
;
2758 GLenum format
= GL_RGBA
;
2759 GLenum type
= GL_UNSIGNED_BYTE
;
2760 uint32_t pixels_shm_id
= kSharedMemoryId
;
2761 uint32_t pixels_shm_offset
= kSharedMemoryOffset
;
2763 // Define texture first.
2764 DoTexImage2D(target
, level
, format
, width
, height
, border
, format
, type
,
2765 pixels_shm_id
, pixels_shm_offset
);
2767 // Bind texture to GLImage.
2768 DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D
, 1);
2771 TextureRef
* texture_ref
=
2772 group().texture_manager()->GetTexture(client_texture_id_
);
2773 ASSERT_TRUE(texture_ref
!= NULL
);
2774 Texture
* texture
= texture_ref
->texture();
2775 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == image
.get());
2777 // ClearLevel should use glTexSubImage2D to avoid unbinding GLImage.
2778 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, kServiceTextureId
))
2780 .RetiresOnSaturation();
2781 EXPECT_CALL(*gl_
, TexSubImage2D(target
, level
, xoffset
, yoffset
, width
,
2782 height
, format
, type
, _
))
2784 .RetiresOnSaturation();
2785 GetDecoder()->ClearLevel(texture
, target
, level
, format
, type
, 0, 0, width
,
2787 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == image
.get());
2790 TEST_P(GLES2DecoderTest
, ReleaseTexImage2DCHROMIUM
) {
2791 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2793 GL_TEXTURE_2D
, 0, GL_RGBA
, 3, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, 0, 0);
2794 TextureRef
* texture_ref
=
2795 group().texture_manager()->GetTexture(client_texture_id_
);
2796 ASSERT_TRUE(texture_ref
!= NULL
);
2797 Texture
* texture
= texture_ref
->texture();
2798 EXPECT_EQ(kServiceTextureId
, texture
->service_id());
2800 scoped_refptr
<gfx::GLImage
> image(new gfx::GLImageStub
);
2801 GetImageManager()->AddImage(image
.get(), 1);
2802 EXPECT_FALSE(GetImageManager()->LookupImage(1) == NULL
);
2807 GLenum internal_format
;
2810 texture
->GetLevelSize(GL_TEXTURE_2D
, 0, &width
, &height
, nullptr));
2811 EXPECT_EQ(3, width
);
2812 EXPECT_EQ(1, height
);
2813 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 0, &type
, &internal_format
));
2814 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), internal_format
);
2815 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
2816 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == NULL
);
2818 // Bind image to texture.
2819 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2820 DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D
, 1);
2822 texture
->GetLevelSize(GL_TEXTURE_2D
, 0, &width
, &height
, nullptr));
2823 // Image should now be set.
2824 EXPECT_FALSE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == NULL
);
2826 // Release image from texture.
2827 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2828 EXPECT_CALL(*gl_
, GetError())
2829 .WillOnce(Return(GL_NO_ERROR
))
2830 .WillOnce(Return(GL_NO_ERROR
))
2831 .RetiresOnSaturation();
2832 ReleaseTexImage2DCHROMIUM release_tex_image_2d_cmd
;
2833 release_tex_image_2d_cmd
.Init(GL_TEXTURE_2D
, 1);
2834 EXPECT_EQ(error::kNoError
, ExecuteCmd(release_tex_image_2d_cmd
));
2836 texture
->GetLevelSize(GL_TEXTURE_2D
, 0, &width
, &height
, nullptr));
2837 // Image should no longer be set.
2838 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 0) == NULL
);
2841 class MockGLImage
: public gfx::GLImage
{
2845 // Overridden from gfx::GLImage:
2846 MOCK_METHOD0(GetSize
, gfx::Size());
2847 MOCK_METHOD0(GetInternalFormat
, unsigned());
2848 MOCK_METHOD1(Destroy
, void(bool));
2849 MOCK_METHOD1(BindTexImage
, bool(unsigned));
2850 MOCK_METHOD1(ReleaseTexImage
, void(unsigned));
2851 MOCK_METHOD3(CopyTexSubImage
,
2852 bool(unsigned, const gfx::Point
&, const gfx::Rect
&));
2853 MOCK_METHOD0(WillUseTexImage
, void());
2854 MOCK_METHOD0(DidUseTexImage
, void());
2855 MOCK_METHOD0(WillModifyTexImage
, void());
2856 MOCK_METHOD0(DidModifyTexImage
, void());
2857 MOCK_METHOD5(ScheduleOverlayPlane
, bool(gfx::AcceleratedWidget
,
2859 gfx::OverlayTransform
,
2861 const gfx::RectF
&));
2862 MOCK_METHOD3(OnMemoryDump
,
2863 void(base::trace_event::ProcessMemoryDump
*,
2865 const std::string
&));
2868 virtual ~MockGLImage() {}
2871 TEST_P(GLES2DecoderWithShaderTest
, UseTexImage
) {
2872 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
2873 DoTexImage2D(GL_TEXTURE_2D
,
2882 kSharedMemoryOffset
);
2884 TextureRef
* texture_ref
=
2885 group().texture_manager()->GetTexture(client_texture_id_
);
2886 ASSERT_TRUE(texture_ref
!= NULL
);
2887 Texture
* texture
= texture_ref
->texture();
2888 EXPECT_EQ(kServiceTextureId
, texture
->service_id());
2890 const int32 kImageId
= 1;
2891 scoped_refptr
<MockGLImage
> image(new MockGLImage
);
2892 GetImageManager()->AddImage(image
.get(), kImageId
);
2894 // Bind image to texture.
2895 EXPECT_CALL(*image
.get(), BindTexImage(GL_TEXTURE_2D
))
2897 .WillOnce(Return(true))
2898 .RetiresOnSaturation();
2899 EXPECT_CALL(*image
.get(), GetSize())
2901 .WillOnce(Return(gfx::Size(1, 1)))
2902 .RetiresOnSaturation();
2903 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2904 DoBindTexImage2DCHROMIUM(GL_TEXTURE_2D
, kImageId
);
2906 AddExpectationsForSimulatedAttrib0(kNumVertices
, 0);
2907 SetupExpectationsForApplyingDefaultDirtyState();
2909 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2910 EXPECT_CALL(*gl_
, GetError())
2911 .WillOnce(Return(GL_NO_ERROR
))
2912 .WillOnce(Return(GL_NO_ERROR
))
2913 .WillOnce(Return(GL_NO_ERROR
))
2914 .WillOnce(Return(GL_NO_ERROR
))
2915 .RetiresOnSaturation();
2916 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
)).Times(3).RetiresOnSaturation();
2917 EXPECT_CALL(*image
.get(), WillUseTexImage()).Times(1).RetiresOnSaturation();
2918 EXPECT_CALL(*image
.get(), DidUseTexImage()).Times(1).RetiresOnSaturation();
2919 EXPECT_CALL(*gl_
, DrawArrays(GL_TRIANGLES
, 0, kNumVertices
))
2921 .RetiresOnSaturation();
2923 cmd
.Init(GL_TRIANGLES
, 0, kNumVertices
);
2924 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
2925 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
2928 GL_FRAMEBUFFER
, client_framebuffer_id_
, kServiceFramebufferId
);
2929 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2930 EXPECT_CALL(*gl_
, GetError())
2931 .WillOnce(Return(GL_NO_ERROR
))
2932 .WillOnce(Return(GL_NO_ERROR
))
2933 .RetiresOnSaturation();
2934 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
)).Times(1).RetiresOnSaturation();
2935 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, kServiceTextureId
))
2937 .RetiresOnSaturation();
2938 // Image will be 'in use' as long as bound to a framebuffer.
2939 EXPECT_CALL(*image
.get(), WillUseTexImage()).Times(1).RetiresOnSaturation();
2941 FramebufferTexture2DEXT(GL_FRAMEBUFFER
,
2942 GL_COLOR_ATTACHMENT0
,
2947 .RetiresOnSaturation();
2948 EXPECT_CALL(*gl_
, GetError())
2949 .WillOnce(Return(GL_NO_ERROR
))
2950 .WillOnce(Return(GL_NO_ERROR
))
2951 .RetiresOnSaturation();
2952 FramebufferTexture2D fbtex_cmd
;
2953 fbtex_cmd
.Init(GL_FRAMEBUFFER
,
2954 GL_COLOR_ATTACHMENT0
,
2956 client_texture_id_
);
2957 EXPECT_EQ(error::kNoError
, ExecuteCmd(fbtex_cmd
));
2958 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
2960 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor.
2961 EXPECT_CALL(*gl_
, GetError())
2962 .WillOnce(Return(GL_NO_ERROR
))
2963 .WillOnce(Return(GL_NO_ERROR
))
2964 .RetiresOnSaturation();
2966 FramebufferRenderbufferEXT(GL_FRAMEBUFFER
,
2967 GL_COLOR_ATTACHMENT0
,
2969 kServiceRenderbufferId
))
2971 .RetiresOnSaturation();
2972 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
)).Times(1).RetiresOnSaturation();
2973 EXPECT_CALL(*gl_
, BindTexture(GL_TEXTURE_2D
, kServiceTextureId
))
2975 .RetiresOnSaturation();
2976 // Image should no longer be 'in use' after being unbound from framebuffer.
2977 EXPECT_CALL(*image
.get(), DidUseTexImage()).Times(1).RetiresOnSaturation();
2978 EXPECT_CALL(*gl_
, GetError())
2979 .WillOnce(Return(GL_NO_ERROR
))
2980 .WillOnce(Return(GL_NO_ERROR
))
2981 .RetiresOnSaturation();
2982 FramebufferRenderbuffer fbrb_cmd
;
2983 fbrb_cmd
.Init(GL_FRAMEBUFFER
,
2984 GL_COLOR_ATTACHMENT0
,
2986 client_renderbuffer_id_
);
2987 EXPECT_EQ(error::kNoError
, ExecuteCmd(fbrb_cmd
));
2990 TEST_P(GLES2DecoderManualInitTest
, DrawWithGLImageExternal
) {
2992 init
.extensions
= "GL_OES_EGL_image_external";
2993 init
.gl_version
= "opengl es 2.0";
2994 init
.has_alpha
= true;
2995 init
.has_depth
= true;
2996 init
.request_alpha
= true;
2997 init
.request_depth
= true;
2998 init
.bind_generates_resource
= true;
3001 TextureRef
* texture_ref
= GetTexture(client_texture_id_
);
3002 scoped_refptr
<MockGLImage
> image(new MockGLImage
);
3003 group().texture_manager()->SetTarget(texture_ref
, GL_TEXTURE_EXTERNAL_OES
);
3004 group().texture_manager()->SetLevelInfo(texture_ref
, GL_TEXTURE_EXTERNAL_OES
,
3005 0, GL_RGBA
, 0, 0, 1, 0, GL_RGBA
,
3006 GL_UNSIGNED_BYTE
, gfx::Rect());
3007 group().texture_manager()->SetLevelImage(
3008 texture_ref
, GL_TEXTURE_EXTERNAL_OES
, 0, image
.get());
3010 DoBindTexture(GL_TEXTURE_EXTERNAL_OES
, client_texture_id_
, kServiceTextureId
);
3011 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
3013 SetupSamplerExternalProgram();
3015 AddExpectationsForSimulatedAttrib0(kMaxValidIndex
+ 1, 0);
3016 SetupExpectationsForApplyingDefaultDirtyState();
3017 EXPECT_TRUE(group().texture_manager()->CanRender(texture_ref
));
3020 EXPECT_CALL(*gl_
, GetError())
3021 .WillOnce(Return(GL_NO_ERROR
))
3022 .RetiresOnSaturation();
3023 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
)).Times(1).RetiresOnSaturation();
3024 EXPECT_CALL(*image
.get(), WillUseTexImage()).Times(1).RetiresOnSaturation();
3025 EXPECT_CALL(*gl_
, GetError())
3026 .WillOnce(Return(GL_NO_ERROR
))
3027 .RetiresOnSaturation();
3028 EXPECT_CALL(*gl_
, DrawElements(_
, _
, _
, _
)).Times(1);
3029 EXPECT_CALL(*gl_
, GetError())
3030 .WillOnce(Return(GL_NO_ERROR
))
3031 .RetiresOnSaturation();
3032 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
)).Times(1).RetiresOnSaturation();
3033 EXPECT_CALL(*image
.get(), DidUseTexImage()).Times(1).RetiresOnSaturation();
3034 EXPECT_CALL(*gl_
, GetError())
3035 .WillOnce(Return(GL_NO_ERROR
))
3036 .RetiresOnSaturation();
3037 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
)).Times(1).RetiresOnSaturation();
3039 cmd
.Init(GL_TRIANGLES
,
3040 kValidIndexRangeCount
,
3042 kValidIndexRangeStart
* 2);
3043 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
3044 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
3047 TEST_P(GLES2DecoderManualInitTest
, TexImage2DFloatOnGLES2
) {
3049 init
.extensions
= "GL_OES_texture_float";
3050 init
.gl_version
= "opengl es 2.0";
3052 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
3053 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 16, 17, 0, GL_RGBA
, GL_FLOAT
, 0, 0);
3054 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_RGB
, 16, 17, 0, GL_RGB
, GL_FLOAT
, 0, 0);
3056 GL_TEXTURE_2D
, 0, GL_LUMINANCE
, 16, 17, 0, GL_LUMINANCE
, GL_FLOAT
, 0, 0);
3057 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_ALPHA
, 16, 17, 0, GL_ALPHA
, GL_FLOAT
, 0, 0);
3058 DoTexImage2D(GL_TEXTURE_2D
,
3070 TEST_P(GLES2DecoderManualInitTest
, TexImage2DFloatOnGLES3
) {
3072 init
.extensions
= "GL_OES_texture_float GL_EXT_color_buffer_float";
3073 init
.gl_version
= "opengl es 3.0";
3075 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
3076 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 16, 17, 0, GL_RGBA
, GL_FLOAT
, 0, 0);
3077 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_RGB
, 16, 17, 0, GL_RGB
, GL_FLOAT
, 0, 0);
3079 GL_TEXTURE_2D
, 0, GL_RGBA32F
, 16, 17, 0, GL_RGBA
, GL_FLOAT
, 0, 0);
3081 GL_TEXTURE_2D
, 0, GL_LUMINANCE
, 16, 17, 0, GL_LUMINANCE
, GL_FLOAT
, 0, 0);
3082 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_ALPHA
, 16, 17, 0, GL_ALPHA
, GL_FLOAT
, 0, 0);
3083 DoTexImage2D(GL_TEXTURE_2D
,
3095 TEST_P(GLES2DecoderManualInitTest
, TexSubImage2DFloatOnGLES3
) {
3097 init
.extensions
= "GL_OES_texture_float GL_EXT_color_buffer_float";
3098 init
.gl_version
= "opengl es 3.0";
3100 const int kWidth
= 8;
3101 const int kHeight
= 4;
3102 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
3103 DoTexImage2D(GL_TEXTURE_2D
,
3114 TexImage2D(GL_TEXTURE_2D
,
3122 shared_memory_address_
))
3124 .RetiresOnSaturation();
3126 cmd
.Init(GL_TEXTURE_2D
,
3135 kSharedMemoryOffset
,
3137 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
3138 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
3141 TEST_P(GLES2DecoderManualInitTest
, TexSubImage2DFloatDoesClearOnGLES3
) {
3143 init
.extensions
= "GL_OES_texture_float GL_EXT_color_buffer_float";
3144 init
.gl_version
= "opengl es 3.0";
3146 const int kWidth
= 8;
3147 const int kHeight
= 4;
3148 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
3149 DoTexImage2D(GL_TEXTURE_2D
,
3159 SetupClearTextureExpectations(kServiceTextureId
, kServiceTextureId
,
3160 GL_TEXTURE_2D
, GL_TEXTURE_2D
, 0, GL_RGBA32F
,
3161 GL_RGBA
, GL_FLOAT
, 0, kHeight
- 1, kWidth
, 1);
3162 EXPECT_CALL(*gl_
, TexSubImage2D(GL_TEXTURE_2D
, 0, 0, _
, _
, _
, GL_RGBA
,
3163 GL_FLOAT
, shared_memory_address_
))
3165 .RetiresOnSaturation();
3167 cmd
.Init(GL_TEXTURE_2D
, 0, 0, 0, kWidth
, kHeight
- 1, GL_RGBA
, GL_FLOAT
,
3168 kSharedMemoryId
, kSharedMemoryOffset
, GL_FALSE
);
3169 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
3170 cmd
.Init(GL_TEXTURE_2D
, 0, 0, kHeight
- 1, kWidth
- 1, 1, GL_RGBA
, GL_FLOAT
,
3171 kSharedMemoryId
, kSharedMemoryOffset
, GL_FALSE
);
3172 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
3173 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
3176 TEST_P(GLES2DecoderManualInitTest
, TexImage2DFloatConvertsFormatDesktop
) {
3178 init
.extensions
= "GL_ARB_texture_float";
3180 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
3182 GL_TEXTURE_2D
, 0, GL_RGBA32F
, 16, 17, 0, GL_RGBA
, GL_FLOAT
, 0, 0);
3183 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_RGB32F
, 16, 17, 0, GL_RGB
, GL_FLOAT
, 0, 0);
3184 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D
,
3195 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D
,
3206 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D
,
3216 GL_LUMINANCE32F_ARB
);
3217 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D
,
3228 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D
,
3238 GL_LUMINANCE_ALPHA32F_ARB
);
3241 class GLES2DecoderCompressedFormatsTest
: public GLES2DecoderManualInitTest
{
3243 GLES2DecoderCompressedFormatsTest() {}
3245 static bool ValueInArray(GLint value
, GLint
* array
, GLint count
) {
3246 for (GLint ii
= 0; ii
< count
; ++ii
) {
3247 if (array
[ii
] == value
) {
3254 void CheckFormats(const char* extension
, const GLenum
* formats
, int count
) {
3256 init
.extensions
= extension
;
3257 init
.bind_generates_resource
= true;
3260 EXPECT_CALL(*gl_
, GetError())
3261 .WillOnce(Return(GL_NO_ERROR
))
3262 .WillOnce(Return(GL_NO_ERROR
))
3263 .WillOnce(Return(GL_NO_ERROR
))
3264 .WillOnce(Return(GL_NO_ERROR
))
3265 .RetiresOnSaturation();
3267 typedef GetIntegerv::Result Result
;
3268 Result
* result
= static_cast<Result
*>(shared_memory_address_
);
3271 EXPECT_CALL(*gl_
, GetIntegerv(_
, _
)).Times(0).RetiresOnSaturation();
3272 cmd
.Init(GL_NUM_COMPRESSED_TEXTURE_FORMATS
,
3274 shared_memory_offset_
);
3275 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
3276 EXPECT_EQ(1, result
->GetNumResults());
3277 GLint num_formats
= result
->GetData()[0];
3278 EXPECT_EQ(count
, num_formats
);
3279 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
3282 cmd
.Init(GL_COMPRESSED_TEXTURE_FORMATS
,
3284 shared_memory_offset_
);
3285 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
3286 EXPECT_EQ(num_formats
, result
->GetNumResults());
3288 for (int i
= 0; i
< count
; ++i
) {
3290 ValueInArray(formats
[i
], result
->GetData(), result
->GetNumResults()));
3293 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
3297 INSTANTIATE_TEST_CASE_P(Service
,
3298 GLES2DecoderCompressedFormatsTest
,
3301 TEST_P(GLES2DecoderCompressedFormatsTest
, GetCompressedTextureFormatsS3TC
) {
3302 const GLenum formats
[] = {
3303 GL_COMPRESSED_RGB_S3TC_DXT1_EXT
, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
,
3304 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
};
3305 CheckFormats("GL_EXT_texture_compression_s3tc", formats
, 4);
3308 TEST_P(GLES2DecoderCompressedFormatsTest
, GetCompressedTextureFormatsATC
) {
3309 const GLenum formats
[] = {GL_ATC_RGB_AMD
, GL_ATC_RGBA_EXPLICIT_ALPHA_AMD
,
3310 GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD
};
3311 CheckFormats("GL_AMD_compressed_ATC_texture", formats
, 3);
3314 TEST_P(GLES2DecoderCompressedFormatsTest
, GetCompressedTextureFormatsPVRTC
) {
3315 const GLenum formats
[] = {
3316 GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
, GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG
,
3317 GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
, GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
};
3318 CheckFormats("GL_IMG_texture_compression_pvrtc", formats
, 4);
3321 TEST_P(GLES2DecoderCompressedFormatsTest
, GetCompressedTextureFormatsETC1
) {
3322 const GLenum formats
[] = {GL_ETC1_RGB8_OES
};
3323 CheckFormats("GL_OES_compressed_ETC1_RGB8_texture", formats
, 1);
3326 TEST_P(GLES2DecoderCompressedFormatsTest
, GetCompressedTextureFormatsASTC
) {
3327 const GLenum formats
[] = {
3328 GL_COMPRESSED_RGBA_ASTC_4x4_KHR
,
3329 GL_COMPRESSED_RGBA_ASTC_5x4_KHR
,
3330 GL_COMPRESSED_RGBA_ASTC_5x5_KHR
,
3331 GL_COMPRESSED_RGBA_ASTC_6x5_KHR
,
3332 GL_COMPRESSED_RGBA_ASTC_6x6_KHR
,
3333 GL_COMPRESSED_RGBA_ASTC_8x5_KHR
,
3334 GL_COMPRESSED_RGBA_ASTC_8x6_KHR
,
3335 GL_COMPRESSED_RGBA_ASTC_8x8_KHR
,
3336 GL_COMPRESSED_RGBA_ASTC_10x5_KHR
,
3337 GL_COMPRESSED_RGBA_ASTC_10x6_KHR
,
3338 GL_COMPRESSED_RGBA_ASTC_10x8_KHR
,
3339 GL_COMPRESSED_RGBA_ASTC_10x10_KHR
,
3340 GL_COMPRESSED_RGBA_ASTC_12x10_KHR
,
3341 GL_COMPRESSED_RGBA_ASTC_12x12_KHR
,
3342 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR
,
3343 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR
,
3344 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR
,
3345 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR
,
3346 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR
,
3347 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR
,
3348 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR
,
3349 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR
,
3350 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR
,
3351 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR
,
3352 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR
,
3353 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR
,
3354 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR
,
3355 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR
};
3356 CheckFormats("GL_KHR_texture_compression_astc_ldr", formats
, 28);
3359 TEST_P(GLES2DecoderManualInitTest
, GetNoCompressedTextureFormats
) {
3361 init
.bind_generates_resource
= true;
3364 EXPECT_CALL(*gl_
, GetError())
3365 .WillOnce(Return(GL_NO_ERROR
))
3366 .WillOnce(Return(GL_NO_ERROR
))
3367 .WillOnce(Return(GL_NO_ERROR
))
3368 .WillOnce(Return(GL_NO_ERROR
))
3369 .RetiresOnSaturation();
3371 typedef GetIntegerv::Result Result
;
3372 Result
* result
= static_cast<Result
*>(shared_memory_address_
);
3375 EXPECT_CALL(*gl_
, GetIntegerv(_
, _
)).Times(0).RetiresOnSaturation();
3376 cmd
.Init(GL_NUM_COMPRESSED_TEXTURE_FORMATS
,
3378 shared_memory_offset_
);
3379 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
3380 EXPECT_EQ(1, result
->GetNumResults());
3381 GLint num_formats
= result
->GetData()[0];
3382 EXPECT_EQ(0, num_formats
);
3383 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
3387 GL_COMPRESSED_TEXTURE_FORMATS
, shared_memory_id_
, shared_memory_offset_
);
3388 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
3389 EXPECT_EQ(num_formats
, result
->GetNumResults());
3391 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
3394 // TODO(gman): Complete this test.
3395 // TEST_P(GLES2DecoderTest, CompressedTexImage2DGLError) {
3398 // TODO(gman): CompressedTexImage2D
3400 // TODO(gman): CompressedTexImage2DImmediate
3402 // TODO(gman): CompressedTexSubImage2DImmediate
3404 // TODO(gman): TexImage2D
3406 // TODO(gman): TexImage2DImmediate
3408 // TODO(gman): TexSubImage2DImmediate
3410 } // namespace gles2