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 #ifndef GL_GLEXT_PROTOTYPES
6 #define GL_GLEXT_PROTOTYPES
10 #include <GLES2/gl2ext.h>
11 #include <GLES2/gl2extchromium.h>
13 #include "gpu/command_buffer/tests/gl_manager.h"
14 #include "gpu/command_buffer/tests/gl_test_utils.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
21 enum CopyType
{ TexImage
, TexSubImage
};
22 const CopyType kCopyTypes
[] = {
28 // A collection of tests that exercise the GL_CHROMIUM_copy_texture extension.
29 class GLCopyTextureCHROMIUMTest
30 : public testing::Test
,
31 public ::testing::WithParamInterface
<CopyType
> {
33 void SetUp() override
{
34 gl_
.Initialize(GLManager::Options());
36 glGenTextures(2, textures_
);
37 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
39 // Some drivers (NVidia/SGX) require texture settings to be a certain way or
40 // they won't report FRAMEBUFFER_COMPLETE.
41 glTexParameterf(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
42 glTexParameterf(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
43 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
44 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
46 glGenFramebuffers(1, &framebuffer_id_
);
47 glBindFramebuffer(GL_FRAMEBUFFER
, framebuffer_id_
);
48 glFramebufferTexture2D(GL_FRAMEBUFFER
, GL_COLOR_ATTACHMENT0
, GL_TEXTURE_2D
,
52 void TearDown() override
{
53 glDeleteTextures(2, textures_
);
54 glDeleteFramebuffers(1, &framebuffer_id_
);
60 GLuint framebuffer_id_
;
63 INSTANTIATE_TEST_CASE_P(CopyType
,
64 GLCopyTextureCHROMIUMTest
,
65 ::testing::ValuesIn(kCopyTypes
));
67 // Test to ensure that the basic functionality of the extension works.
68 TEST_P(GLCopyTextureCHROMIUMTest
, Basic
) {
69 CopyType copy_type
= GetParam();
70 uint8 pixels
[1 * 4] = { 255u, 0u, 0u, 255u };
72 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
73 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
76 if (copy_type
== TexImage
) {
77 glCopyTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], GL_RGBA
,
78 GL_UNSIGNED_BYTE
, false, false, false);
80 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
81 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
84 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0, 0, 0,
85 0, 1, 1, false, false, false);
87 EXPECT_TRUE(glGetError() == GL_NO_ERROR
);
89 // Check the FB is still bound.
91 glGetIntegerv(GL_FRAMEBUFFER_BINDING
, &value
);
93 EXPECT_EQ(framebuffer_id_
, fb_id
);
95 // Check that FB is complete.
96 EXPECT_EQ(static_cast<GLenum
>(GL_FRAMEBUFFER_COMPLETE
),
97 glCheckFramebufferStatus(GL_FRAMEBUFFER
));
99 GLTestHelper::CheckPixels(0, 0, 1, 1, 0, pixels
);
100 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
103 TEST_P(GLCopyTextureCHROMIUMTest
, ImmutableTexture
) {
104 if (!GLTestHelper::HasExtension("GL_EXT_texture_storage")) {
105 LOG(INFO
) << "GL_EXT_texture_storage not supported. Skipping test...";
108 CopyType copy_type
= GetParam();
110 uint8 pixels
[1 * 4] = {255u, 0u, 0u, 255u};
112 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
113 glTexStorage2DEXT(GL_TEXTURE_2D
, 1, GL_RGBA8_OES
, 1, 1);
114 glTexSubImage2D(GL_TEXTURE_2D
, 0, 0, 0, 1, 1, GL_RGBA
, GL_UNSIGNED_BYTE
,
117 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
118 glTexStorage2DEXT(GL_TEXTURE_2D
, 1, GL_RGBA8_OES
, 1, 1);
119 glFramebufferTexture2D(GL_FRAMEBUFFER
, GL_COLOR_ATTACHMENT0
, GL_TEXTURE_2D
,
121 EXPECT_TRUE(glGetError() == GL_NO_ERROR
);
123 if (copy_type
== TexImage
) {
124 glCopyTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], GL_RGBA
,
125 GL_UNSIGNED_BYTE
, false, false, false);
126 EXPECT_TRUE(glGetError() == GL_INVALID_OPERATION
);
128 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0, 0, 0,
129 0, 1, 1, false, false, false);
130 EXPECT_TRUE(glGetError() == GL_NO_ERROR
);
132 // Check the FB is still bound.
134 glGetIntegerv(GL_FRAMEBUFFER_BINDING
, &value
);
135 GLuint fb_id
= value
;
136 EXPECT_EQ(framebuffer_id_
, fb_id
);
138 // Check that FB is complete.
139 EXPECT_EQ(static_cast<GLenum
>(GL_FRAMEBUFFER_COMPLETE
),
140 glCheckFramebufferStatus(GL_FRAMEBUFFER
));
142 GLTestHelper::CheckPixels(0, 0, 1, 1, 0, pixels
);
143 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
147 TEST_P(GLCopyTextureCHROMIUMTest
, InternalFormat
) {
148 CopyType copy_type
= GetParam();
149 GLint src_formats
[] = {GL_ALPHA
, GL_RGB
, GL_RGBA
,
150 GL_LUMINANCE
, GL_LUMINANCE_ALPHA
, GL_BGRA_EXT
};
151 GLint dest_formats
[] = {GL_RGB
, GL_RGBA
};
153 for (size_t src_index
= 0; src_index
< arraysize(src_formats
); src_index
++) {
154 for (size_t dest_index
= 0; dest_index
< arraysize(dest_formats
);
156 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
157 glTexImage2D(GL_TEXTURE_2D
, 0, src_formats
[src_index
], 1, 1, 0,
158 src_formats
[src_index
], GL_UNSIGNED_BYTE
, nullptr);
159 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
161 if (copy_type
== TexImage
) {
162 glCopyTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1],
163 dest_formats
[dest_index
], GL_UNSIGNED_BYTE
,
164 false, false, false);
166 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
167 glTexImage2D(GL_TEXTURE_2D
, 0, dest_formats
[dest_index
], 1, 1, 0,
168 dest_formats
[dest_index
], GL_UNSIGNED_BYTE
, nullptr);
169 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
171 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0,
172 0, 0, 0, 1, 1, false, false, false);
175 EXPECT_TRUE(GL_NO_ERROR
== glGetError()) << "src_index:" << src_index
176 << " dest_index:" << dest_index
;
181 TEST_P(GLCopyTextureCHROMIUMTest
, InternalFormatNotSupported
) {
182 CopyType copy_type
= GetParam();
183 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
184 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
186 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
188 // Check unsupported format reports error.
189 GLint unsupported_dest_formats
[] = {GL_ALPHA
, GL_LUMINANCE
,
191 for (size_t dest_index
= 0; dest_index
< arraysize(unsupported_dest_formats
);
193 if (copy_type
== TexImage
) {
194 glCopyTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1],
195 unsupported_dest_formats
[dest_index
],
196 GL_UNSIGNED_BYTE
, false, false, false);
198 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
199 glTexImage2D(GL_TEXTURE_2D
, 0, unsupported_dest_formats
[dest_index
], 1, 1,
200 0, unsupported_dest_formats
[dest_index
], GL_UNSIGNED_BYTE
,
202 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0, 0,
203 0, 0, 1, 1, false, false, false);
205 EXPECT_TRUE(GL_INVALID_OPERATION
== glGetError())
206 << "dest_index:" << dest_index
;
210 // Test to ensure that the destination texture is redefined if the properties
212 TEST_F(GLCopyTextureCHROMIUMTest
, RedefineDestinationTexture
) {
213 uint8 pixels
[4 * 4] = {255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u,
214 255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u};
216 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
218 GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
, pixels
);
220 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
221 glTexImage2D(GL_TEXTURE_2D
,
230 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
232 // GL_INVALID_OPERATION due to "intrinsic format" != "internal format".
234 GL_TEXTURE_2D
, 0, 0, 0, 1, 1, GL_RGBA
, GL_UNSIGNED_BYTE
, pixels
);
235 EXPECT_TRUE(GL_INVALID_OPERATION
== glGetError());
236 // GL_INVALID_VALUE due to bad dimensions.
238 GL_TEXTURE_2D
, 0, 1, 1, 1, 1, GL_BGRA_EXT
, GL_UNSIGNED_BYTE
, pixels
);
239 EXPECT_TRUE(GL_INVALID_VALUE
== glGetError());
241 // If the dest texture has different properties, glCopyTextureCHROMIUM()
243 glCopyTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], GL_RGBA
,
244 GL_UNSIGNED_BYTE
, false, false, false);
245 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
247 // glTexSubImage2D() succeeds because textures_[1] is redefined into 2x2
248 // dimension and GL_RGBA format.
249 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
251 GL_TEXTURE_2D
, 0, 1, 1, 1, 1, GL_RGBA
, GL_UNSIGNED_BYTE
, pixels
);
252 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
254 // Check the FB is still bound.
256 glGetIntegerv(GL_FRAMEBUFFER_BINDING
, &value
);
257 GLuint fb_id
= value
;
258 EXPECT_EQ(framebuffer_id_
, fb_id
);
260 // Check that FB is complete.
261 EXPECT_EQ(static_cast<GLenum
>(GL_FRAMEBUFFER_COMPLETE
),
262 glCheckFramebufferStatus(GL_FRAMEBUFFER
));
264 GLTestHelper::CheckPixels(1, 1, 1, 1, 0, &pixels
[12]);
265 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
270 void glEnableDisable(GLint param
, GLboolean value
) {
277 } // unnamed namespace
279 // Validate that some basic GL state is not touched upon execution of
281 TEST_P(GLCopyTextureCHROMIUMTest
, BasicStatePreservation
) {
282 CopyType copy_type
= GetParam();
283 uint8 pixels
[1 * 4] = { 255u, 0u, 0u, 255u };
285 glBindFramebuffer(GL_FRAMEBUFFER
, 0);
287 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
288 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
291 if (copy_type
== TexSubImage
) {
292 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
293 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
297 GLboolean reference_settings
[2] = { GL_TRUE
, GL_FALSE
};
298 for (int x
= 0; x
< 2; ++x
) {
299 GLboolean setting
= reference_settings
[x
];
300 glEnableDisable(GL_DEPTH_TEST
, setting
);
301 glEnableDisable(GL_SCISSOR_TEST
, setting
);
302 glEnableDisable(GL_STENCIL_TEST
, setting
);
303 glEnableDisable(GL_CULL_FACE
, setting
);
304 glEnableDisable(GL_BLEND
, setting
);
305 glColorMask(setting
, setting
, setting
, setting
);
306 glDepthMask(setting
);
308 glActiveTexture(GL_TEXTURE1
+ x
);
310 if (copy_type
== TexImage
) {
311 glCopyTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], GL_RGBA
,
312 GL_UNSIGNED_BYTE
, false, false, false);
314 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0, 0,
315 0, 0, 1, 1, false, false, false);
317 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
319 EXPECT_EQ(setting
, glIsEnabled(GL_DEPTH_TEST
));
320 EXPECT_EQ(setting
, glIsEnabled(GL_SCISSOR_TEST
));
321 EXPECT_EQ(setting
, glIsEnabled(GL_STENCIL_TEST
));
322 EXPECT_EQ(setting
, glIsEnabled(GL_CULL_FACE
));
323 EXPECT_EQ(setting
, glIsEnabled(GL_BLEND
));
325 GLboolean bool_array
[4] = { GL_FALSE
, GL_FALSE
, GL_FALSE
, GL_FALSE
};
326 glGetBooleanv(GL_DEPTH_WRITEMASK
, bool_array
);
327 EXPECT_EQ(setting
, bool_array
[0]);
329 bool_array
[0] = GL_FALSE
;
330 glGetBooleanv(GL_COLOR_WRITEMASK
, bool_array
);
331 EXPECT_EQ(setting
, bool_array
[0]);
332 EXPECT_EQ(setting
, bool_array
[1]);
333 EXPECT_EQ(setting
, bool_array
[2]);
334 EXPECT_EQ(setting
, bool_array
[3]);
336 GLint active_texture
= 0;
337 glGetIntegerv(GL_ACTIVE_TEXTURE
, &active_texture
);
338 EXPECT_EQ(GL_TEXTURE1
+ x
, active_texture
);
341 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
344 // Verify that invocation of the extension does not modify the bound
346 TEST_P(GLCopyTextureCHROMIUMTest
, TextureStatePreserved
) {
347 CopyType copy_type
= GetParam();
348 // Setup the texture used for the extension invocation.
349 uint8 pixels
[1 * 4] = { 255u, 0u, 0u, 255u };
350 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
351 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
354 if (copy_type
== TexSubImage
) {
355 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
356 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
360 GLuint texture_ids
[2];
361 glGenTextures(2, texture_ids
);
363 glActiveTexture(GL_TEXTURE0
);
364 glBindTexture(GL_TEXTURE_2D
, texture_ids
[0]);
366 glActiveTexture(GL_TEXTURE1
);
367 glBindTexture(GL_TEXTURE_2D
, texture_ids
[1]);
369 if (copy_type
== TexImage
) {
370 glCopyTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], GL_RGBA
,
371 GL_UNSIGNED_BYTE
, false, false, false);
373 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0, 0, 0,
374 0, 1, 1, false, false, false);
376 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
378 GLint active_texture
= 0;
379 glGetIntegerv(GL_ACTIVE_TEXTURE
, &active_texture
);
380 EXPECT_EQ(GL_TEXTURE1
, active_texture
);
382 GLint bound_texture
= 0;
383 glGetIntegerv(GL_TEXTURE_BINDING_2D
, &bound_texture
);
384 EXPECT_EQ(texture_ids
[1], static_cast<GLuint
>(bound_texture
));
385 glBindTexture(GL_TEXTURE_2D
, 0);
388 glActiveTexture(GL_TEXTURE0
);
389 glGetIntegerv(GL_TEXTURE_BINDING_2D
, &bound_texture
);
390 EXPECT_EQ(texture_ids
[0], static_cast<GLuint
>(bound_texture
));
391 glBindTexture(GL_TEXTURE_2D
, 0);
393 glDeleteTextures(2, texture_ids
);
395 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
398 // Verify that invocation of the extension does not perturb the currently
400 TEST_P(GLCopyTextureCHROMIUMTest
, FBOStatePreserved
) {
401 CopyType copy_type
= GetParam();
402 // Setup the texture used for the extension invocation.
403 uint8 pixels
[1 * 4] = { 255u, 0u, 0u, 255u };
404 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
405 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
408 if (copy_type
== TexSubImage
) {
409 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
410 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
415 glGenTextures(1, &texture_id
);
416 glBindTexture(GL_TEXTURE_2D
, texture_id
);
417 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
420 GLuint renderbuffer_id
;
421 glGenRenderbuffers(1, &renderbuffer_id
);
422 glBindRenderbuffer(GL_RENDERBUFFER
, renderbuffer_id
);
423 glRenderbufferStorage(GL_RENDERBUFFER
, GL_DEPTH_COMPONENT16
, 1, 1);
425 GLuint framebuffer_id
;
426 glGenFramebuffers(1, &framebuffer_id
);
427 glBindFramebuffer(GL_FRAMEBUFFER
, framebuffer_id
);
428 glFramebufferTexture2D(GL_FRAMEBUFFER
, GL_COLOR_ATTACHMENT0
, GL_TEXTURE_2D
,
430 glFramebufferRenderbuffer(GL_FRAMEBUFFER
, GL_DEPTH_ATTACHMENT
,
431 GL_RENDERBUFFER
, renderbuffer_id
);
433 GL_FRAMEBUFFER_COMPLETE
== glCheckFramebufferStatus(GL_FRAMEBUFFER
));
435 // Test that we can write to the bound framebuffer
436 uint8 expected_color
[4] = { 255u, 255u, 0, 255u };
437 glClearColor(1.0, 1.0, 0, 1.0);
438 glClear(GL_COLOR_BUFFER_BIT
);
439 GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color
);
441 if (copy_type
== TexImage
) {
442 glCopyTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], GL_RGBA
,
443 GL_UNSIGNED_BYTE
, false, false, false);
445 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0, 0, 0,
446 0, 1, 1, false, false, false);
448 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
450 EXPECT_TRUE(glIsFramebuffer(framebuffer_id
));
452 // Ensure that reading from the framebuffer produces correct pixels.
453 GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color
);
455 uint8 expected_color2
[4] = { 255u, 0, 255u, 255u };
456 glClearColor(1.0, 0, 1.0, 1.0);
457 glClear(GL_COLOR_BUFFER_BIT
);
458 GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color2
);
461 glGetIntegerv(GL_FRAMEBUFFER_BINDING
, &bound_fbo
);
462 EXPECT_EQ(framebuffer_id
, static_cast<GLuint
>(bound_fbo
));
464 GLint fbo_params
= 0;
465 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER
, GL_COLOR_ATTACHMENT0
,
466 GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
,
468 EXPECT_EQ(GL_TEXTURE
, fbo_params
);
471 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER
, GL_COLOR_ATTACHMENT0
,
472 GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
,
474 EXPECT_EQ(texture_id
, static_cast<GLuint
>(fbo_params
));
477 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER
, GL_DEPTH_ATTACHMENT
,
478 GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
,
480 EXPECT_EQ(GL_RENDERBUFFER
, fbo_params
);
483 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER
, GL_DEPTH_ATTACHMENT
,
484 GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
,
486 EXPECT_EQ(renderbuffer_id
, static_cast<GLuint
>(fbo_params
));
488 glDeleteRenderbuffers(1, &renderbuffer_id
);
489 glDeleteTextures(1, &texture_id
);
490 glDeleteFramebuffers(1, &framebuffer_id
);
492 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
495 TEST_P(GLCopyTextureCHROMIUMTest
, ProgramStatePreservation
) {
496 CopyType copy_type
= GetParam();
497 // unbind the one created in setup.
498 glBindFramebuffer(GL_FRAMEBUFFER
, 0);
499 glBindTexture(GL_TEXTURE_2D
, 0);
502 GLManager::Options options
;
503 options
.size
= gfx::Size(16, 16);
504 options
.share_group_manager
= &gl_
;
505 gl2
.Initialize(options
);
508 static const char* v_shader_str
=
509 "attribute vec4 g_Position;\n"
512 " gl_Position = g_Position;\n"
514 static const char* f_shader_str
=
515 "precision mediump float;\n"
518 " gl_FragColor = vec4(0,1,0,1);\n"
521 GLuint program
= GLTestHelper::LoadProgram(v_shader_str
, f_shader_str
);
522 glUseProgram(program
);
523 GLuint position_loc
= glGetAttribLocation(program
, "g_Position");
526 // Delete program from other context.
528 glDeleteProgram(program
);
529 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
532 // Program should still be usable on this context.
535 GLTestHelper::SetupUnitQuad(position_loc
);
537 // test using program before
538 uint8 expected
[] = { 0, 255, 0, 255, };
539 uint8 zero
[] = { 0, 0, 0, 0, };
540 glClear(GL_COLOR_BUFFER_BIT
);
541 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, zero
));
542 glDrawArrays(GL_TRIANGLES
, 0, 6);
543 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected
));
545 // Call copyTextureCHROMIUM
546 uint8 pixels
[1 * 4] = { 255u, 0u, 0u, 255u };
547 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
548 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
550 if (copy_type
== TexImage
) {
551 glCopyTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], GL_RGBA
,
552 GL_UNSIGNED_BYTE
, false, false, false);
554 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
555 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
557 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0, 0, 0,
558 0, 1, 1, false, false, false);
561 // test using program after
562 glClear(GL_COLOR_BUFFER_BIT
);
563 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, zero
));
564 glDrawArrays(GL_TRIANGLES
, 0, 6);
565 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected
));
567 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
574 // Test that glCopyTextureCHROMIUM doesn't leak uninitialized textures.
575 TEST_P(GLCopyTextureCHROMIUMTest
, UninitializedSource
) {
576 CopyType copy_type
= GetParam();
577 const GLsizei kWidth
= 64, kHeight
= 64;
578 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
579 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, kWidth
, kHeight
, 0, GL_RGBA
,
580 GL_UNSIGNED_BYTE
, nullptr);
582 if (copy_type
== TexImage
) {
583 glCopyTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], GL_RGBA
,
584 GL_UNSIGNED_BYTE
, false, false, false);
586 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
587 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, kWidth
, kHeight
, 0, GL_RGBA
,
588 GL_UNSIGNED_BYTE
, nullptr);
589 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0, 0, 0,
590 0, kWidth
, kHeight
, false, false, false);
592 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
594 uint8 pixels
[kHeight
][kWidth
][4] = {{{1}}};
595 glReadPixels(0, 0, kWidth
, kHeight
, GL_RGBA
, GL_UNSIGNED_BYTE
, pixels
);
596 for (int x
= 0; x
< kWidth
; ++x
) {
597 for (int y
= 0; y
< kHeight
; ++y
) {
598 EXPECT_EQ(0, pixels
[y
][x
][0]);
599 EXPECT_EQ(0, pixels
[y
][x
][1]);
600 EXPECT_EQ(0, pixels
[y
][x
][2]);
601 EXPECT_EQ(0, pixels
[y
][x
][3]);
605 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
608 TEST_F(GLCopyTextureCHROMIUMTest
, CopySubTextureDimension
) {
609 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
610 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
613 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
614 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 3, 3, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
617 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 1, 1, 0,
618 0, 1, 1, false, false, false);
619 EXPECT_TRUE(GL_NO_ERROR
== glGetError());
622 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], -1, 1, 0,
623 0, 1, 1, false, false, false);
624 EXPECT_TRUE(glGetError() == GL_INVALID_VALUE
);
627 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 1, 1, -1,
628 0, 1, 1, false, false, false);
629 EXPECT_TRUE(glGetError() == GL_INVALID_VALUE
);
631 // xoffset + width > dest_width
632 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 2, 2, 0,
633 0, 2, 2, false, false, false);
634 EXPECT_TRUE(glGetError() == GL_INVALID_VALUE
);
636 // x + width > source_width
637 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0, 0, 1,
638 1, 2, 2, false, false, false);
639 EXPECT_TRUE(glGetError() == GL_INVALID_VALUE
);
642 TEST_F(GLCopyTextureCHROMIUMTest
, CopySubTextureOffset
) {
643 uint8 rgba_pixels
[4 * 4] = {255u,
659 glBindTexture(GL_TEXTURE_2D
, textures_
[0]);
660 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
663 uint8 transparent_pixels
[4 * 4] = {
664 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u};
665 glBindTexture(GL_TEXTURE_2D
, textures_
[1]);
666 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 2, 2, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
669 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 1, 1, 0,
670 0, 1, 1, false, false, false);
671 EXPECT_TRUE(glGetError() == GL_NO_ERROR
);
672 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 1, 0, 1,
673 0, 1, 1, false, false, false);
674 EXPECT_TRUE(glGetError() == GL_NO_ERROR
);
675 glCopySubTextureCHROMIUM(GL_TEXTURE_2D
, textures_
[0], textures_
[1], 0, 1, 0,
676 1, 1, 1, false, false, false);
677 EXPECT_TRUE(glGetError() == GL_NO_ERROR
);
679 // Check the FB is still bound.
681 glGetIntegerv(GL_FRAMEBUFFER_BINDING
, &value
);
682 GLuint fb_id
= value
;
683 EXPECT_EQ(framebuffer_id_
, fb_id
);
685 // Check that FB is complete.
686 EXPECT_EQ(static_cast<GLenum
>(GL_FRAMEBUFFER_COMPLETE
),
687 glCheckFramebufferStatus(GL_FRAMEBUFFER
));
689 uint8 transparent
[1 * 4] = {0u, 0u, 0u, 0u};
690 uint8 red
[1 * 4] = {255u, 0u, 0u, 255u};
691 uint8 green
[1 * 4] = {0u, 255u, 0u, 255u};
692 uint8 blue
[1 * 4] = {0u, 0u, 255u, 255u};
693 GLTestHelper::CheckPixels(0, 0, 1, 1, 0, transparent
);
694 GLTestHelper::CheckPixels(1, 1, 1, 1, 0, red
);
695 GLTestHelper::CheckPixels(1, 0, 1, 1, 0, green
);
696 GLTestHelper::CheckPixels(0, 1, 1, 1, 0, blue
);
697 EXPECT_TRUE(GL_NO_ERROR
== glGetError());