1 // Copyright (c) 2012 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/texture_manager.h"
9 #include "base/command_line.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "gpu/command_buffer/service/error_state_mock.h"
12 #include "gpu/command_buffer/service/feature_info.h"
13 #include "gpu/command_buffer/service/framebuffer_manager.h"
14 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
15 #include "gpu/command_buffer/service/gpu_service_test.h"
16 #include "gpu/command_buffer/service/mailbox_manager.h"
17 #include "gpu/command_buffer/service/memory_tracking.h"
18 #include "gpu/command_buffer/service/mocks.h"
19 #include "gpu/command_buffer/service/test_helper.h"
20 #include "testing/gtest/include/gtest/gtest.h"
21 #include "ui/gl/gl_image_stub.h"
22 #include "ui/gl/gl_mock.h"
23 #include "ui/gl/gl_switches.h"
25 using ::testing::AtLeast
;
26 using ::testing::Pointee
;
27 using ::testing::Return
;
28 using ::testing::SetArgPointee
;
29 using ::testing::StrictMock
;
35 class TextureTestHelper
{
37 static bool IsNPOT(const Texture
* texture
) {
38 return texture
->npot();
40 static bool IsTextureComplete(const Texture
* texture
) {
41 return texture
->texture_complete();
43 static bool IsCubeComplete(const Texture
* texture
) {
44 return texture
->cube_complete();
48 class TextureManagerTest
: public GpuServiceTest
{
50 static const GLint kMaxTextureSize
= 16;
51 static const GLint kMaxCubeMapTextureSize
= 8;
52 static const GLint kMaxRectangleTextureSize
= 16;
53 static const GLint kMaxExternalTextureSize
= 16;
54 static const GLint kMax3DTextureSize
= 256;
55 static const GLint kMax2dLevels
= 5;
56 static const GLint kMaxCubeMapLevels
= 4;
57 static const GLint kMaxExternalLevels
= 1;
58 static const bool kUseDefaultTextures
= false;
60 TextureManagerTest() {
61 // Always run with this command line, but the ES3 features are not
62 // enabled without FeatureInfo::EnableES3Validators().
63 base::CommandLine
command_line(0, nullptr);
64 command_line
.AppendSwitch(switches::kEnableUnsafeES3APIs
);
65 feature_info_
= new FeatureInfo(command_line
);
68 ~TextureManagerTest() override
{}
71 void SetUp() override
{
72 GpuServiceTest::SetUp();
73 manager_
.reset(new TextureManager(NULL
,
76 kMaxCubeMapTextureSize
,
77 kMaxRectangleTextureSize
,
79 kUseDefaultTextures
));
80 TestHelper::SetupTextureManagerInitExpectations(
81 gl_
.get(), "", kUseDefaultTextures
);
82 manager_
->Initialize();
83 error_state_
.reset(new ::testing::StrictMock
<gles2::MockErrorState
>());
86 void TearDown() override
{
87 manager_
->Destroy(false);
89 GpuServiceTest::TearDown();
93 TextureRef
* texture_ref
, GLenum pname
, GLint value
, GLenum error
) {
94 TestHelper::SetTexParameteriWithExpectations(
95 gl_
.get(), error_state_
.get(), manager_
.get(),
96 texture_ref
, pname
, value
, error
);
99 scoped_refptr
<FeatureInfo
> feature_info_
;
100 scoped_ptr
<TextureManager
> manager_
;
101 scoped_ptr
<MockErrorState
> error_state_
;
104 // GCC requires these declarations, but MSVC requires they not be present
105 #ifndef COMPILER_MSVC
106 const GLint
TextureManagerTest::kMaxTextureSize
;
107 const GLint
TextureManagerTest::kMaxCubeMapTextureSize
;
108 const GLint
TextureManagerTest::kMaxRectangleTextureSize
;
109 const GLint
TextureManagerTest::kMaxExternalTextureSize
;
110 const GLint
TextureManagerTest::kMax2dLevels
;
111 const GLint
TextureManagerTest::kMaxCubeMapLevels
;
112 const GLint
TextureManagerTest::kMaxExternalLevels
;
115 TEST_F(TextureManagerTest
, Basic
) {
116 const GLuint kClient1Id
= 1;
117 const GLuint kService1Id
= 11;
118 const GLuint kClient2Id
= 2;
119 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
120 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
121 EXPECT_FALSE(manager_
->HaveUnclearedMips());
122 // Check we can create texture.
123 manager_
->CreateTexture(kClient1Id
, kService1Id
);
124 // Check texture got created.
125 scoped_refptr
<TextureRef
> texture
= manager_
->GetTexture(kClient1Id
);
126 ASSERT_TRUE(texture
.get() != NULL
);
127 EXPECT_EQ(kService1Id
, texture
->service_id());
128 EXPECT_EQ(kClient1Id
, texture
->client_id());
129 EXPECT_EQ(texture
->texture(), manager_
->GetTextureForServiceId(
130 texture
->service_id()));
131 // Check we get nothing for a non-existent texture.
132 EXPECT_TRUE(manager_
->GetTexture(kClient2Id
) == NULL
);
133 // Check trying to a remove non-existent textures does not crash.
134 manager_
->RemoveTexture(kClient2Id
);
135 // Check that it gets deleted when the last reference is released.
136 EXPECT_CALL(*gl_
, DeleteTextures(1, ::testing::Pointee(kService1Id
)))
138 .RetiresOnSaturation();
139 // Check we can't get the texture after we remove it.
140 manager_
->RemoveTexture(kClient1Id
);
141 EXPECT_TRUE(manager_
->GetTexture(kClient1Id
) == NULL
);
142 EXPECT_EQ(0u, texture
->client_id());
145 TEST_F(TextureManagerTest
, SetParameter
) {
146 const GLuint kClient1Id
= 1;
147 const GLuint kService1Id
= 11;
148 // Check we can create texture.
149 manager_
->CreateTexture(kClient1Id
, kService1Id
);
150 // Check texture got created.
151 TextureRef
* texture_ref
= manager_
->GetTexture(kClient1Id
);
152 ASSERT_TRUE(texture_ref
!= NULL
);
153 Texture
* texture
= texture_ref
->texture();
154 manager_
->SetTarget(texture_ref
, GL_TEXTURE_2D
);
155 SetParameter(texture_ref
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
, GL_NO_ERROR
);
156 EXPECT_EQ(static_cast<GLenum
>(GL_NEAREST
), texture
->min_filter());
157 SetParameter(texture_ref
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
, GL_NO_ERROR
);
158 EXPECT_EQ(static_cast<GLenum
>(GL_NEAREST
), texture
->mag_filter());
159 SetParameter(texture_ref
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
, GL_NO_ERROR
);
160 EXPECT_EQ(static_cast<GLenum
>(GL_CLAMP_TO_EDGE
), texture
->wrap_s());
161 SetParameter(texture_ref
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
, GL_NO_ERROR
);
162 EXPECT_EQ(static_cast<GLenum
>(GL_CLAMP_TO_EDGE
), texture
->wrap_t());
163 SetParameter(texture_ref
, GL_TEXTURE_MAX_ANISOTROPY_EXT
, 1, GL_NO_ERROR
);
164 SetParameter(texture_ref
, GL_TEXTURE_MAX_ANISOTROPY_EXT
, 2, GL_NO_ERROR
);
166 texture_ref
, GL_TEXTURE_MIN_FILTER
, GL_CLAMP_TO_EDGE
, GL_INVALID_ENUM
);
167 EXPECT_EQ(static_cast<GLenum
>(GL_NEAREST
), texture
->min_filter());
169 texture_ref
, GL_TEXTURE_MAG_FILTER
, GL_CLAMP_TO_EDGE
, GL_INVALID_ENUM
);
170 EXPECT_EQ(static_cast<GLenum
>(GL_NEAREST
), texture
->min_filter());
171 SetParameter(texture_ref
, GL_TEXTURE_WRAP_S
, GL_NEAREST
, GL_INVALID_ENUM
);
172 EXPECT_EQ(static_cast<GLenum
>(GL_CLAMP_TO_EDGE
), texture
->wrap_s());
173 SetParameter(texture_ref
, GL_TEXTURE_WRAP_T
, GL_NEAREST
, GL_INVALID_ENUM
);
174 EXPECT_EQ(static_cast<GLenum
>(GL_CLAMP_TO_EDGE
), texture
->wrap_t());
175 SetParameter(texture_ref
, GL_TEXTURE_MAX_ANISOTROPY_EXT
, 0, GL_INVALID_VALUE
);
178 TEST_F(TextureManagerTest
, UseDefaultTexturesTrue
) {
179 bool use_default_textures
= true;
180 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
182 TestHelper::SetupTextureManagerInitExpectations(
183 gl_
.get(), "GL_ANGLE_texture_usage", use_default_textures
);
184 TextureManager
manager(NULL
,
187 kMaxCubeMapTextureSize
,
188 kMaxRectangleTextureSize
,
190 use_default_textures
);
191 manager
.Initialize();
193 EXPECT_TRUE(manager
.GetDefaultTextureInfo(GL_TEXTURE_2D
) != NULL
);
194 EXPECT_TRUE(manager
.GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP
) != NULL
);
196 // TODO(vmiura): Test GL_TEXTURE_EXTERNAL_OES & GL_TEXTURE_RECTANGLE_ARB.
198 manager
.Destroy(false);
201 TEST_F(TextureManagerTest
, UseDefaultTexturesFalse
) {
202 bool use_default_textures
= false;
203 TestHelper::SetupTextureManagerInitExpectations(
204 gl_
.get(), "GL_ANGLE_texture_usage", use_default_textures
);
205 TextureManager
manager(NULL
,
208 kMaxCubeMapTextureSize
,
209 kMaxRectangleTextureSize
,
211 use_default_textures
);
212 manager
.Initialize();
214 EXPECT_TRUE(manager
.GetDefaultTextureInfo(GL_TEXTURE_2D
) == NULL
);
215 EXPECT_TRUE(manager
.GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP
) == NULL
);
217 // TODO(vmiura): Test GL_TEXTURE_EXTERNAL_OES & GL_TEXTURE_RECTANGLE_ARB.
219 manager
.Destroy(false);
222 TEST_F(TextureManagerTest
, TextureUsageExt
) {
223 TestHelper::SetupTextureManagerInitExpectations(
224 gl_
.get(), "GL_ANGLE_texture_usage", kUseDefaultTextures
);
225 TextureManager
manager(NULL
,
228 kMaxCubeMapTextureSize
,
229 kMaxRectangleTextureSize
,
231 kUseDefaultTextures
);
232 manager
.Initialize();
233 const GLuint kClient1Id
= 1;
234 const GLuint kService1Id
= 11;
235 // Check we can create texture.
236 manager
.CreateTexture(kClient1Id
, kService1Id
);
237 // Check texture got created.
238 TextureRef
* texture_ref
= manager
.GetTexture(kClient1Id
);
239 ASSERT_TRUE(texture_ref
!= NULL
);
240 TestHelper::SetTexParameteriWithExpectations(
241 gl_
.get(), error_state_
.get(), &manager
, texture_ref
,
242 GL_TEXTURE_USAGE_ANGLE
, GL_FRAMEBUFFER_ATTACHMENT_ANGLE
, GL_NO_ERROR
);
243 EXPECT_EQ(static_cast<GLenum
>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE
),
244 texture_ref
->texture()->usage());
245 manager
.Destroy(false);
248 TEST_F(TextureManagerTest
, Destroy
) {
249 const GLuint kClient1Id
= 1;
250 const GLuint kService1Id
= 11;
251 TestHelper::SetupTextureManagerInitExpectations(
252 gl_
.get(), "", kUseDefaultTextures
);
253 TextureManager
manager(NULL
,
256 kMaxCubeMapTextureSize
,
257 kMaxRectangleTextureSize
,
259 kUseDefaultTextures
);
260 manager
.Initialize();
261 // Check we can create texture.
262 manager
.CreateTexture(kClient1Id
, kService1Id
);
263 // Check texture got created.
264 TextureRef
* texture
= manager
.GetTexture(kClient1Id
);
265 ASSERT_TRUE(texture
!= NULL
);
266 EXPECT_CALL(*gl_
, DeleteTextures(1, ::testing::Pointee(kService1Id
)))
268 .RetiresOnSaturation();
269 TestHelper::SetupTextureManagerDestructionExpectations(
270 gl_
.get(), "", kUseDefaultTextures
);
271 manager
.Destroy(true);
272 // Check that resources got freed.
273 texture
= manager
.GetTexture(kClient1Id
);
274 ASSERT_TRUE(texture
== NULL
);
277 TEST_F(TextureManagerTest
, MaxValues
) {
278 // Check we get the right values for the max sizes.
279 EXPECT_EQ(kMax2dLevels
, manager_
->MaxLevelsForTarget(GL_TEXTURE_2D
));
280 EXPECT_EQ(kMaxCubeMapLevels
,
281 manager_
->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP
));
282 EXPECT_EQ(kMaxCubeMapLevels
,
283 manager_
->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X
));
284 EXPECT_EQ(kMaxCubeMapLevels
,
285 manager_
->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_X
));
286 EXPECT_EQ(kMaxCubeMapLevels
,
287 manager_
->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Y
));
288 EXPECT_EQ(kMaxCubeMapLevels
,
289 manager_
->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
));
290 EXPECT_EQ(kMaxCubeMapLevels
,
291 manager_
->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Z
));
292 EXPECT_EQ(kMaxCubeMapLevels
,
293 manager_
->MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
));
294 EXPECT_EQ(kMaxExternalLevels
,
295 manager_
->MaxLevelsForTarget(GL_TEXTURE_EXTERNAL_OES
));
296 EXPECT_EQ(kMaxTextureSize
, manager_
->MaxSizeForTarget(GL_TEXTURE_2D
));
297 EXPECT_EQ(kMaxCubeMapTextureSize
,
298 manager_
->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP
));
299 EXPECT_EQ(kMaxCubeMapTextureSize
,
300 manager_
->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_X
));
301 EXPECT_EQ(kMaxCubeMapTextureSize
,
302 manager_
->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_X
));
303 EXPECT_EQ(kMaxCubeMapTextureSize
,
304 manager_
->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Y
));
305 EXPECT_EQ(kMaxCubeMapTextureSize
,
306 manager_
->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
));
307 EXPECT_EQ(kMaxCubeMapTextureSize
,
308 manager_
->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_POSITIVE_Z
));
309 EXPECT_EQ(kMaxCubeMapTextureSize
,
310 manager_
->MaxSizeForTarget(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
));
311 EXPECT_EQ(kMaxRectangleTextureSize
,
312 manager_
->MaxSizeForTarget(GL_TEXTURE_RECTANGLE_ARB
));
313 EXPECT_EQ(kMaxExternalTextureSize
,
314 manager_
->MaxSizeForTarget(GL_TEXTURE_EXTERNAL_OES
));
317 TEST_F(TextureManagerTest
, ValidForTarget
) {
319 EXPECT_TRUE(manager_
->ValidForTarget(
320 GL_TEXTURE_2D
, 0, kMaxTextureSize
, kMaxTextureSize
, 1));
321 EXPECT_TRUE(manager_
->ValidForTarget(
322 GL_TEXTURE_2D
, kMax2dLevels
- 1, 1, 1, 1));
323 EXPECT_FALSE(manager_
->ValidForTarget(
324 GL_TEXTURE_2D
, kMax2dLevels
- 1, 1, 2, 1));
325 EXPECT_FALSE(manager_
->ValidForTarget(
326 GL_TEXTURE_2D
, kMax2dLevels
- 1, 2, 1, 1));
327 // check level out of range.
328 EXPECT_FALSE(manager_
->ValidForTarget(
329 GL_TEXTURE_2D
, kMax2dLevels
, kMaxTextureSize
, 1, 1));
331 EXPECT_FALSE(manager_
->ValidForTarget(
332 GL_TEXTURE_2D
, kMax2dLevels
, kMaxTextureSize
, 1, 2));
333 // Check NPOT width on level 0
334 EXPECT_TRUE(manager_
->ValidForTarget(GL_TEXTURE_2D
, 0, 5, 2, 1));
335 // Check NPOT height on level 0
336 EXPECT_TRUE(manager_
->ValidForTarget(GL_TEXTURE_2D
, 0, 2, 5, 1));
337 // Check NPOT width on level 1
338 EXPECT_FALSE(manager_
->ValidForTarget(GL_TEXTURE_2D
, 1, 5, 2, 1));
339 // Check NPOT height on level 1
340 EXPECT_FALSE(manager_
->ValidForTarget(GL_TEXTURE_2D
, 1, 2, 5, 1));
343 EXPECT_TRUE(manager_
->ValidForTarget(
344 GL_TEXTURE_CUBE_MAP
, 0,
345 kMaxCubeMapTextureSize
, kMaxCubeMapTextureSize
, 1));
346 EXPECT_TRUE(manager_
->ValidForTarget(
347 GL_TEXTURE_CUBE_MAP
, kMaxCubeMapLevels
- 1, 1, 1, 1));
348 EXPECT_FALSE(manager_
->ValidForTarget(
349 GL_TEXTURE_CUBE_MAP
, kMaxCubeMapLevels
- 1, 2, 2, 1));
350 // check level out of range.
351 EXPECT_FALSE(manager_
->ValidForTarget(
352 GL_TEXTURE_CUBE_MAP
, kMaxCubeMapLevels
,
353 kMaxCubeMapTextureSize
, 1, 1));
355 EXPECT_FALSE(manager_
->ValidForTarget(
356 GL_TEXTURE_CUBE_MAP
, kMaxCubeMapLevels
,
357 kMaxCubeMapTextureSize
, 1, 1));
359 EXPECT_FALSE(manager_
->ValidForTarget(
360 GL_TEXTURE_CUBE_MAP
, kMaxCubeMapLevels
,
361 kMaxCubeMapTextureSize
, 1, 2));
363 for (GLint level
= 0; level
< kMax2dLevels
; ++level
) {
364 EXPECT_TRUE(manager_
->ValidForTarget(
365 GL_TEXTURE_2D
, level
, kMaxTextureSize
>> level
, 1, 1));
366 EXPECT_TRUE(manager_
->ValidForTarget(
367 GL_TEXTURE_2D
, level
, 1, kMaxTextureSize
>> level
, 1));
368 EXPECT_FALSE(manager_
->ValidForTarget(
369 GL_TEXTURE_2D
, level
, (kMaxTextureSize
>> level
) + 1, 1, 1));
370 EXPECT_FALSE(manager_
->ValidForTarget(
371 GL_TEXTURE_2D
, level
, 1, (kMaxTextureSize
>> level
) + 1, 1));
374 for (GLint level
= 0; level
< kMaxCubeMapLevels
; ++level
) {
375 EXPECT_TRUE(manager_
->ValidForTarget(
376 GL_TEXTURE_CUBE_MAP
, level
,
377 kMaxCubeMapTextureSize
>> level
,
378 kMaxCubeMapTextureSize
>> level
,
380 EXPECT_FALSE(manager_
->ValidForTarget(
381 GL_TEXTURE_CUBE_MAP
, level
,
382 (kMaxCubeMapTextureSize
>> level
) * 2,
383 (kMaxCubeMapTextureSize
>> level
) * 2,
388 TEST_F(TextureManagerTest
, ValidForTargetNPOT
) {
389 TestHelper::SetupFeatureInfoInitExpectations(
390 gl_
.get(), "GL_OES_texture_npot");
391 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
392 feature_info
->Initialize();
393 TextureManager
manager(NULL
,
396 kMaxCubeMapTextureSize
,
397 kMaxRectangleTextureSize
,
399 kUseDefaultTextures
);
400 // Check NPOT width on level 0
401 EXPECT_TRUE(manager
.ValidForTarget(GL_TEXTURE_2D
, 0, 5, 2, 1));
402 // Check NPOT height on level 0
403 EXPECT_TRUE(manager
.ValidForTarget(GL_TEXTURE_2D
, 0, 2, 5, 1));
404 // Check NPOT width on level 1
405 EXPECT_TRUE(manager
.ValidForTarget(GL_TEXTURE_2D
, 1, 5, 2, 1));
406 // Check NPOT height on level 1
407 EXPECT_TRUE(manager
.ValidForTarget(GL_TEXTURE_2D
, 1, 2, 5, 1));
408 manager
.Destroy(false);
411 class TextureTestBase
: public GpuServiceTest
{
413 static const GLint kMaxTextureSize
= 16;
414 static const GLint kMaxCubeMapTextureSize
= 8;
415 static const GLint kMaxRectangleTextureSize
= 16;
416 static const GLint kMax3DTextureSize
= 256;
417 static const GLint kMax2dLevels
= 5;
418 static const GLint kMaxCubeMapLevels
= 4;
419 static const GLuint kClient1Id
= 1;
420 static const GLuint kService1Id
= 11;
421 static const bool kUseDefaultTextures
= false;
424 : feature_info_(new FeatureInfo()) {
426 ~TextureTestBase() override
{ texture_ref_
= NULL
; }
429 void SetUpBase(MemoryTracker
* memory_tracker
, std::string extensions
) {
430 GpuServiceTest::SetUp();
431 if (!extensions
.empty()) {
432 TestHelper::SetupFeatureInfoInitExpectations(gl_
.get(),
434 feature_info_
->Initialize();
437 manager_
.reset(new TextureManager(memory_tracker
,
440 kMaxCubeMapTextureSize
,
441 kMaxRectangleTextureSize
,
443 kUseDefaultTextures
));
444 decoder_
.reset(new ::testing::StrictMock
<gles2::MockGLES2Decoder
>());
445 error_state_
.reset(new ::testing::StrictMock
<gles2::MockErrorState
>());
446 manager_
->CreateTexture(kClient1Id
, kService1Id
);
447 texture_ref_
= manager_
->GetTexture(kClient1Id
);
448 ASSERT_TRUE(texture_ref_
.get() != NULL
);
451 void TearDown() override
{
452 if (texture_ref_
.get()) {
453 // If it's not in the manager then setting texture_ref_ to NULL will
454 // delete the texture.
455 if (!texture_ref_
->client_id()) {
456 // Check that it gets deleted when the last reference is released.
458 DeleteTextures(1, ::testing::Pointee(texture_ref_
->service_id())))
460 .RetiresOnSaturation();
464 manager_
->Destroy(false);
466 GpuServiceTest::TearDown();
470 TextureRef
* texture_ref
, GLenum pname
, GLint value
, GLenum error
) {
471 TestHelper::SetTexParameteriWithExpectations(
472 gl_
.get(), error_state_
.get(), manager_
.get(),
473 texture_ref
, pname
, value
, error
);
476 scoped_ptr
<MockGLES2Decoder
> decoder_
;
477 scoped_ptr
<MockErrorState
> error_state_
;
478 scoped_refptr
<FeatureInfo
> feature_info_
;
479 scoped_ptr
<TextureManager
> manager_
;
480 scoped_refptr
<TextureRef
> texture_ref_
;
483 class TextureTest
: public TextureTestBase
{
485 void SetUp() override
{ SetUpBase(NULL
, std::string()); }
488 class TextureMemoryTrackerTest
: public TextureTestBase
{
490 void SetUp() override
{
491 mock_memory_tracker_
= new StrictMock
<MockMemoryTracker
>();
492 SetUpBase(mock_memory_tracker_
.get(), std::string());
495 scoped_refptr
<MockMemoryTracker
> mock_memory_tracker_
;
498 #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool) \
499 EXPECT_CALL(*mock_memory_tracker_.get(), \
500 TrackMemoryAllocatedChange(old_size, new_size, pool)) \
501 .Times(1).RetiresOnSaturation()
503 TEST_F(TextureTest
, Basic
) {
504 Texture
* texture
= texture_ref_
->texture();
505 EXPECT_EQ(0u, texture
->target());
506 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
507 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
508 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
509 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
510 EXPECT_EQ(0, texture
->num_uncleared_mips());
511 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
512 EXPECT_TRUE(texture
->SafeToRenderFrom());
513 EXPECT_FALSE(texture
->IsImmutable());
514 EXPECT_EQ(static_cast<GLenum
>(GL_NEAREST_MIPMAP_LINEAR
),
515 texture
->min_filter());
516 EXPECT_EQ(static_cast<GLenum
>(GL_LINEAR
), texture
->mag_filter());
517 EXPECT_EQ(static_cast<GLenum
>(GL_REPEAT
), texture
->wrap_s());
518 EXPECT_EQ(static_cast<GLenum
>(GL_REPEAT
), texture
->wrap_t());
519 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
520 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
521 EXPECT_EQ(0u, texture
->estimated_size());
524 TEST_F(TextureTest
, SetTargetTexture2D
) {
525 Texture
* texture
= texture_ref_
->texture();
526 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
527 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
528 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
529 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
530 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
531 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
532 EXPECT_TRUE(texture
->SafeToRenderFrom());
533 EXPECT_FALSE(texture
->IsImmutable());
536 TEST_F(TextureTest
, SetTargetTextureExternalOES
) {
537 Texture
* texture
= texture_ref_
->texture();
538 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_EXTERNAL_OES
);
539 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
540 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
541 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
542 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture
));
543 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
544 EXPECT_TRUE(texture
->SafeToRenderFrom());
545 EXPECT_TRUE(texture
->IsImmutable());
548 TEST_F(TextureTest
, ZeroSizeCanNotRender
) {
549 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
550 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
551 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 1,
552 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(1, 1));
553 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
554 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 0, 0, 1,
555 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
556 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
559 TEST_F(TextureTest
, EstimatedSize
) {
560 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
561 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 8, 4, 1,
562 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(8, 4));
563 EXPECT_EQ(8u * 4u * 4u, texture_ref_
->texture()->estimated_size());
564 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 2, GL_RGBA
, 8, 4, 1,
565 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(8, 4));
566 EXPECT_EQ(8u * 4u * 4u * 2u, texture_ref_
->texture()->estimated_size());
569 TEST_F(TextureMemoryTrackerTest
, EstimatedSize
) {
570 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
571 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged
);
572 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 8, 4, 1,
573 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(8, 4));
574 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged
);
575 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 256, MemoryTracker::kUnmanaged
);
576 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 2, GL_RGBA
, 8, 4, 1,
577 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(8, 4));
578 // Add expectation for texture deletion.
579 EXPECT_MEMORY_ALLOCATION_CHANGE(256, 0, MemoryTracker::kUnmanaged
);
580 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged
);
583 TEST_F(TextureMemoryTrackerTest
, SetParameterPool
) {
584 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
585 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kUnmanaged
);
586 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 8, 4, 1,
587 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(8, 4));
588 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kUnmanaged
);
589 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 128, MemoryTracker::kManaged
);
590 SetParameter(texture_ref_
.get(),
591 GL_TEXTURE_POOL_CHROMIUM
,
592 GL_TEXTURE_POOL_MANAGED_CHROMIUM
,
594 // Add expectation for texture deletion.
595 EXPECT_MEMORY_ALLOCATION_CHANGE(128, 0, MemoryTracker::kManaged
);
596 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged
);
597 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged
);
600 TEST_F(TextureTest
, POT2D
) {
601 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
602 Texture
* texture
= texture_ref_
->texture();
603 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_2D
), texture
->target());
604 // Check Setting level 0 to POT
605 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 4, 4, 1,
606 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 4));
607 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
608 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
609 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
610 EXPECT_TRUE(texture
->SafeToRenderFrom());
611 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
612 // Set filters to something that will work with a single mip.
614 texture_ref_
.get(), GL_TEXTURE_MIN_FILTER
, GL_LINEAR
, GL_NO_ERROR
);
615 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
616 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
618 SetParameter(texture_ref_
.get(),
619 GL_TEXTURE_MIN_FILTER
,
620 GL_LINEAR_MIPMAP_LINEAR
,
622 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
624 EXPECT_TRUE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
626 EXPECT_TRUE(manager_
->MarkMipmapsGenerated(texture_ref_
.get()));
627 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
628 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
629 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
631 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 4, 4, 1,
632 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 4));
633 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
634 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
635 EXPECT_TRUE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
636 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
637 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
638 // Set a level past the number of mips that would get generated.
639 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 3, GL_RGBA
, 4, 4, 1,
640 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 4));
641 EXPECT_TRUE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
643 EXPECT_TRUE(manager_
->MarkMipmapsGenerated(texture_ref_
.get()));
644 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
645 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
646 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
649 TEST_F(TextureMemoryTrackerTest
, MarkMipmapsGenerated
) {
650 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
651 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 64, MemoryTracker::kUnmanaged
);
652 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 4, 4, 1,
653 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 4));
654 EXPECT_MEMORY_ALLOCATION_CHANGE(64, 0, MemoryTracker::kUnmanaged
);
655 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 84, MemoryTracker::kUnmanaged
);
656 EXPECT_TRUE(manager_
->MarkMipmapsGenerated(texture_ref_
.get()));
657 EXPECT_MEMORY_ALLOCATION_CHANGE(84, 0, MemoryTracker::kUnmanaged
);
658 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kUnmanaged
);
661 TEST_F(TextureTest
, UnusedMips
) {
662 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
663 Texture
* texture
= texture_ref_
->texture();
664 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_2D
), texture
->target());
665 // Set level zero to large size.
666 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 4, 4, 1,
667 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 4));
668 EXPECT_TRUE(manager_
->MarkMipmapsGenerated(texture_ref_
.get()));
669 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
670 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
671 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
672 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
673 // Set level zero to large smaller (levels unused mips)
674 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 1,
675 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(2, 2));
676 EXPECT_TRUE(manager_
->MarkMipmapsGenerated(texture_ref_
.get()));
677 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
678 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
679 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
680 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
681 // Set an unused level to some size
682 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 4, GL_RGBA
, 16, 16,
683 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(16, 16));
684 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
685 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
686 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
687 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
690 TEST_F(TextureTest
, NPOT2D
) {
691 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
692 Texture
* texture
= texture_ref_
->texture();
693 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_2D
), texture
->target());
694 // Check Setting level 0 to NPOT
695 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 4, 5, 1,
696 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 5));
697 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture
));
698 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
699 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
700 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
701 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
703 texture_ref_
.get(), GL_TEXTURE_MIN_FILTER
, GL_LINEAR
, GL_NO_ERROR
);
704 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
705 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
707 texture_ref_
.get(), GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
, GL_NO_ERROR
);
708 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
709 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
711 texture_ref_
.get(), GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
, GL_NO_ERROR
);
712 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
713 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
715 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 4, 4, 1,
716 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 4));
717 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
718 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
719 EXPECT_TRUE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
720 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
723 TEST_F(TextureTest
, NPOT2DNPOTOK
) {
724 TestHelper::SetupFeatureInfoInitExpectations(
725 gl_
.get(), "GL_OES_texture_npot");
726 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
727 feature_info
->Initialize();
728 TextureManager
manager(NULL
,
731 kMaxCubeMapTextureSize
,
732 kMaxRectangleTextureSize
,
734 kUseDefaultTextures
);
735 manager
.CreateTexture(kClient1Id
, kService1Id
);
736 TextureRef
* texture_ref
= manager
.GetTexture(kClient1Id
);
737 ASSERT_TRUE(texture_ref
!= NULL
);
738 Texture
* texture
= texture_ref
->texture();
740 manager
.SetTarget(texture_ref
, GL_TEXTURE_2D
);
741 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_2D
), texture
->target());
742 // Check Setting level 0 to NPOT
743 manager
.SetLevelInfo(texture_ref
, GL_TEXTURE_2D
, 0, GL_RGBA
, 4, 5, 1, 0,
744 GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 5));
745 EXPECT_TRUE(TextureTestHelper::IsNPOT(texture
));
746 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
747 EXPECT_TRUE(manager
.CanGenerateMipmaps(texture_ref
));
748 EXPECT_FALSE(manager
.CanRender(texture_ref
));
749 EXPECT_TRUE(manager
.HaveUnrenderableTextures());
750 EXPECT_TRUE(manager
.MarkMipmapsGenerated(texture_ref
));
751 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
752 EXPECT_TRUE(manager
.CanRender(texture_ref
));
753 EXPECT_FALSE(manager
.HaveUnrenderableTextures());
754 manager
.Destroy(false);
757 TEST_F(TextureTest
, POTCubeMap
) {
758 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP
);
759 Texture
* texture
= texture_ref_
->texture();
760 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_CUBE_MAP
), texture
->target());
761 // Check Setting level 0 each face to POT
762 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X
, 0,
763 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
765 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
766 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
767 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
768 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
769 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
770 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
771 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_X
, 0,
772 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
774 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
775 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
776 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
777 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
778 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
779 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
780 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_Y
, 0,
781 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
783 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
784 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
785 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
786 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
787 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
788 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
789 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
, 0,
790 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
792 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
793 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
794 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
795 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
796 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
797 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
798 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_Z
, 0,
799 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
801 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
802 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
803 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
804 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
805 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
806 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
807 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
, 0,
808 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
810 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
811 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
812 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture
));
813 EXPECT_TRUE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
814 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
815 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
818 EXPECT_TRUE(manager_
->MarkMipmapsGenerated(texture_ref_
.get()));
819 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
820 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture
));
821 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
822 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
825 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
, 1,
826 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
828 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
829 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
830 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture
));
831 EXPECT_TRUE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
832 // Set a level past the number of mips that would get generated.
833 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
, 3,
834 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
836 EXPECT_TRUE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
838 EXPECT_TRUE(manager_
->MarkMipmapsGenerated(texture_ref_
.get()));
839 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
840 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture
));
843 TEST_F(TextureTest
, POTCubeMapWithoutMipmap
) {
844 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP
);
846 texture_ref_
.get(), GL_TEXTURE_MIN_FILTER
, GL_NEAREST
, GL_NO_ERROR
);
848 texture_ref_
.get(), GL_TEXTURE_MAG_FILTER
, GL_NEAREST
, GL_NO_ERROR
);
850 texture_ref_
.get(), GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
, GL_NO_ERROR
);
852 texture_ref_
.get(), GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
, GL_NO_ERROR
);
854 Texture
* texture
= texture_ref_
->texture();
855 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_CUBE_MAP
), texture
->target());
856 // Check Setting level 0 each face to POT
857 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X
, 0,
858 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
860 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
861 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
862 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
863 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
864 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
865 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
866 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_X
, 0,
867 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
869 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
870 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
871 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
872 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
873 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
874 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
875 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_Y
, 0,
876 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
878 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
879 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
880 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
881 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
882 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
883 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
884 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
, 0,
885 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
887 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
888 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
889 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
890 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
891 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
892 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
893 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_Z
, 0,
894 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
896 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
897 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
898 EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture
));
899 EXPECT_FALSE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
900 EXPECT_FALSE(manager_
->CanRender(texture_ref_
.get()));
901 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
902 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
, 0,
903 GL_RGBA
, 4, 4, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
905 EXPECT_FALSE(TextureTestHelper::IsNPOT(texture
));
906 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
907 EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture
));
908 EXPECT_TRUE(manager_
->CanGenerateMipmaps(texture_ref_
.get()));
909 EXPECT_TRUE(manager_
->CanRender(texture_ref_
.get()));
910 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
913 TEST_F(TextureTest
, GetLevelSize
) {
914 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_3D
);
915 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_3D
, 1, GL_RGBA
, 4, 5, 6,
916 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 5));
920 Texture
* texture
= texture_ref_
->texture();
922 texture
->GetLevelSize(GL_TEXTURE_3D
, -1, &width
, &height
, &depth
));
924 texture
->GetLevelSize(GL_TEXTURE_3D
, 1000, &width
, &height
, &depth
));
926 texture
->GetLevelSize(GL_TEXTURE_3D
, 0, &width
, &height
, &depth
));
927 EXPECT_TRUE(texture
->GetLevelSize(GL_TEXTURE_3D
, 1, &width
, &height
, &depth
));
929 EXPECT_EQ(5, height
);
931 manager_
->RemoveTexture(kClient1Id
);
932 EXPECT_TRUE(texture
->GetLevelSize(GL_TEXTURE_3D
, 1, &width
, &height
, &depth
));
934 EXPECT_EQ(5, height
);
938 TEST_F(TextureTest
, GetLevelType
) {
939 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
940 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 4, 5, 1,
941 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 5));
944 Texture
* texture
= texture_ref_
->texture();
945 EXPECT_FALSE(texture
->GetLevelType(GL_TEXTURE_2D
, -1, &type
, &format
));
946 EXPECT_FALSE(texture
->GetLevelType(GL_TEXTURE_2D
, 1000, &type
, &format
));
947 EXPECT_FALSE(texture
->GetLevelType(GL_TEXTURE_2D
, 0, &type
, &format
));
948 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 1, &type
, &format
));
949 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
950 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), format
);
951 manager_
->RemoveTexture(kClient1Id
);
952 EXPECT_TRUE(texture
->GetLevelType(GL_TEXTURE_2D
, 1, &type
, &format
));
953 EXPECT_EQ(static_cast<GLenum
>(GL_UNSIGNED_BYTE
), type
);
954 EXPECT_EQ(static_cast<GLenum
>(GL_RGBA
), format
);
957 TEST_F(TextureTest
, ValidForTexture
) {
958 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
959 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 4, 5, 6,
960 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 5));
962 Texture
* texture
= texture_ref_
->texture();
963 EXPECT_FALSE(texture
->ValidForTexture(
964 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
,
965 1, 0, 0, 0, 4, 5, 6, GL_UNSIGNED_BYTE
));
967 EXPECT_FALSE(texture
->ValidForTexture(
968 GL_TEXTURE_2D
, 0, 0, 0, 0, 4, 5, 6, GL_UNSIGNED_BYTE
));
969 // Check bad xoffset.
970 EXPECT_FALSE(texture
->ValidForTexture(
971 GL_TEXTURE_2D
, 1, -1, 0, 0, 4, 5, 6, GL_UNSIGNED_BYTE
));
972 // Check bad xoffset + width > width.
973 EXPECT_FALSE(texture
->ValidForTexture(
974 GL_TEXTURE_2D
, 1, 1, 0, 0, 4, 5, 6, GL_UNSIGNED_BYTE
));
975 // Check bad yoffset.
976 EXPECT_FALSE(texture
->ValidForTexture(
977 GL_TEXTURE_2D
, 1, 0, -1, 0, 4, 5, 6, GL_UNSIGNED_BYTE
));
978 // Check bad yoffset + height > height.
979 EXPECT_FALSE(texture
->ValidForTexture(
980 GL_TEXTURE_2D
, 1, 0, 1, 0, 4, 5, 6, GL_UNSIGNED_BYTE
));
981 // Check bad zoffset.
982 EXPECT_FALSE(texture
->ValidForTexture(
983 GL_TEXTURE_2D
, 1, 0, 0, -1, 4, 5, 6, GL_UNSIGNED_BYTE
));
984 // Check bad zoffset + depth > depth.
985 EXPECT_FALSE(texture
->ValidForTexture(
986 GL_TEXTURE_2D
, 1, 0, 0, 1, 4, 5, 6, GL_UNSIGNED_BYTE
));
988 EXPECT_FALSE(texture
->ValidForTexture(
989 GL_TEXTURE_2D
, 1, 0, 0, 0, 5, 5, 6, GL_UNSIGNED_BYTE
));
991 EXPECT_FALSE(texture
->ValidForTexture(
992 GL_TEXTURE_2D
, 1, 0, 0, 0, 4, 6, 6, GL_UNSIGNED_BYTE
));
994 EXPECT_FALSE(texture
->ValidForTexture(
995 GL_TEXTURE_2D
, 1, 0, 0, 0, 4, 5, 7, GL_UNSIGNED_BYTE
));
997 EXPECT_FALSE(texture
->ValidForTexture(
998 GL_TEXTURE_2D
, 1, 0, 0, 0, 4, 5, 6, GL_UNSIGNED_SHORT_4_4_4_4
));
999 // Check valid full size
1000 EXPECT_TRUE(texture
->ValidForTexture(
1001 GL_TEXTURE_2D
, 1, 0, 0, 0, 4, 5, 6, GL_UNSIGNED_BYTE
));
1002 // Check valid particial size.
1003 EXPECT_TRUE(texture
->ValidForTexture(
1004 GL_TEXTURE_2D
, 1, 1, 1, 1, 2, 3, 4, GL_UNSIGNED_BYTE
));
1005 manager_
->RemoveTexture(kClient1Id
);
1006 EXPECT_TRUE(texture
->ValidForTexture(
1007 GL_TEXTURE_2D
, 1, 0, 0, 0, 4, 5, 6, GL_UNSIGNED_BYTE
));
1010 TEST_F(TextureTest
, FloatNotLinear
) {
1011 TestHelper::SetupFeatureInfoInitExpectations(
1012 gl_
.get(), "GL_OES_texture_float");
1013 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
1014 feature_info
->Initialize();
1015 TextureManager
manager(NULL
,
1018 kMaxCubeMapTextureSize
,
1019 kMaxRectangleTextureSize
,
1021 kUseDefaultTextures
);
1022 manager
.CreateTexture(kClient1Id
, kService1Id
);
1023 TextureRef
* texture_ref
= manager
.GetTexture(kClient1Id
);
1024 ASSERT_TRUE(texture_ref
!= NULL
);
1025 manager
.SetTarget(texture_ref
, GL_TEXTURE_2D
);
1026 Texture
* texture
= texture_ref
->texture();
1027 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_2D
), texture
->target());
1028 manager
.SetLevelInfo(texture_ref
, GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 1, 0,
1029 GL_RGBA
, GL_FLOAT
, gfx::Rect(1, 1));
1030 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
1031 TestHelper::SetTexParameteriWithExpectations(
1032 gl_
.get(), error_state_
.get(), &manager
,
1033 texture_ref
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
, GL_NO_ERROR
);
1034 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
1035 TestHelper::SetTexParameteriWithExpectations(
1036 gl_
.get(), error_state_
.get(), &manager
, texture_ref
,
1037 GL_TEXTURE_MIN_FILTER
, GL_NEAREST_MIPMAP_NEAREST
, GL_NO_ERROR
);
1038 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
1039 manager
.Destroy(false);
1042 TEST_F(TextureTest
, FloatLinear
) {
1043 TestHelper::SetupFeatureInfoInitExpectations(
1044 gl_
.get(), "GL_OES_texture_float GL_OES_texture_float_linear");
1045 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
1046 feature_info
->Initialize();
1047 TextureManager
manager(NULL
,
1050 kMaxCubeMapTextureSize
,
1051 kMaxRectangleTextureSize
,
1053 kUseDefaultTextures
);
1054 manager
.CreateTexture(kClient1Id
, kService1Id
);
1055 TextureRef
* texture_ref
= manager
.GetTexture(kClient1Id
);
1056 ASSERT_TRUE(texture_ref
!= NULL
);
1057 manager
.SetTarget(texture_ref
, GL_TEXTURE_2D
);
1058 Texture
* texture
= texture_ref
->texture();
1059 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_2D
), texture
->target());
1060 manager
.SetLevelInfo(texture_ref
, GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 1, 0,
1061 GL_RGBA
, GL_FLOAT
, gfx::Rect(1, 1));
1062 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
1063 manager
.Destroy(false);
1066 TEST_F(TextureTest
, HalfFloatNotLinear
) {
1067 TestHelper::SetupFeatureInfoInitExpectations(
1068 gl_
.get(), "GL_OES_texture_half_float");
1069 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
1070 feature_info
->Initialize();
1071 TextureManager
manager(NULL
,
1074 kMaxCubeMapTextureSize
,
1075 kMaxRectangleTextureSize
,
1077 kUseDefaultTextures
);
1078 manager
.CreateTexture(kClient1Id
, kService1Id
);
1079 TextureRef
* texture_ref
= manager
.GetTexture(kClient1Id
);
1080 ASSERT_TRUE(texture_ref
!= NULL
);
1081 manager
.SetTarget(texture_ref
, GL_TEXTURE_2D
);
1082 Texture
* texture
= texture_ref
->texture();
1083 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_2D
), texture
->target());
1084 manager
.SetLevelInfo(texture_ref
, GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 1, 0,
1085 GL_RGBA
, GL_HALF_FLOAT_OES
, gfx::Rect(1, 1));
1086 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
1087 TestHelper::SetTexParameteriWithExpectations(
1088 gl_
.get(), error_state_
.get(), &manager
,
1089 texture_ref
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
, GL_NO_ERROR
);
1090 EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture
));
1091 TestHelper::SetTexParameteriWithExpectations(
1092 gl_
.get(), error_state_
.get(), &manager
, texture_ref
,
1093 GL_TEXTURE_MIN_FILTER
, GL_NEAREST_MIPMAP_NEAREST
, GL_NO_ERROR
);
1094 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
1095 manager
.Destroy(false);
1098 TEST_F(TextureTest
, HalfFloatLinear
) {
1099 TestHelper::SetupFeatureInfoInitExpectations(
1100 gl_
.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear");
1101 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
1102 feature_info
->Initialize();
1103 TextureManager
manager(NULL
,
1106 kMaxCubeMapTextureSize
,
1107 kMaxRectangleTextureSize
,
1109 kUseDefaultTextures
);
1110 manager
.CreateTexture(kClient1Id
, kService1Id
);
1111 TextureRef
* texture_ref
= manager
.GetTexture(kClient1Id
);
1112 ASSERT_TRUE(texture_ref
!= NULL
);
1113 manager
.SetTarget(texture_ref
, GL_TEXTURE_2D
);
1114 Texture
* texture
= texture_ref
->texture();
1115 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_2D
), texture
->target());
1116 manager
.SetLevelInfo(texture_ref
, GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 1, 0,
1117 GL_RGBA
, GL_HALF_FLOAT_OES
, gfx::Rect(1, 1));
1118 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
1119 manager
.Destroy(false);
1122 TEST_F(TextureTest
, EGLImageExternal
) {
1123 TestHelper::SetupFeatureInfoInitExpectations(
1124 gl_
.get(), "GL_OES_EGL_image_external");
1125 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
1126 feature_info
->Initialize();
1127 TextureManager
manager(NULL
,
1130 kMaxCubeMapTextureSize
,
1131 kMaxRectangleTextureSize
,
1133 kUseDefaultTextures
);
1134 manager
.CreateTexture(kClient1Id
, kService1Id
);
1135 TextureRef
* texture_ref
= manager
.GetTexture(kClient1Id
);
1136 ASSERT_TRUE(texture_ref
!= NULL
);
1137 manager
.SetTarget(texture_ref
, GL_TEXTURE_EXTERNAL_OES
);
1138 Texture
* texture
= texture_ref
->texture();
1139 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_EXTERNAL_OES
), texture
->target());
1140 EXPECT_FALSE(manager
.CanGenerateMipmaps(texture_ref
));
1141 manager
.Destroy(false);
1144 TEST_F(TextureTest
, DepthTexture
) {
1145 TestHelper::SetupFeatureInfoInitExpectations(
1146 gl_
.get(), "GL_ANGLE_depth_texture");
1147 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
1148 feature_info
->Initialize();
1149 TextureManager
manager(NULL
,
1152 kMaxCubeMapTextureSize
,
1153 kMaxRectangleTextureSize
,
1155 kUseDefaultTextures
);
1156 manager
.CreateTexture(kClient1Id
, kService1Id
);
1157 TextureRef
* texture_ref
= manager
.GetTexture(kClient1Id
);
1158 ASSERT_TRUE(texture_ref
!= NULL
);
1159 manager
.SetTarget(texture_ref
, GL_TEXTURE_2D
);
1160 manager
.SetLevelInfo(texture_ref
, GL_TEXTURE_2D
, 0, GL_DEPTH_COMPONENT
, 4, 4,
1161 1, 0, GL_DEPTH_COMPONENT
, GL_UNSIGNED_INT
, gfx::Rect());
1162 EXPECT_FALSE(manager
.CanGenerateMipmaps(texture_ref
));
1163 manager
.Destroy(false);
1166 TEST_F(TextureTest
, SafeUnsafe
) {
1167 static const GLuint kClient2Id
= 2;
1168 static const GLuint kService2Id
= 12;
1169 static const GLuint kClient3Id
= 3;
1170 static const GLuint kService3Id
= 13;
1171 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1172 Texture
* texture
= texture_ref_
->texture();
1173 EXPECT_EQ(0, texture
->num_uncleared_mips());
1174 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
1175 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 4, 4, 1,
1176 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1177 EXPECT_FALSE(texture
->SafeToRenderFrom());
1178 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1179 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1180 EXPECT_EQ(1, texture
->num_uncleared_mips());
1181 manager_
->SetLevelCleared(texture_ref_
.get(), GL_TEXTURE_2D
, 0, true);
1182 EXPECT_TRUE(texture
->SafeToRenderFrom());
1183 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
1184 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1185 EXPECT_EQ(0, texture
->num_uncleared_mips());
1186 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 8, 8, 1,
1187 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1188 EXPECT_FALSE(texture
->SafeToRenderFrom());
1189 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1190 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1191 EXPECT_EQ(1, texture
->num_uncleared_mips());
1192 manager_
->SetLevelCleared(texture_ref_
.get(), GL_TEXTURE_2D
, 1, true);
1193 EXPECT_TRUE(texture
->SafeToRenderFrom());
1194 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
1195 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1196 EXPECT_EQ(0, texture
->num_uncleared_mips());
1197 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 4, 4, 1,
1198 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1199 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 8, 8, 1,
1200 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1201 EXPECT_FALSE(texture
->SafeToRenderFrom());
1202 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1203 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1204 EXPECT_EQ(2, texture
->num_uncleared_mips());
1205 manager_
->SetLevelCleared(texture_ref_
.get(), GL_TEXTURE_2D
, 0, true);
1206 EXPECT_FALSE(texture
->SafeToRenderFrom());
1207 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1208 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1209 EXPECT_EQ(1, texture
->num_uncleared_mips());
1210 manager_
->SetLevelCleared(texture_ref_
.get(), GL_TEXTURE_2D
, 1, true);
1211 EXPECT_TRUE(texture
->SafeToRenderFrom());
1212 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
1213 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1214 EXPECT_EQ(0, texture
->num_uncleared_mips());
1215 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 8, 8, 1,
1216 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1217 EXPECT_FALSE(texture
->SafeToRenderFrom());
1218 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1219 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1220 EXPECT_EQ(1, texture
->num_uncleared_mips());
1221 manager_
->MarkMipmapsGenerated(texture_ref_
.get());
1222 EXPECT_TRUE(texture
->SafeToRenderFrom());
1223 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
1224 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1225 EXPECT_EQ(0, texture
->num_uncleared_mips());
1227 manager_
->CreateTexture(kClient2Id
, kService2Id
);
1228 scoped_refptr
<TextureRef
> texture_ref2(
1229 manager_
->GetTexture(kClient2Id
));
1230 ASSERT_TRUE(texture_ref2
.get() != NULL
);
1231 manager_
->SetTarget(texture_ref2
.get(), GL_TEXTURE_2D
);
1232 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
1233 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1234 Texture
* texture2
= texture_ref2
->texture();
1235 EXPECT_EQ(0, texture2
->num_uncleared_mips());
1236 manager_
->SetLevelInfo(texture_ref2
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 8, 8, 1,
1237 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(8, 8));
1238 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
1239 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1240 EXPECT_EQ(0, texture2
->num_uncleared_mips());
1241 manager_
->SetLevelInfo(texture_ref2
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 8, 8, 1,
1242 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(1, 1));
1243 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1244 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1245 EXPECT_EQ(1, texture2
->num_uncleared_mips());
1247 manager_
->CreateTexture(kClient3Id
, kService3Id
);
1248 scoped_refptr
<TextureRef
> texture_ref3(
1249 manager_
->GetTexture(kClient3Id
));
1250 ASSERT_TRUE(texture_ref3
.get() != NULL
);
1251 manager_
->SetTarget(texture_ref3
.get(), GL_TEXTURE_2D
);
1252 manager_
->SetLevelInfo(texture_ref3
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 8, 8, 1,
1253 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(2, 2));
1254 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1255 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1256 Texture
* texture3
= texture_ref3
->texture();
1257 EXPECT_EQ(1, texture3
->num_uncleared_mips());
1258 manager_
->SetLevelCleared(texture_ref2
.get(), GL_TEXTURE_2D
, 0, true);
1259 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1260 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1261 EXPECT_EQ(0, texture2
->num_uncleared_mips());
1262 manager_
->SetLevelCleared(texture_ref3
.get(), GL_TEXTURE_2D
, 0, true);
1263 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
1264 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1265 EXPECT_EQ(0, texture3
->num_uncleared_mips());
1267 manager_
->SetLevelInfo(texture_ref2
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 8, 8, 1,
1268 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(1, 1, 1, 1));
1269 manager_
->SetLevelInfo(texture_ref3
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 8, 8, 1,
1270 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 4, 4, 4));
1271 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1272 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1273 EXPECT_EQ(1, texture2
->num_uncleared_mips());
1274 EXPECT_EQ(1, texture3
->num_uncleared_mips());
1275 manager_
->RemoveTexture(kClient3Id
);
1276 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1277 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1278 manager_
->RemoveTexture(kClient2Id
);
1279 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1280 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1281 EXPECT_CALL(*gl_
, DeleteTextures(1, ::testing::Pointee(kService2Id
)))
1283 .RetiresOnSaturation();
1284 texture_ref2
= NULL
;
1285 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1286 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1287 EXPECT_CALL(*gl_
, DeleteTextures(1, ::testing::Pointee(kService3Id
)))
1289 .RetiresOnSaturation();
1290 texture_ref3
= NULL
;
1291 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
1292 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1295 TEST_F(TextureTest
, ClearTexture
) {
1296 EXPECT_CALL(*decoder_
, ClearLevel(_
, _
, _
, _
, _
, _
, _
, _
, _
))
1297 .WillRepeatedly(Return(true));
1298 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
1299 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 4, 4, 1,
1300 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1301 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 4, 4, 1,
1302 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1303 Texture
* texture
= texture_ref_
->texture();
1304 EXPECT_FALSE(texture
->SafeToRenderFrom());
1305 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1306 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1307 EXPECT_EQ(2, texture
->num_uncleared_mips());
1308 manager_
->ClearRenderableLevels(decoder_
.get(), texture_ref_
.get());
1309 EXPECT_TRUE(texture
->SafeToRenderFrom());
1310 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
1311 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1312 EXPECT_EQ(0, texture
->num_uncleared_mips());
1313 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 4, 4, 1,
1314 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(2, 2));
1315 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 4, 4, 1,
1316 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 3));
1317 EXPECT_FALSE(texture
->SafeToRenderFrom());
1318 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1319 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1320 EXPECT_EQ(2, texture
->num_uncleared_mips());
1321 manager_
->ClearTextureLevel(
1322 decoder_
.get(), texture_ref_
.get(), GL_TEXTURE_2D
, 0);
1323 EXPECT_FALSE(texture
->SafeToRenderFrom());
1324 EXPECT_TRUE(manager_
->HaveUnsafeTextures());
1325 EXPECT_TRUE(manager_
->HaveUnclearedMips());
1326 EXPECT_EQ(1, texture
->num_uncleared_mips());
1327 manager_
->ClearTextureLevel(
1328 decoder_
.get(), texture_ref_
.get(), GL_TEXTURE_2D
, 1);
1329 EXPECT_TRUE(texture
->SafeToRenderFrom());
1330 EXPECT_FALSE(manager_
->HaveUnsafeTextures());
1331 EXPECT_FALSE(manager_
->HaveUnclearedMips());
1332 EXPECT_EQ(0, texture
->num_uncleared_mips());
1335 TEST_F(TextureTest
, UseDeletedTexture
) {
1336 static const GLuint kClient2Id
= 2;
1337 static const GLuint kService2Id
= 12;
1338 // Make the default texture renderable
1339 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
1340 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 1,
1341 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1342 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
1343 // Make a new texture
1344 manager_
->CreateTexture(kClient2Id
, kService2Id
);
1345 scoped_refptr
<TextureRef
> texture_ref(
1346 manager_
->GetTexture(kClient2Id
));
1347 manager_
->SetTarget(texture_ref
.get(), GL_TEXTURE_2D
);
1348 EXPECT_FALSE(manager_
->CanRender(texture_ref
.get()));
1349 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
1351 manager_
->RemoveTexture(kClient2Id
);
1352 EXPECT_FALSE(manager_
->CanRender(texture_ref
.get()));
1353 EXPECT_TRUE(manager_
->HaveUnrenderableTextures());
1354 // Check that we can still manipulate it and it effects the manager.
1355 manager_
->SetLevelInfo(texture_ref
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 1,
1356 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1357 EXPECT_TRUE(manager_
->CanRender(texture_ref
.get()));
1358 EXPECT_FALSE(manager_
->HaveUnrenderableTextures());
1359 EXPECT_CALL(*gl_
, DeleteTextures(1, ::testing::Pointee(kService2Id
)))
1361 .RetiresOnSaturation();
1365 TEST_F(TextureTest
, GetLevelImage
) {
1366 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
1367 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2, 1,
1368 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(2, 2));
1369 Texture
* texture
= texture_ref_
->texture();
1370 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 1) == NULL
);
1372 scoped_refptr
<gfx::GLImage
> image(new gfx::GLImageStub
);
1373 manager_
->SetLevelImage(texture_ref_
.get(), GL_TEXTURE_2D
, 1, image
.get());
1374 EXPECT_FALSE(texture
->GetLevelImage(GL_TEXTURE_2D
, 1) == NULL
);
1376 manager_
->SetLevelImage(texture_ref_
.get(), GL_TEXTURE_2D
, 1, NULL
);
1377 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 1) == NULL
);
1378 manager_
->SetLevelImage(texture_ref_
.get(), GL_TEXTURE_2D
, 1, image
.get());
1379 // Image should be reset when SetLevelInfo is called.
1380 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2, 1,
1381 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(2, 2));
1382 EXPECT_TRUE(texture
->GetLevelImage(GL_TEXTURE_2D
, 1) == NULL
);
1387 bool InSet(std::set
<std::string
>* string_set
, const std::string
& str
) {
1388 std::pair
<std::set
<std::string
>::iterator
, bool> result
=
1389 string_set
->insert(str
);
1390 return !result
.second
;
1393 } // anonymous namespace
1395 TEST_F(TextureTest
, AddToSignature
) {
1396 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
1397 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2, 1,
1398 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(2, 2));
1399 std::string signature1
;
1400 std::string signature2
;
1401 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature1
);
1403 std::set
<std::string
> string_set
;
1404 EXPECT_FALSE(InSet(&string_set
, signature1
));
1406 // check changing 1 thing makes a different signature.
1407 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 4, 2, 1,
1408 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(4, 2));
1409 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1410 EXPECT_FALSE(InSet(&string_set
, signature2
));
1412 // check putting it back makes the same signature.
1413 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2, 1,
1414 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect(2, 2));
1416 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1417 EXPECT_EQ(signature1
, signature2
);
1419 // Check setting cleared status does not change signature.
1420 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2, 1,
1421 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1423 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1424 EXPECT_EQ(signature1
, signature2
);
1426 // Check changing other settings changes signature.
1427 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 4, 1,
1428 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1430 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1431 EXPECT_FALSE(InSet(&string_set
, signature2
));
1433 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2, 2,
1434 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1436 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1437 EXPECT_FALSE(InSet(&string_set
, signature2
));
1439 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2, 1,
1440 1, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1442 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1443 EXPECT_FALSE(InSet(&string_set
, signature2
));
1445 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2, 1,
1446 0, GL_RGB
, GL_UNSIGNED_BYTE
, gfx::Rect());
1448 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1449 EXPECT_FALSE(InSet(&string_set
, signature2
));
1451 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2, 1,
1452 0, GL_RGBA
, GL_FLOAT
, gfx::Rect());
1454 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1455 EXPECT_FALSE(InSet(&string_set
, signature2
));
1458 manager_
->SetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2, 1,
1459 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1461 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1462 EXPECT_EQ(signature1
, signature2
);
1464 // check changing parameters changes signature.
1466 texture_ref_
.get(), GL_TEXTURE_MIN_FILTER
, GL_NEAREST
, GL_NO_ERROR
);
1468 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1469 EXPECT_FALSE(InSet(&string_set
, signature2
));
1471 SetParameter(texture_ref_
.get(),
1472 GL_TEXTURE_MIN_FILTER
,
1473 GL_NEAREST_MIPMAP_LINEAR
,
1476 texture_ref_
.get(), GL_TEXTURE_MAG_FILTER
, GL_NEAREST
, GL_NO_ERROR
);
1478 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1479 EXPECT_FALSE(InSet(&string_set
, signature2
));
1482 texture_ref_
.get(), GL_TEXTURE_MAG_FILTER
, GL_LINEAR
, GL_NO_ERROR
);
1484 texture_ref_
.get(), GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
, GL_NO_ERROR
);
1486 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1487 EXPECT_FALSE(InSet(&string_set
, signature2
));
1489 SetParameter(texture_ref_
.get(), GL_TEXTURE_WRAP_S
, GL_REPEAT
, GL_NO_ERROR
);
1491 texture_ref_
.get(), GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
, GL_NO_ERROR
);
1493 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1494 EXPECT_FALSE(InSet(&string_set
, signature2
));
1496 // Check putting it back genenerates the same signature
1497 SetParameter(texture_ref_
.get(), GL_TEXTURE_WRAP_T
, GL_REPEAT
, GL_NO_ERROR
);
1499 manager_
->AddToSignature(texture_ref_
.get(), GL_TEXTURE_2D
, 1, &signature2
);
1500 EXPECT_EQ(signature1
, signature2
);
1502 // Check the set was acutally getting different signatures.
1503 EXPECT_EQ(11u, string_set
.size());
1506 class ProduceConsumeTextureTest
: public TextureTest
,
1507 public ::testing::WithParamInterface
<GLenum
> {
1509 void SetUp() override
{
1510 TextureTest::SetUpBase(NULL
, "GL_OES_EGL_image_external");
1511 manager_
->CreateTexture(kClient2Id
, kService2Id
);
1512 texture2_
= manager_
->GetTexture(kClient2Id
);
1514 EXPECT_CALL(*decoder_
.get(), GetErrorState())
1515 .WillRepeatedly(Return(error_state_
.get()));
1518 void TearDown() override
{
1519 if (texture2_
.get()) {
1520 // If it's not in the manager then setting texture2_ to NULL will
1521 // delete the texture.
1522 if (!texture2_
->client_id()) {
1523 // Check that it gets deleted when the last reference is released.
1526 DeleteTextures(1, ::testing::Pointee(texture2_
->service_id())))
1527 .Times(1).RetiresOnSaturation();
1531 TextureTest::TearDown();
1536 LevelInfo(GLenum target
,
1543 const gfx::Rect
& cleared_rect
)
1551 cleared_rect(cleared_rect
) {}
1562 bool operator==(const LevelInfo
& other
) const {
1563 return target
== other
.target
&& format
== other
.format
&&
1564 width
== other
.width
&& height
== other
.height
&&
1565 depth
== other
.depth
&& border
== other
.border
&&
1566 type
== other
.type
&& cleared_rect
== other
.cleared_rect
;
1576 gfx::Rect cleared_rect
;
1579 void SetLevelInfo(TextureRef
* texture_ref
,
1581 const LevelInfo
& info
) {
1582 manager_
->SetLevelInfo(texture_ref
, info
.target
, level
, info
.format
,
1583 info
.width
, info
.height
, info
.depth
, info
.border
,
1584 info
.format
, info
.type
, info
.cleared_rect
);
1587 static LevelInfo
GetLevelInfo(const TextureRef
* texture_ref
,
1590 const Texture
* texture
= texture_ref
->texture();
1592 info
.target
= target
;
1593 EXPECT_TRUE(texture
->GetLevelSize(target
, level
, &info
.width
,
1594 &info
.height
, &info
.depth
));
1595 EXPECT_TRUE(texture
->GetLevelType(target
, level
, &info
.type
,
1597 info
.cleared_rect
= texture
->GetLevelClearedRect(target
, level
);
1601 Texture
* Produce(TextureRef
* texture_ref
) {
1602 Texture
* texture
= manager_
->Produce(texture_ref
);
1603 EXPECT_TRUE(texture
!= NULL
);
1607 void Consume(GLuint client_id
, Texture
* texture
) {
1608 EXPECT_TRUE(manager_
->Consume(client_id
, texture
));
1611 scoped_refptr
<TextureRef
> texture2_
;
1614 static const GLuint kClient2Id
;
1615 static const GLuint kService2Id
;
1618 const GLuint
ProduceConsumeTextureTest::kClient2Id
= 2;
1619 const GLuint
ProduceConsumeTextureTest::kService2Id
= 12;
1621 TEST_F(ProduceConsumeTextureTest
, ProduceConsume2D
) {
1622 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_2D
);
1623 Texture
* texture
= texture_ref_
->texture();
1624 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_2D
), texture
->target());
1625 LevelInfo
level0(GL_TEXTURE_2D
, GL_RGBA
, 4, 4, 1, 0, GL_UNSIGNED_BYTE
,
1627 SetLevelInfo(texture_ref_
.get(), 0, level0
);
1628 EXPECT_TRUE(manager_
->MarkMipmapsGenerated(texture_ref_
.get()));
1629 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
1630 LevelInfo level1
= GetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 1);
1631 LevelInfo level2
= GetLevelInfo(texture_ref_
.get(), GL_TEXTURE_2D
, 2);
1632 Texture
* produced_texture
= Produce(texture_ref_
.get());
1633 EXPECT_EQ(produced_texture
, texture
);
1635 // Make this texture bigger with more levels, and make sure they get
1636 // clobbered correctly during Consume().
1637 manager_
->SetTarget(texture2_
.get(), GL_TEXTURE_2D
);
1638 SetLevelInfo(texture2_
.get(), 0, LevelInfo(GL_TEXTURE_2D
, GL_RGBA
, 16, 16, 1,
1639 0, GL_UNSIGNED_BYTE
, gfx::Rect()));
1640 EXPECT_TRUE(manager_
->MarkMipmapsGenerated(texture2_
.get()));
1641 texture
= texture2_
->texture();
1642 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
1643 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U, texture
->estimated_size());
1645 GLuint client_id
= texture2_
->client_id();
1646 manager_
->RemoveTexture(client_id
);
1647 Consume(client_id
, produced_texture
);
1648 scoped_refptr
<TextureRef
> restored_texture
= manager_
->GetTexture(client_id
);
1649 EXPECT_EQ(produced_texture
, restored_texture
->texture());
1650 EXPECT_EQ(level0
, GetLevelInfo(restored_texture
.get(), GL_TEXTURE_2D
, 0));
1651 EXPECT_EQ(level1
, GetLevelInfo(restored_texture
.get(), GL_TEXTURE_2D
, 1));
1652 EXPECT_EQ(level2
, GetLevelInfo(restored_texture
.get(), GL_TEXTURE_2D
, 2));
1653 texture
= restored_texture
->texture();
1654 EXPECT_EQ(64U + 16U + 4U, texture
->estimated_size());
1656 EXPECT_FALSE(texture
->GetLevelSize(GL_TEXTURE_2D
, 3, &w
, &h
, nullptr));
1658 // However the old texture ref still exists if it was referenced somewhere.
1659 EXPECT_EQ(1024U + 256U + 64U + 16U + 4U,
1660 texture2_
->texture()->estimated_size());
1663 TEST_F(ProduceConsumeTextureTest
, ProduceConsumeClearRectangle
) {
1664 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_RECTANGLE_ARB
);
1665 Texture
* texture
= texture_ref_
->texture();
1666 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_RECTANGLE_ARB
), texture
->target());
1667 LevelInfo
level0(GL_TEXTURE_RECTANGLE_ARB
, GL_RGBA
, 1, 1, 1, 0,
1668 GL_UNSIGNED_BYTE
, gfx::Rect());
1669 SetLevelInfo(texture_ref_
.get(), 0, level0
);
1670 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
1671 Texture
* produced_texture
= Produce(texture_ref_
.get());
1672 EXPECT_EQ(produced_texture
, texture
);
1673 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_RECTANGLE_ARB
),
1674 produced_texture
->target());
1676 GLuint client_id
= texture2_
->client_id();
1677 manager_
->RemoveTexture(client_id
);
1678 Consume(client_id
, produced_texture
);
1679 scoped_refptr
<TextureRef
> restored_texture
= manager_
->GetTexture(client_id
);
1680 EXPECT_EQ(produced_texture
, restored_texture
->texture());
1682 // See if we can clear the previously uncleared level now.
1684 GetLevelInfo(restored_texture
.get(), GL_TEXTURE_RECTANGLE_ARB
, 0));
1685 EXPECT_CALL(*decoder_
, ClearLevel(_
, _
, _
, _
, _
, _
, _
, _
, _
))
1686 .WillRepeatedly(Return(true));
1687 EXPECT_TRUE(manager_
->ClearTextureLevel(
1688 decoder_
.get(), restored_texture
.get(), GL_TEXTURE_RECTANGLE_ARB
, 0));
1691 TEST_F(ProduceConsumeTextureTest
, ProduceConsumeExternal
) {
1692 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_EXTERNAL_OES
);
1693 Texture
* texture
= texture_ref_
->texture();
1694 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_EXTERNAL_OES
), texture
->target());
1695 LevelInfo
level0(GL_TEXTURE_EXTERNAL_OES
, GL_RGBA
, 1, 1, 1, 0,
1696 GL_UNSIGNED_BYTE
, gfx::Rect());
1697 SetLevelInfo(texture_ref_
.get(), 0, level0
);
1698 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
1699 Texture
* produced_texture
= Produce(texture_ref_
.get());
1700 EXPECT_EQ(produced_texture
, texture
);
1702 GLuint client_id
= texture2_
->client_id();
1703 manager_
->RemoveTexture(client_id
);
1704 Consume(client_id
, produced_texture
);
1705 scoped_refptr
<TextureRef
> restored_texture
= manager_
->GetTexture(client_id
);
1706 EXPECT_EQ(produced_texture
, restored_texture
->texture());
1708 GetLevelInfo(restored_texture
.get(), GL_TEXTURE_EXTERNAL_OES
, 0));
1711 TEST_P(ProduceConsumeTextureTest
, ProduceConsumeTextureWithImage
) {
1712 GLenum target
= GetParam();
1713 manager_
->SetTarget(texture_ref_
.get(), target
);
1714 Texture
* texture
= texture_ref_
->texture();
1715 EXPECT_EQ(static_cast<GLenum
>(target
), texture
->target());
1716 scoped_refptr
<gfx::GLImage
> image(new gfx::GLImageStub
);
1717 manager_
->SetLevelInfo(texture_ref_
.get(), target
, 0, GL_RGBA
, 0, 0, 1, 0,
1718 GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1719 manager_
->SetLevelImage(texture_ref_
.get(), target
, 0, image
.get());
1720 GLuint service_id
= texture
->service_id();
1721 Texture
* produced_texture
= Produce(texture_ref_
.get());
1723 GLuint client_id
= texture2_
->client_id();
1724 manager_
->RemoveTexture(client_id
);
1725 Consume(client_id
, produced_texture
);
1726 scoped_refptr
<TextureRef
> restored_texture
= manager_
->GetTexture(client_id
);
1727 EXPECT_EQ(produced_texture
, restored_texture
->texture());
1728 EXPECT_EQ(service_id
, restored_texture
->service_id());
1729 EXPECT_EQ(image
.get(), restored_texture
->texture()->GetLevelImage(target
, 0));
1732 static const GLenum kTextureTargets
[] = {GL_TEXTURE_2D
, GL_TEXTURE_EXTERNAL_OES
,
1733 GL_TEXTURE_RECTANGLE_ARB
, };
1735 INSTANTIATE_TEST_CASE_P(Target
,
1736 ProduceConsumeTextureTest
,
1737 ::testing::ValuesIn(kTextureTargets
));
1739 TEST_F(ProduceConsumeTextureTest
, ProduceConsumeCube
) {
1740 manager_
->SetTarget(texture_ref_
.get(), GL_TEXTURE_CUBE_MAP
);
1741 Texture
* texture
= texture_ref_
->texture();
1742 EXPECT_EQ(static_cast<GLenum
>(GL_TEXTURE_CUBE_MAP
), texture
->target());
1743 LevelInfo
face0(GL_TEXTURE_CUBE_MAP_POSITIVE_X
, GL_RGBA
, 1, 1, 1, 0,
1744 GL_UNSIGNED_BYTE
, gfx::Rect(1, 1));
1745 LevelInfo
face5(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
, GL_RGBA
, 3, 3, 1, 0,
1746 GL_UNSIGNED_BYTE
, gfx::Rect(1, 1));
1747 SetLevelInfo(texture_ref_
.get(), 0, face0
);
1748 SetLevelInfo(texture_ref_
.get(), 0, face5
);
1749 EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture
));
1750 Texture
* produced_texture
= Produce(texture_ref_
.get());
1751 EXPECT_EQ(produced_texture
, texture
);
1753 GLuint client_id
= texture2_
->client_id();
1754 manager_
->RemoveTexture(client_id
);
1755 Consume(client_id
, produced_texture
);
1756 scoped_refptr
<TextureRef
> restored_texture
= manager_
->GetTexture(client_id
);
1757 EXPECT_EQ(produced_texture
, restored_texture
->texture());
1760 GetLevelInfo(restored_texture
.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X
, 0));
1763 GetLevelInfo(restored_texture
.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
, 0));
1766 class CountingMemoryTracker
: public MemoryTracker
{
1768 CountingMemoryTracker() {
1769 current_size_
[0] = 0;
1770 current_size_
[1] = 0;
1773 void TrackMemoryAllocatedChange(size_t old_size
,
1775 Pool pool
) override
{
1776 DCHECK_LT(static_cast<size_t>(pool
), arraysize(current_size_
));
1777 current_size_
[pool
] += new_size
- old_size
;
1780 bool EnsureGPUMemoryAvailable(size_t size_needed
) override
{ return true; }
1782 size_t GetSize(Pool pool
) {
1783 DCHECK_LT(static_cast<size_t>(pool
), arraysize(current_size_
));
1784 return current_size_
[pool
];
1787 uint64_t ClientTracingId() const override
{ return 0; }
1789 int ClientId() const override
{ return 0; }
1792 ~CountingMemoryTracker() override
{}
1794 size_t current_size_
[2];
1795 DISALLOW_COPY_AND_ASSIGN(CountingMemoryTracker
);
1798 class SharedTextureTest
: public GpuServiceTest
{
1800 static const bool kUseDefaultTextures
= false;
1802 SharedTextureTest() : feature_info_(new FeatureInfo()) {}
1804 ~SharedTextureTest() override
{}
1806 void SetUp() override
{
1807 GpuServiceTest::SetUp();
1808 memory_tracker1_
= new CountingMemoryTracker
;
1809 texture_manager1_
.reset(
1810 new TextureManager(memory_tracker1_
.get(),
1811 feature_info_
.get(),
1812 TextureManagerTest::kMaxTextureSize
,
1813 TextureManagerTest::kMaxCubeMapTextureSize
,
1814 TextureManagerTest::kMaxRectangleTextureSize
,
1815 TextureManagerTest::kMax3DTextureSize
,
1816 kUseDefaultTextures
));
1817 memory_tracker2_
= new CountingMemoryTracker
;
1818 texture_manager2_
.reset(
1819 new TextureManager(memory_tracker2_
.get(),
1820 feature_info_
.get(),
1821 TextureManagerTest::kMaxTextureSize
,
1822 TextureManagerTest::kMaxCubeMapTextureSize
,
1823 TextureManagerTest::kMaxRectangleTextureSize
,
1824 TextureManagerTest::kMax3DTextureSize
,
1825 kUseDefaultTextures
));
1826 TestHelper::SetupTextureManagerInitExpectations(
1827 gl_
.get(), "", kUseDefaultTextures
);
1828 texture_manager1_
->Initialize();
1829 TestHelper::SetupTextureManagerInitExpectations(
1830 gl_
.get(), "", kUseDefaultTextures
);
1831 texture_manager2_
->Initialize();
1834 void TearDown() override
{
1835 texture_manager2_
->Destroy(false);
1836 texture_manager2_
.reset();
1837 texture_manager1_
->Destroy(false);
1838 texture_manager1_
.reset();
1839 GpuServiceTest::TearDown();
1843 scoped_refptr
<FeatureInfo
> feature_info_
;
1844 scoped_refptr
<CountingMemoryTracker
> memory_tracker1_
;
1845 scoped_ptr
<TextureManager
> texture_manager1_
;
1846 scoped_refptr
<CountingMemoryTracker
> memory_tracker2_
;
1847 scoped_ptr
<TextureManager
> texture_manager2_
;
1850 TEST_F(SharedTextureTest
, DeleteTextures
) {
1851 scoped_refptr
<TextureRef
> ref1
= texture_manager1_
->CreateTexture(10, 10);
1852 scoped_refptr
<TextureRef
> ref2
=
1853 texture_manager2_
->Consume(20, ref1
->texture());
1854 EXPECT_CALL(*gl_
, DeleteTextures(1, _
))
1857 texture_manager1_
->RemoveTexture(10);
1858 testing::Mock::VerifyAndClearExpectations(gl_
.get());
1860 EXPECT_CALL(*gl_
, DeleteTextures(1, _
))
1862 .RetiresOnSaturation();
1864 texture_manager2_
->RemoveTexture(20);
1865 testing::Mock::VerifyAndClearExpectations(gl_
.get());
1868 TEST_F(SharedTextureTest
, TextureSafetyAccounting
) {
1869 EXPECT_FALSE(texture_manager1_
->HaveUnrenderableTextures());
1870 EXPECT_FALSE(texture_manager1_
->HaveUnsafeTextures());
1871 EXPECT_FALSE(texture_manager1_
->HaveUnclearedMips());
1872 EXPECT_FALSE(texture_manager2_
->HaveUnrenderableTextures());
1873 EXPECT_FALSE(texture_manager2_
->HaveUnsafeTextures());
1874 EXPECT_FALSE(texture_manager2_
->HaveUnclearedMips());
1876 // Newly created texture is renderable.
1877 scoped_refptr
<TextureRef
> ref1
= texture_manager1_
->CreateTexture(10, 10);
1878 EXPECT_FALSE(texture_manager1_
->HaveUnrenderableTextures());
1879 EXPECT_FALSE(texture_manager1_
->HaveUnsafeTextures());
1880 EXPECT_FALSE(texture_manager1_
->HaveUnclearedMips());
1882 // Associate new texture ref to other texture manager, should account for it
1884 scoped_refptr
<TextureRef
> ref2
=
1885 texture_manager2_
->Consume(20, ref1
->texture());
1886 EXPECT_FALSE(texture_manager2_
->HaveUnrenderableTextures());
1887 EXPECT_FALSE(texture_manager2_
->HaveUnsafeTextures());
1888 EXPECT_FALSE(texture_manager2_
->HaveUnclearedMips());
1890 // Make texture renderable but uncleared on one texture manager, should affect
1892 texture_manager1_
->SetTarget(ref1
.get(), GL_TEXTURE_2D
);
1893 EXPECT_TRUE(texture_manager1_
->HaveUnrenderableTextures());
1894 EXPECT_FALSE(texture_manager1_
->HaveUnsafeTextures());
1895 EXPECT_FALSE(texture_manager1_
->HaveUnclearedMips());
1896 EXPECT_TRUE(texture_manager2_
->HaveUnrenderableTextures());
1897 EXPECT_FALSE(texture_manager2_
->HaveUnsafeTextures());
1898 EXPECT_FALSE(texture_manager2_
->HaveUnclearedMips());
1900 texture_manager1_
->SetLevelInfo(ref1
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1,
1901 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1902 EXPECT_FALSE(texture_manager1_
->HaveUnrenderableTextures());
1903 EXPECT_TRUE(texture_manager1_
->HaveUnsafeTextures());
1904 EXPECT_TRUE(texture_manager1_
->HaveUnclearedMips());
1905 EXPECT_FALSE(texture_manager2_
->HaveUnrenderableTextures());
1906 EXPECT_TRUE(texture_manager2_
->HaveUnsafeTextures());
1907 EXPECT_TRUE(texture_manager2_
->HaveUnclearedMips());
1909 // Make texture cleared on one texture manager, should affect other one.
1910 texture_manager1_
->SetLevelCleared(ref1
.get(), GL_TEXTURE_2D
, 0, true);
1911 EXPECT_FALSE(texture_manager1_
->HaveUnsafeTextures());
1912 EXPECT_FALSE(texture_manager1_
->HaveUnclearedMips());
1913 EXPECT_FALSE(texture_manager2_
->HaveUnsafeTextures());
1914 EXPECT_FALSE(texture_manager2_
->HaveUnclearedMips());
1916 EXPECT_CALL(*gl_
, DeleteTextures(1, _
))
1918 .RetiresOnSaturation();
1919 texture_manager1_
->RemoveTexture(10);
1920 texture_manager2_
->RemoveTexture(20);
1923 TEST_F(SharedTextureTest
, FBOCompletenessCheck
) {
1924 const GLenum kCompleteValue
= GL_FRAMEBUFFER_COMPLETE
;
1925 FramebufferManager
framebuffer_manager1(
1926 1, 1, ContextGroup::CONTEXT_TYPE_UNDEFINED
);
1927 texture_manager1_
->set_framebuffer_manager(&framebuffer_manager1
);
1928 FramebufferManager
framebuffer_manager2(
1929 1, 1, ContextGroup::CONTEXT_TYPE_UNDEFINED
);
1930 texture_manager2_
->set_framebuffer_manager(&framebuffer_manager2
);
1932 scoped_refptr
<TextureRef
> ref1
= texture_manager1_
->CreateTexture(10, 10);
1933 framebuffer_manager1
.CreateFramebuffer(10, 10);
1934 scoped_refptr
<Framebuffer
> framebuffer1
=
1935 framebuffer_manager1
.GetFramebuffer(10);
1936 framebuffer1
->AttachTexture(
1937 GL_COLOR_ATTACHMENT0
, ref1
.get(), GL_TEXTURE_2D
, 0, 0);
1938 EXPECT_FALSE(framebuffer_manager1
.IsComplete(framebuffer1
.get()));
1939 EXPECT_NE(kCompleteValue
, framebuffer1
->IsPossiblyComplete());
1941 // Make FBO complete in manager 1.
1942 texture_manager1_
->SetTarget(ref1
.get(), GL_TEXTURE_2D
);
1943 texture_manager1_
->SetLevelInfo(ref1
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1,
1944 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
1946 EXPECT_EQ(kCompleteValue
, framebuffer1
->IsPossiblyComplete());
1947 framebuffer_manager1
.MarkAsComplete(framebuffer1
.get());
1948 EXPECT_TRUE(framebuffer_manager1
.IsComplete(framebuffer1
.get()));
1950 // Share texture with manager 2.
1951 scoped_refptr
<TextureRef
> ref2
=
1952 texture_manager2_
->Consume(20, ref1
->texture());
1953 framebuffer_manager2
.CreateFramebuffer(20, 20);
1954 scoped_refptr
<Framebuffer
> framebuffer2
=
1955 framebuffer_manager2
.GetFramebuffer(20);
1956 framebuffer2
->AttachTexture(
1957 GL_COLOR_ATTACHMENT0
, ref2
.get(), GL_TEXTURE_2D
, 0, 0);
1958 EXPECT_FALSE(framebuffer_manager2
.IsComplete(framebuffer2
.get()));
1959 EXPECT_EQ(kCompleteValue
, framebuffer2
->IsPossiblyComplete());
1960 framebuffer_manager2
.MarkAsComplete(framebuffer2
.get());
1961 EXPECT_TRUE(framebuffer_manager2
.IsComplete(framebuffer2
.get()));
1963 // Change level for texture, both FBOs should be marked incomplete
1964 texture_manager1_
->SetLevelInfo(ref1
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1,
1965 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
1967 EXPECT_FALSE(framebuffer_manager1
.IsComplete(framebuffer1
.get()));
1968 EXPECT_EQ(kCompleteValue
, framebuffer1
->IsPossiblyComplete());
1969 framebuffer_manager1
.MarkAsComplete(framebuffer1
.get());
1970 EXPECT_TRUE(framebuffer_manager1
.IsComplete(framebuffer1
.get()));
1971 EXPECT_FALSE(framebuffer_manager2
.IsComplete(framebuffer2
.get()));
1972 EXPECT_EQ(kCompleteValue
, framebuffer2
->IsPossiblyComplete());
1973 framebuffer_manager2
.MarkAsComplete(framebuffer2
.get());
1974 EXPECT_TRUE(framebuffer_manager2
.IsComplete(framebuffer2
.get()));
1976 EXPECT_CALL(*gl_
, DeleteFramebuffersEXT(1, _
))
1978 .RetiresOnSaturation();
1979 framebuffer_manager1
.RemoveFramebuffer(10);
1980 framebuffer_manager2
.RemoveFramebuffer(20);
1981 EXPECT_CALL(*gl_
, DeleteTextures(1, _
))
1983 .RetiresOnSaturation();
1984 texture_manager1_
->RemoveTexture(10);
1985 texture_manager2_
->RemoveTexture(20);
1988 TEST_F(SharedTextureTest
, Memory
) {
1989 size_t initial_memory1
= memory_tracker1_
->GetSize(MemoryTracker::kUnmanaged
);
1990 size_t initial_memory2
= memory_tracker2_
->GetSize(MemoryTracker::kUnmanaged
);
1992 // Newly created texture is unrenderable.
1993 scoped_refptr
<TextureRef
> ref1
= texture_manager1_
->CreateTexture(10, 10);
1994 texture_manager1_
->SetTarget(ref1
.get(), GL_TEXTURE_2D
);
1995 texture_manager1_
->SetLevelInfo(ref1
.get(), GL_TEXTURE_2D
, 0, GL_RGBA
, 10, 10,
1996 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, gfx::Rect());
1998 EXPECT_LT(0u, ref1
->texture()->estimated_size());
1999 EXPECT_EQ(initial_memory1
+ ref1
->texture()->estimated_size(),
2000 memory_tracker1_
->GetSize(MemoryTracker::kUnmanaged
));
2002 // Associate new texture ref to other texture manager, it doesn't account for
2003 // the texture memory, the first memory tracker still has it.
2004 scoped_refptr
<TextureRef
> ref2
=
2005 texture_manager2_
->Consume(20, ref1
->texture());
2006 EXPECT_EQ(initial_memory1
+ ref1
->texture()->estimated_size(),
2007 memory_tracker1_
->GetSize(MemoryTracker::kUnmanaged
));
2008 EXPECT_EQ(initial_memory2
,
2009 memory_tracker2_
->GetSize(MemoryTracker::kUnmanaged
));
2011 // Delete the texture, memory should go to the remaining tracker.
2012 texture_manager1_
->RemoveTexture(10);
2014 EXPECT_EQ(initial_memory1
,
2015 memory_tracker1_
->GetSize(MemoryTracker::kUnmanaged
));
2016 EXPECT_EQ(initial_memory2
+ ref2
->texture()->estimated_size(),
2017 memory_tracker2_
->GetSize(MemoryTracker::kUnmanaged
));
2019 EXPECT_CALL(*gl_
, DeleteTextures(1, _
))
2021 .RetiresOnSaturation();
2023 texture_manager2_
->RemoveTexture(20);
2024 EXPECT_EQ(initial_memory2
,
2025 memory_tracker2_
->GetSize(MemoryTracker::kUnmanaged
));
2028 TEST_F(SharedTextureTest
, Images
) {
2029 scoped_refptr
<TextureRef
> ref1
= texture_manager1_
->CreateTexture(10, 10);
2030 scoped_refptr
<TextureRef
> ref2
=
2031 texture_manager2_
->Consume(20, ref1
->texture());
2033 texture_manager1_
->SetTarget(ref1
.get(), GL_TEXTURE_2D
);
2034 texture_manager1_
->SetLevelInfo(ref1
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2,
2035 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
2037 EXPECT_FALSE(ref1
->texture()->HasImages());
2038 EXPECT_FALSE(ref2
->texture()->HasImages());
2039 EXPECT_FALSE(texture_manager1_
->HaveImages());
2040 EXPECT_FALSE(texture_manager2_
->HaveImages());
2041 scoped_refptr
<gfx::GLImage
> image1(new gfx::GLImageStub
);
2042 texture_manager1_
->SetLevelImage(ref1
.get(), GL_TEXTURE_2D
, 1, image1
.get());
2043 EXPECT_TRUE(ref1
->texture()->HasImages());
2044 EXPECT_TRUE(ref2
->texture()->HasImages());
2045 EXPECT_TRUE(texture_manager1_
->HaveImages());
2046 EXPECT_TRUE(texture_manager2_
->HaveImages());
2047 scoped_refptr
<gfx::GLImage
> image2(new gfx::GLImageStub
);
2048 texture_manager1_
->SetLevelImage(ref1
.get(), GL_TEXTURE_2D
, 1, image2
.get());
2049 EXPECT_TRUE(ref1
->texture()->HasImages());
2050 EXPECT_TRUE(ref2
->texture()->HasImages());
2051 EXPECT_TRUE(texture_manager1_
->HaveImages());
2052 EXPECT_TRUE(texture_manager2_
->HaveImages());
2053 texture_manager1_
->SetLevelInfo(ref1
.get(), GL_TEXTURE_2D
, 1, GL_RGBA
, 2, 2,
2054 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
2056 EXPECT_FALSE(ref1
->texture()->HasImages());
2057 EXPECT_FALSE(ref2
->texture()->HasImages());
2058 EXPECT_FALSE(texture_manager1_
->HaveImages());
2059 EXPECT_FALSE(texture_manager1_
->HaveImages());
2061 EXPECT_CALL(*gl_
, DeleteTextures(1, _
))
2063 .RetiresOnSaturation();
2064 texture_manager1_
->RemoveTexture(10);
2065 texture_manager2_
->RemoveTexture(20);
2069 class TextureFormatTypeValidationTest
: public TextureManagerTest
{
2071 TextureFormatTypeValidationTest() {}
2072 ~TextureFormatTypeValidationTest() override
{}
2075 void SetupFeatureInfo(const char* gl_extensions
, const char* gl_version
) {
2076 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
2077 gl_
.get(), gl_extensions
, "", gl_version
);
2078 feature_info_
->Initialize();
2081 void ExpectValid(GLenum format
, GLenum type
, GLenum internal_format
) {
2082 EXPECT_TRUE(manager_
->ValidateTextureParameters(
2083 error_state_
.get(), "", format
, type
, internal_format
, 0));
2086 void ExpectInvalid(GLenum format
, GLenum type
, GLenum internal_format
) {
2087 EXPECT_CALL(*error_state_
,
2088 SetGLError(_
, _
, _
, _
, _
))
2090 .RetiresOnSaturation();
2091 EXPECT_FALSE(manager_
->ValidateTextureParameters(
2092 error_state_
.get(), "", format
, type
, internal_format
, 0));
2095 void ExpectInvalidEnum(GLenum format
, GLenum type
, GLenum internal_format
) {
2096 EXPECT_CALL(*error_state_
,
2097 SetGLErrorInvalidEnum(_
, _
, _
, _
, _
))
2099 .RetiresOnSaturation();
2100 EXPECT_FALSE(manager_
->ValidateTextureParameters(
2101 error_state_
.get(), "", format
, type
, internal_format
, 0));
2105 TEST_F(TextureFormatTypeValidationTest
, ES2Basic
) {
2106 SetupFeatureInfo("", "OpenGL ES 2.0");
2108 ExpectValid(GL_ALPHA
, GL_UNSIGNED_BYTE
, GL_ALPHA
);
2109 ExpectValid(GL_RGB
, GL_UNSIGNED_SHORT_5_6_5
, GL_RGB
);
2110 ExpectValid(GL_RGBA
, GL_UNSIGNED_SHORT_4_4_4_4
, GL_RGBA
);
2111 ExpectValid(GL_LUMINANCE
, GL_UNSIGNED_BYTE
, GL_LUMINANCE
);
2112 ExpectValid(GL_LUMINANCE_ALPHA
, GL_UNSIGNED_BYTE
, GL_LUMINANCE_ALPHA
);
2114 ExpectInvalid(GL_LUMINANCE_ALPHA
, GL_UNSIGNED_BYTE
, GL_ALPHA
);
2116 // float / half_float.
2117 ExpectInvalidEnum(GL_RGBA
, GL_FLOAT
, GL_RGBA
);
2118 ExpectInvalidEnum(GL_RGBA
, GL_HALF_FLOAT_OES
, GL_RGBA
);
2121 ExpectInvalidEnum(GL_BGRA_EXT
, GL_UNSIGNED_BYTE
, GL_BGRA_EXT
);
2124 ExpectInvalidEnum(GL_DEPTH_COMPONENT
, GL_UNSIGNED_SHORT
, GL_DEPTH_COMPONENT
);
2125 ExpectInvalidEnum(GL_DEPTH_STENCIL
, GL_UNSIGNED_INT_24_8
, GL_DEPTH_STENCIL
);
2128 ExpectInvalidEnum(GL_SRGB_EXT
, GL_UNSIGNED_BYTE
, GL_SRGB_EXT
);
2129 ExpectInvalidEnum(GL_SRGB_ALPHA_EXT
, GL_UNSIGNED_BYTE
, GL_SRGB_ALPHA_EXT
);
2132 ExpectInvalidEnum(GL_RGB
, GL_UNSIGNED_BYTE
, GL_RGB8
);
2135 TEST_F(TextureFormatTypeValidationTest
, ES2WithExtTextureFormatBGRA8888
) {
2136 SetupFeatureInfo("GL_EXT_texture_format_BGRA8888", "OpenGL ES 2.0");
2138 ExpectValid(GL_BGRA_EXT
, GL_UNSIGNED_BYTE
, GL_BGRA_EXT
);
2141 TEST_F(TextureFormatTypeValidationTest
, ES2WithAppleTextureFormatBGRA8888
) {
2142 SetupFeatureInfo("GL_APPLE_texture_format_BGRA8888", "OpenGL ES 2.0");
2144 ExpectValid(GL_BGRA_EXT
, GL_UNSIGNED_BYTE
, GL_BGRA_EXT
);
2147 TEST_F(TextureFormatTypeValidationTest
, ES2WithArbDepth
) {
2148 SetupFeatureInfo("GL_ARB_depth_texture", "OpenGL ES 2.0");
2150 ExpectValid(GL_DEPTH_COMPONENT
, GL_UNSIGNED_SHORT
, GL_DEPTH_COMPONENT
);
2151 ExpectValid(GL_DEPTH_COMPONENT
, GL_UNSIGNED_INT
, GL_DEPTH_COMPONENT
);
2152 ExpectInvalidEnum(GL_DEPTH_STENCIL
, GL_UNSIGNED_INT_24_8
, GL_DEPTH_STENCIL
);
2155 TEST_F(TextureFormatTypeValidationTest
, ES2WithOesDepth
) {
2156 SetupFeatureInfo("GL_OES_depth_texture", "OpenGL ES 2.0");
2158 ExpectValid(GL_DEPTH_COMPONENT
, GL_UNSIGNED_SHORT
, GL_DEPTH_COMPONENT
);
2159 ExpectValid(GL_DEPTH_COMPONENT
, GL_UNSIGNED_INT
, GL_DEPTH_COMPONENT
);
2160 ExpectInvalidEnum(GL_DEPTH_STENCIL
, GL_UNSIGNED_INT_24_8
, GL_DEPTH_STENCIL
);
2163 TEST_F(TextureFormatTypeValidationTest
, ES2WithAngleDepth
) {
2164 SetupFeatureInfo("GL_ANGLE_depth_texture", "OpenGL ES 2.0");
2166 ExpectValid(GL_DEPTH_COMPONENT
, GL_UNSIGNED_SHORT
, GL_DEPTH_COMPONENT
);
2167 ExpectValid(GL_DEPTH_COMPONENT
, GL_UNSIGNED_INT
, GL_DEPTH_COMPONENT
);
2168 ExpectInvalidEnum(GL_DEPTH_STENCIL
, GL_UNSIGNED_INT_24_8
, GL_DEPTH_STENCIL
);
2171 TEST_F(TextureFormatTypeValidationTest
, ES2WithExtPackedDepthStencil
) {
2173 "GL_EXT_packed_depth_stencil GL_ARB_depth_texture", "OpenGL ES 2.0");
2175 ExpectValid(GL_DEPTH_COMPONENT
, GL_UNSIGNED_SHORT
, GL_DEPTH_COMPONENT
);
2176 ExpectValid(GL_DEPTH_COMPONENT
, GL_UNSIGNED_INT
, GL_DEPTH_COMPONENT
);
2177 ExpectValid(GL_DEPTH_STENCIL
, GL_UNSIGNED_INT_24_8
, GL_DEPTH_STENCIL
);
2180 TEST_F(TextureFormatTypeValidationTest
, ES2WithRGWithFloat
) {
2182 "GL_EXT_texture_rg GL_OES_texture_float GL_OES_texture_half_float",
2185 ExpectValid(GL_RED_EXT
, GL_HALF_FLOAT_OES
, GL_RED_EXT
);
2186 ExpectValid(GL_RG_EXT
, GL_HALF_FLOAT_OES
, GL_RG_EXT
);
2187 ExpectValid(GL_RED_EXT
, GL_UNSIGNED_BYTE
, GL_RED_EXT
);
2188 ExpectValid(GL_RG_EXT
, GL_UNSIGNED_BYTE
, GL_RG_EXT
);
2190 ExpectInvalidEnum(GL_RED_EXT
, GL_BYTE
, GL_RED_EXT
);
2191 ExpectInvalidEnum(GL_RG_EXT
, GL_BYTE
, GL_RG_EXT
);
2192 ExpectInvalidEnum(GL_RED_EXT
, GL_SHORT
, GL_RED_EXT
);
2193 ExpectInvalidEnum(GL_RG_EXT
, GL_SHORT
, GL_RG_EXT
);
2196 TEST_F(TextureFormatTypeValidationTest
, ES2WithRGNoFloat
) {
2197 SetupFeatureInfo("GL_ARB_texture_rg", "OpenGL ES 2.0");
2199 ExpectValid(GL_RED_EXT
, GL_UNSIGNED_BYTE
, GL_RED_EXT
);
2200 ExpectValid(GL_RG_EXT
, GL_UNSIGNED_BYTE
, GL_RG_EXT
);
2202 ExpectInvalidEnum(GL_RED_EXT
, GL_HALF_FLOAT_OES
, GL_RED_EXT
);
2203 ExpectInvalidEnum(GL_RG_EXT
, GL_HALF_FLOAT_OES
, GL_RG_EXT
);
2206 TEST_F(TextureFormatTypeValidationTest
, ES2OnTopOfES3
) {
2207 SetupFeatureInfo("", "OpenGL ES 3.0");
2209 ExpectInvalidEnum(GL_RGB
, GL_FLOAT
, GL_RGB
);
2210 ExpectInvalidEnum(GL_RGBA
, GL_FLOAT
, GL_RGBA
);
2211 ExpectInvalidEnum(GL_LUMINANCE
, GL_FLOAT
, GL_LUMINANCE
);
2212 ExpectInvalidEnum(GL_LUMINANCE_ALPHA
, GL_FLOAT
, GL_LUMINANCE_ALPHA
);
2213 ExpectInvalidEnum(GL_ALPHA
, GL_FLOAT
, GL_ALPHA
);
2215 ExpectInvalidEnum(GL_SRGB_EXT
, GL_UNSIGNED_BYTE
, GL_SRGB_EXT
);
2216 ExpectInvalidEnum(GL_SRGB_ALPHA_EXT
, GL_UNSIGNED_BYTE
, GL_SRGB_ALPHA_EXT
);
2219 TEST_F(TextureFormatTypeValidationTest
, ES2WithOesTextureFloat
) {
2220 SetupFeatureInfo("GL_OES_texture_float", "OpenGL ES 2.0");
2222 ExpectValid(GL_RGB
, GL_FLOAT
, GL_RGB
);
2223 ExpectValid(GL_RGBA
, GL_FLOAT
, GL_RGBA
);
2224 ExpectValid(GL_LUMINANCE
, GL_FLOAT
, GL_LUMINANCE
);
2225 ExpectValid(GL_LUMINANCE_ALPHA
, GL_FLOAT
, GL_LUMINANCE_ALPHA
);
2226 ExpectValid(GL_ALPHA
, GL_FLOAT
, GL_ALPHA
);
2228 ExpectInvalidEnum(GL_RGB
, GL_HALF_FLOAT_OES
, GL_RGB
);
2229 ExpectInvalidEnum(GL_RGBA
, GL_HALF_FLOAT_OES
, GL_RGBA
);
2230 ExpectInvalidEnum(GL_LUMINANCE
, GL_HALF_FLOAT_OES
, GL_LUMINANCE
);
2231 ExpectInvalidEnum(GL_LUMINANCE_ALPHA
, GL_HALF_FLOAT_OES
, GL_LUMINANCE_ALPHA
);
2232 ExpectInvalidEnum(GL_ALPHA
, GL_HALF_FLOAT_OES
, GL_ALPHA
);
2235 TEST_F(TextureFormatTypeValidationTest
, ES2WithOesTextureFloatLinear
) {
2237 "GL_OES_texture_float GL_OES_texture_float_linear", "OpenGL ES 2.0");
2239 ExpectValid(GL_RGB
, GL_FLOAT
, GL_RGB
);
2240 ExpectValid(GL_RGBA
, GL_FLOAT
, GL_RGBA
);
2241 ExpectValid(GL_LUMINANCE
, GL_FLOAT
, GL_LUMINANCE
);
2242 ExpectValid(GL_LUMINANCE_ALPHA
, GL_FLOAT
, GL_LUMINANCE_ALPHA
);
2243 ExpectValid(GL_ALPHA
, GL_FLOAT
, GL_ALPHA
);
2245 ExpectInvalidEnum(GL_RGB
, GL_HALF_FLOAT_OES
, GL_RGB
);
2246 ExpectInvalidEnum(GL_RGBA
, GL_HALF_FLOAT_OES
, GL_RGBA
);
2247 ExpectInvalidEnum(GL_LUMINANCE
, GL_HALF_FLOAT_OES
, GL_LUMINANCE
);
2248 ExpectInvalidEnum(GL_LUMINANCE_ALPHA
, GL_HALF_FLOAT_OES
, GL_LUMINANCE_ALPHA
);
2249 ExpectInvalidEnum(GL_ALPHA
, GL_HALF_FLOAT_OES
, GL_ALPHA
);
2252 TEST_F(TextureFormatTypeValidationTest
, ES2WithOesTextureHalfFloat
) {
2253 SetupFeatureInfo("GL_OES_texture_half_float", "OpenGL ES 2.0");
2255 ExpectValid(GL_RGB
, GL_HALF_FLOAT_OES
, GL_RGB
);
2256 ExpectValid(GL_RGBA
, GL_HALF_FLOAT_OES
, GL_RGBA
);
2257 ExpectValid(GL_LUMINANCE
, GL_HALF_FLOAT_OES
, GL_LUMINANCE
);
2258 ExpectValid(GL_LUMINANCE_ALPHA
, GL_HALF_FLOAT_OES
, GL_LUMINANCE_ALPHA
);
2259 ExpectValid(GL_ALPHA
, GL_HALF_FLOAT_OES
, GL_ALPHA
);
2261 ExpectInvalidEnum(GL_RGB
, GL_FLOAT
, GL_RGB
);
2262 ExpectInvalidEnum(GL_RGBA
, GL_FLOAT
, GL_RGBA
);
2263 ExpectInvalidEnum(GL_LUMINANCE
, GL_FLOAT
, GL_LUMINANCE
);
2264 ExpectInvalidEnum(GL_LUMINANCE_ALPHA
, GL_FLOAT
, GL_LUMINANCE_ALPHA
);
2265 ExpectInvalidEnum(GL_ALPHA
, GL_FLOAT
, GL_ALPHA
);
2268 TEST_F(TextureFormatTypeValidationTest
, ES2WithOesTextureHalfFloatLinear
) {
2270 "GL_OES_texture_half_float GL_OES_texture_half_float_linear",
2273 ExpectValid(GL_RGB
, GL_HALF_FLOAT_OES
, GL_RGB
);
2274 ExpectValid(GL_RGBA
, GL_HALF_FLOAT_OES
, GL_RGBA
);
2275 ExpectValid(GL_LUMINANCE
, GL_HALF_FLOAT_OES
, GL_LUMINANCE
);
2276 ExpectValid(GL_LUMINANCE_ALPHA
, GL_HALF_FLOAT_OES
, GL_LUMINANCE_ALPHA
);
2277 ExpectValid(GL_ALPHA
, GL_HALF_FLOAT_OES
, GL_ALPHA
);
2279 ExpectInvalidEnum(GL_RGB
, GL_FLOAT
, GL_RGB
);
2280 ExpectInvalidEnum(GL_RGBA
, GL_FLOAT
, GL_RGBA
);
2281 ExpectInvalidEnum(GL_LUMINANCE
, GL_FLOAT
, GL_LUMINANCE
);
2282 ExpectInvalidEnum(GL_LUMINANCE_ALPHA
, GL_FLOAT
, GL_LUMINANCE_ALPHA
);
2283 ExpectInvalidEnum(GL_ALPHA
, GL_FLOAT
, GL_ALPHA
);
2286 TEST_F(TextureFormatTypeValidationTest
, ES3Basic
) {
2287 SetupFeatureInfo("", "OpenGL ES 3.0");
2288 EXPECT_CALL(*gl_
, GetIntegerv(GL_MAX_COLOR_ATTACHMENTS
, _
))
2289 .WillOnce(SetArgPointee
<1>(8))
2290 .RetiresOnSaturation();
2291 EXPECT_CALL(*gl_
, GetIntegerv(GL_MAX_DRAW_BUFFERS
, _
))
2292 .WillOnce(SetArgPointee
<1>(8))
2293 .RetiresOnSaturation();
2294 feature_info_
->EnableES3Validators();
2296 ExpectValid(GL_ALPHA
, GL_UNSIGNED_BYTE
, GL_ALPHA
);
2297 ExpectValid(GL_RGB
, GL_UNSIGNED_SHORT_5_6_5
, GL_RGB
);
2298 ExpectValid(GL_RGBA
, GL_UNSIGNED_SHORT_4_4_4_4
, GL_RGBA
);
2299 ExpectValid(GL_LUMINANCE
, GL_UNSIGNED_BYTE
, GL_LUMINANCE
);
2300 ExpectValid(GL_LUMINANCE_ALPHA
, GL_UNSIGNED_BYTE
, GL_LUMINANCE_ALPHA
);
2302 ExpectValid(GL_RG
, GL_BYTE
, GL_RG8_SNORM
);
2303 ExpectValid(GL_RG_INTEGER
, GL_UNSIGNED_INT
, GL_RG32UI
);
2304 ExpectValid(GL_RG_INTEGER
, GL_SHORT
, GL_RG16I
);
2305 ExpectValid(GL_RGB
, GL_UNSIGNED_BYTE
, GL_SRGB8
);
2306 ExpectValid(GL_RGBA
, GL_HALF_FLOAT
, GL_RGBA16F
);
2307 ExpectValid(GL_RGBA
, GL_FLOAT
, GL_RGBA16F
);
2308 ExpectValid(GL_RGBA
, GL_FLOAT
, GL_RGBA32F
);
2310 ExpectValid(GL_DEPTH_COMPONENT
, GL_UNSIGNED_SHORT
, GL_DEPTH_COMPONENT16
);
2311 ExpectValid(GL_DEPTH_COMPONENT
, GL_UNSIGNED_INT
, GL_DEPTH_COMPONENT24
);
2312 ExpectValid(GL_DEPTH_COMPONENT
, GL_FLOAT
, GL_DEPTH_COMPONENT32F
);
2313 ExpectValid(GL_DEPTH_STENCIL
, GL_UNSIGNED_INT_24_8
, GL_DEPTH24_STENCIL8
);
2314 ExpectValid(GL_DEPTH_STENCIL
, GL_FLOAT_32_UNSIGNED_INT_24_8_REV
,
2315 GL_DEPTH32F_STENCIL8
);
2317 ExpectInvalid(GL_RGB_INTEGER
, GL_INT
, GL_RGBA8
);
2320 } // namespace gles2