| Index: gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
|
| diff --git a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
|
| index 54a892b3e744c7a1b281cd695003858759924ac0..a8de24ac46c02ab9ad8a09c4672c0d5179761cbc 100644
|
| --- a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
|
| +++ b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
|
| @@ -166,6 +166,7 @@ void getExpectedColor(GLenum src_internal_format,
|
| setColor(0, 0, 0, color[0], adjusted_color);
|
| break;
|
| case GL_R8:
|
| + case GL_R16_EXT:
|
| setColor(color[0], 0, 0, 255, adjusted_color);
|
| break;
|
| case GL_LUMINANCE:
|
| @@ -263,6 +264,50 @@ void getExpectedColor(GLenum src_internal_format,
|
| }
|
| }
|
|
|
| +std::unique_ptr<uint8_t[]> getTextureDataAndExpectedRGBA(
|
| + FormatType src_format_type,
|
| + FormatType dest_format_type,
|
| + GLsizei width,
|
| + GLsizei height,
|
| + uint8_t* expected_color,
|
| + uint8_t* expected_mask) {
|
| + const int src_channel_count = gles2::GLES2Util::ElementsPerGroup(
|
| + src_format_type.format, src_format_type.type);
|
| + uint8_t color[4] = {1u, 63u, 127u, 255u};
|
| + getExpectedColor(src_format_type.internal_format,
|
| + dest_format_type.internal_format, color, expected_color,
|
| + expected_mask);
|
| + if (src_format_type.type == GL_UNSIGNED_BYTE) {
|
| + std::unique_ptr<uint8_t[]> pixels(
|
| + new uint8_t[width * height * src_channel_count]);
|
| + for (int i = 0; i < width * height * src_channel_count;
|
| + i += src_channel_count) {
|
| + for (int j = 0; j < src_channel_count; ++j)
|
| + pixels[i + j] = color[j];
|
| + }
|
| + return pixels;
|
| + } else if (src_format_type.type == GL_UNSIGNED_SHORT) {
|
| + uint16_t color_16bit[4] = {1u << 8, 63u << 8, 127u << 8, 255u << 8};
|
| + std::unique_ptr<uint8_t[]> data(
|
| + new uint8_t[width * height * src_channel_count * sizeof(uint16_t)]);
|
| + uint16_t* pixels = reinterpret_cast<uint16_t*>(data.get());
|
| + int16_t flip_sign = -1;
|
| + for (int i = 0; i < width * height * src_channel_count;
|
| + i += src_channel_count) {
|
| + for (int j = 0; j < src_channel_count; ++j) {
|
| + // Introduce an offset to the value to check. Expected value should be
|
| + // the same as without the offset.
|
| + flip_sign *= -1;
|
| + pixels[i + j] =
|
| + color_16bit[j] + flip_sign * (0x7F * (i + j)) / (width * height);
|
| + }
|
| + }
|
| + return data;
|
| + }
|
| + NOTREACHED();
|
| + return nullptr;
|
| +}
|
| +
|
| } // namespace
|
|
|
| // A collection of tests that exercise the GL_CHROMIUM_copy_texture extension.
|
| @@ -351,20 +396,11 @@ class GLCopyTextureCHROMIUMTest
|
| FormatType dest_format_type,
|
| GLint dest_level,
|
| bool is_es3) {
|
| - const int src_channel_count = gles2::GLES2Util::ElementsPerGroup(
|
| - src_format_type.format, src_format_type.type);
|
| - uint8_t color[4] = {1u, 63u, 127u, 255u};
|
| - std::unique_ptr<uint8_t[]> pixels(new uint8_t[width_ * height_ * 4]);
|
| - for (int i = 0; i < width_ * height_ * src_channel_count;
|
| - i += src_channel_count)
|
| - for (int j = 0; j < src_channel_count; ++j)
|
| - pixels[i + j] = color[j];
|
| uint8_t expected_color[4];
|
| uint8_t mask[4];
|
| - getExpectedColor(src_format_type.internal_format,
|
| - dest_format_type.internal_format, color, expected_color,
|
| - mask);
|
| -
|
| + std::unique_ptr<uint8_t[]> pixels =
|
| + getTextureDataAndExpectedRGBA(src_format_type, dest_format_type, width_,
|
| + height_, expected_color, mask);
|
| GLenum source_target = GL_TEXTURE_2D;
|
| glGenTextures(2, textures_);
|
| glBindTexture(source_target, textures_[0]);
|
| @@ -527,6 +563,18 @@ class GLCopyTextureCHROMIUMES3Test : public GLCopyTextureCHROMIUMTest {
|
| DCHECK(!ShouldSkipTest());
|
| return !gl_.decoder()->GetFeatureInfo()->feature_flags().ext_srgb;
|
| }
|
| +
|
| + bool ShouldSkipNorm16() const {
|
| + DCHECK(!ShouldSkipTest());
|
| +#if (defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)) && \
|
| + (defined(ARCH_CPU_X86) || defined(ARCH_CPU_X86_64))
|
| + // Make sure it's tested; it is safe to assume that the flag is always true
|
| + // on desktop.
|
| + EXPECT_TRUE(
|
| + gl_.decoder()->GetFeatureInfo()->feature_flags().ext_texture_norm16);
|
| +#endif
|
| + return !gl_.decoder()->GetFeatureInfo()->feature_flags().ext_texture_norm16;
|
| + }
|
| };
|
|
|
| INSTANTIATE_TEST_CASE_P(CopyType,
|
| @@ -588,6 +636,7 @@ TEST_P(GLCopyTextureCHROMIUMES3Test, FormatCombinations) {
|
| {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE},
|
| {GL_BGRA_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE},
|
| {GL_BGRA8_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE},
|
| + {GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT},
|
| };
|
|
|
| FormatType dest_format_types[] = {
|
| @@ -650,6 +699,8 @@ TEST_P(GLCopyTextureCHROMIUMES3Test, FormatCombinations) {
|
| dest_format_type.internal_format == GL_SRGB_ALPHA_EXT) &&
|
| ShouldSkipSRGBEXT())
|
| continue;
|
| + if (src_format_type.internal_format == GL_R16_EXT && ShouldSkipNorm16())
|
| + continue;
|
|
|
| RunCopyTexture(GL_TEXTURE_2D, copy_type, src_format_type, 0,
|
| dest_format_type, 0, true);
|
|
|