blob: 6404add4bf2300dcf8dfb2fb5b6fa43d6b25a451 [file] [log] [blame]
//
// 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 testSetUp() override
{
constexpr char kVS[] = R"(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;
})";
constexpr char kFS[] = R"(precision highp float;
uniform sampler2D tex;
varying vec2 texcoord;
void main()
{
gl_FragColor = texture2D(tex, texcoord);
})";
m2DProgram = CompileProgram(kVS, kFS);
mTexture2DUniformLocation = glGetUniformLocation(m2DProgram, "tex");
}
void testTearDown() override { glDeleteProgram(m2DProgram); }
// 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)
{
runTest<R4G4B4A4>(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4);
}
// Validation test for rx::R5G5B5A1's writeColor functions
TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR5G5B5A1)
{
runTest<R5G5B5A1>(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);
}
// Validation test for rx::R5G6B5's writeColor functions
TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR5G6B5)
{
runTest<R5G6B5>(GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
}
// Validation test for rx::R8G8B8A8's writeColor functions
TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR8G8B8A8)
{
runTest<R8G8B8A8>(GL_RGBA, GL_UNSIGNED_BYTE);
}
// Validation test for rx::R8G8B8's writeColor functions
TEST_P(D3DImageFormatConversionTest, WriteColorFunctionR8G8B8)
{
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_ES2(D3DImageFormatConversionTest);
} // namespace