diff options
Diffstat (limited to 'gfx/angle/src/tests/gl_tests/D3DImageFormatConversionTest.cpp')
-rwxr-xr-x | gfx/angle/src/tests/gl_tests/D3DImageFormatConversionTest.cpp | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/gfx/angle/src/tests/gl_tests/D3DImageFormatConversionTest.cpp b/gfx/angle/src/tests/gl_tests/D3DImageFormatConversionTest.cpp new file mode 100755 index 000000000..d6319d3f7 --- /dev/null +++ b/gfx/angle/src/tests/gl_tests/D3DImageFormatConversionTest.cpp @@ -0,0 +1,207 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// D3DImageFormatConversionTest: +// Basic tests to validate code relating to D3D Image format conversions. + +#include "test_utils/ANGLETest.h" + +#include "image_util/imageformats.h" + +using namespace angle; + +namespace +{ + +class D3DImageFormatConversionTest : public ANGLETest +{ + protected: + D3DImageFormatConversionTest() + { + setWindowWidth(128); + setWindowHeight(128); + setConfigRedBits(8); + setConfigGreenBits(8); + setConfigBlueBits(8); + setConfigAlphaBits(8); + } + + void SetUp() override + { + ANGLETest::SetUp(); + + const std::string vertexShaderSource = SHADER_SOURCE + ( + precision highp float; + attribute vec4 position; + varying vec2 texcoord; + + void main() + { + gl_Position = vec4(position.xy, 0.0, 1.0); + texcoord = (position.xy * 0.5) + 0.5; + } + ); + + const std::string fragmentShaderSource2D = SHADER_SOURCE + ( + precision highp float; + uniform sampler2D tex; + varying vec2 texcoord; + + void main() + { + gl_FragColor = texture2D(tex, texcoord); + } + ); + + m2DProgram = CompileProgram(vertexShaderSource, fragmentShaderSource2D); + mTexture2DUniformLocation = glGetUniformLocation(m2DProgram, "tex"); + } + + void TearDown() override + { + glDeleteProgram(m2DProgram); + + ANGLETest::TearDown(); + } + + // Uses ColorStructType::writeColor to populate initial data for a texture, pass it to glTexImage2D, then render with it. + // The resulting colors should match the colors passed into ::writeColor. + template <typename ColorStructType> + void runTest(GLenum tex2DFormat, GLenum tex2DType) + { + gl::ColorF srcColorF[4]; + ColorStructType pixels[4]; + + GLuint tex = 0; + GLuint fbo = 0; + glGenTextures(1, &tex); + glGenFramebuffers(1, &fbo); + EXPECT_GL_NO_ERROR(); + + srcColorF[0].red = 1.0f; srcColorF[0].green = 0.0f; srcColorF[0].blue = 0.0f; srcColorF[0].alpha = 1.0f; // Red + srcColorF[1].red = 0.0f; srcColorF[1].green = 1.0f; srcColorF[1].blue = 0.0f; srcColorF[1].alpha = 1.0f; // Green + srcColorF[2].red = 0.0f; srcColorF[2].green = 0.0f; srcColorF[2].blue = 1.0f; srcColorF[2].alpha = 1.0f; // Blue + srcColorF[3].red = 1.0f; srcColorF[3].green = 1.0f; srcColorF[3].blue = 0.0f; srcColorF[3].alpha = 1.0f; // Red + Green (Yellow) + + // Convert the ColorF into the pixels that will be fed to glTexImage2D + for (unsigned int i = 0; i < 4; i++) + { + ColorStructType::writeColor(&(pixels[i]), &(srcColorF[i])); + } + + // Generate the texture + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, tex2DFormat, 2, 2, 0, tex2DFormat, tex2DType, pixels); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_GL_NO_ERROR(); + + // Draw a quad using the texture + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(m2DProgram); + glUniform1i(mTexture2DUniformLocation, 0); + drawQuad(m2DProgram, "position", 0.5f); + EXPECT_GL_NO_ERROR(); + + // Check that the pixel colors match srcColorF + EXPECT_PIXEL_EQ( 0, 0, 255, 0, 0, 255); + EXPECT_PIXEL_EQ(getWindowHeight() - 1, 0, 0, 255, 0, 255); + EXPECT_PIXEL_EQ( 0, getWindowWidth() - 1, 0, 0, 255, 255); + EXPECT_PIXEL_EQ(getWindowHeight() - 1, getWindowWidth() - 1, 255, 255, 0, 255); + swapBuffers(); + + glDeleteFramebuffers(1, &fbo); + glDeleteTextures(1, &tex); + } + + GLuint m2DProgram; + GLint mTexture2DUniformLocation; +}; + +// Validation test for rx::R4G4B4A4's writeColor functions +TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR4G4B4A4) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + runTest<R4G4B4A4>(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4); +} + +// Validation test for rx::R5G5B5A1's writeColor functions +TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR5G5B5A1) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + runTest<R5G5B5A1>(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1); +} + +// Validation test for rx::R5G6B5's writeColor functions +TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR5G6B5) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + runTest<R5G6B5>(GL_RGB, GL_UNSIGNED_SHORT_5_6_5); +} + +// Validation test for rx::R8G8B8A8's writeColor functions +TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR8G8B8A8) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + runTest<R8G8B8A8>(GL_RGBA, GL_UNSIGNED_BYTE); +} + +// Validation test for rx::R8G8B8's writeColor functions +TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR8G8B8) +{ + // These tests fail on certain Intel machines running an un-updated version of Win7 + // The tests pass after installing the latest updates from Windows Update. + // TODO: reenable these tests once the bots have been updated + if (IsIntel() && getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE) + { + std::cout << "Test skipped on Intel D3D11." << std::endl; + return; + } + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + runTest<R8G8B8>(GL_RGB, GL_UNSIGNED_BYTE); +} + +// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against. +// Even though this test is only run on Windows (since it includes imageformats.h from the D3D renderer), we can still run the test +// against OpenGL. This is valuable, since it provides extra validation using a renderer that doesn't use imageformats.h itself. +ANGLE_INSTANTIATE_TEST(D3DImageFormatConversionTest, ES2_D3D9(), ES2_D3D11(), ES2_D3D11_FL9_3(), ES2_OPENGL()); + +} // namespace |