blob: cb6c0d587932cfa29a2871562d91e631b5e19a76 [file] [log] [blame]
//
// Copyright 2018 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.
//
// TextureEnvTest.cpp: Tests basic usage of texture environments.
#include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"
#include "util/random_utils.h"
#include <stdint.h>
using namespace angle;
class TextureEnvTest : public ANGLETest
{
protected:
TextureEnvTest()
{
setWindowWidth(32);
setWindowHeight(32);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
setConfigDepthBits(24);
}
void verifyEnvironment(GLenum mode,
GLenum combineRgb,
GLenum combineAlpha,
GLenum src0Rgb,
GLenum src0Alpha,
GLenum src1Rgb,
GLenum src1Alpha,
GLenum src2Rgb,
GLenum src2Alpha,
GLenum op0Rgb,
GLenum op0Alpha,
GLenum op1Rgb,
GLenum op1Alpha,
GLenum op2Rgb,
GLenum op2Alpha,
const GLColor32F &envColor,
GLfloat rgbScale,
GLfloat alphaScale)
{
GLfloat actualParams[4] = {};
glGetTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(mode, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_COMBINE_RGB, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(combineRgb, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(combineAlpha, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC0_RGB, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(src0Rgb, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC0_ALPHA, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(src0Alpha, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC1_RGB, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(src1Rgb, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC1_ALPHA, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(src1Alpha, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC2_RGB, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(src2Rgb, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_SRC2_ALPHA, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(src2Alpha, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND0_RGB, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(op0Rgb, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(op0Alpha, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND1_RGB, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(op1Rgb, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(op1Alpha, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND2_RGB, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(op2Rgb, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_GLENUM_EQ(op2Alpha, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_EQ(envColor.R, actualParams[0]);
EXPECT_EQ(envColor.G, actualParams[1]);
EXPECT_EQ(envColor.B, actualParams[2]);
EXPECT_EQ(envColor.A, actualParams[3]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_RGB_SCALE, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_EQ(rgbScale, actualParams[0]);
glGetTexEnvfv(GL_TEXTURE_ENV, GL_ALPHA_SCALE, actualParams);
EXPECT_GL_NO_ERROR();
EXPECT_EQ(alphaScale, actualParams[0]);
}
};
// Initial state check.
TEST_P(TextureEnvTest, InitialState)
{
GLint numUnits;
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &numUnits);
EXPECT_GL_NO_ERROR();
for (int i = 0; i < numUnits; i++)
{
glActiveTexture(GL_TEXTURE0 + i);
EXPECT_GL_NO_ERROR();
verifyEnvironment(GL_MODULATE, // envMode
GL_MODULATE, // combineRgb
GL_MODULATE, // combineAlpha
GL_TEXTURE, // src0Rgb
GL_TEXTURE, // src0Alpha
GL_PREVIOUS, // src1Rgb
GL_PREVIOUS, // src1Alpha
GL_CONSTANT, // src2Rgb
GL_CONSTANT, // src2Alpha
GL_SRC_COLOR, // op0Rgb
GL_SRC_ALPHA, // op0Alpha
GL_SRC_COLOR, // op1Rgb
GL_SRC_ALPHA, // op1Alpha
GL_SRC_ALPHA, // op2Rgb
GL_SRC_ALPHA, // op2Alpha
GLColor32F(0.0f, 0.0f, 0.0f, 0.0f), // envColor
1.0f, // rgbScale
1.0f // alphaScale
);
}
}
// Negative test for parameter names.
TEST_P(TextureEnvTest, NegativeParameter)
{
glTexEnvfv(0, GL_ALPHA_SCALE, nullptr);
EXPECT_GL_ERROR(GL_INVALID_ENUM);
glTexEnvfv(GL_ALPHA_SCALE, GL_ALPHA_SCALE, nullptr);
EXPECT_GL_ERROR(GL_INVALID_ENUM);
glTexEnvfv(GL_TEXTURE_ENV, 0, nullptr);
EXPECT_GL_ERROR(GL_INVALID_ENUM);
}
// Negative test for parameter values.
TEST_P(TextureEnvTest, NegativeValues)
{
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_SRC2_RGB, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_ALPHA, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_ALPHA, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_SRC2_ALPHA, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, 0.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, (GLfloat)GL_DOT3_RGB);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, (GLfloat)GL_DOT3_RGBA);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, (GLfloat)GL_SRC_COLOR);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, (GLfloat)GL_ONE_MINUS_SRC_COLOR);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, (GLfloat)GL_SRC_COLOR);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, (GLfloat)GL_ONE_MINUS_SRC_COLOR);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, (GLfloat)GL_SRC_COLOR);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, (GLfloat)GL_ONE_MINUS_SRC_COLOR);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 0.5f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 3.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 0.5f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 3.0f);
EXPECT_GL_ERROR(GL_INVALID_VALUE);
}
// Checks that texture environment state can be set.
TEST_P(TextureEnvTest, Set)
{
const int kTrials = 1000;
angle::RNG rng(0);
GLint numUnits;
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &numUnits);
EXPECT_GL_NO_ERROR();
std::vector<GLenum> validUnits(numUnits);
for (int i = 0; i < numUnits; i++)
{
validUnits[i] = GL_TEXTURE0 + i;
}
std::vector<GLenum> validEnvModes = {
GL_ADD, GL_BLEND, GL_COMBINE, GL_DECAL, GL_MODULATE, GL_REPLACE,
};
std::vector<GLenum> validCombineRgbs = {
GL_MODULATE, GL_REPLACE, GL_ADD, GL_ADD_SIGNED,
GL_SUBTRACT, GL_INTERPOLATE, GL_DOT3_RGB, GL_DOT3_RGBA,
};
std::vector<GLenum> validCombineAlphas = {
GL_MODULATE, GL_REPLACE, GL_ADD, GL_ADD_SIGNED, GL_SUBTRACT, GL_INTERPOLATE,
};
std::vector<GLenum> validSrcs = {
GL_CONSTANT,
GL_PREVIOUS,
GL_PRIMARY_COLOR,
GL_TEXTURE,
};
std::vector<GLenum> validOpRgbs = {
GL_SRC_COLOR,
GL_ONE_MINUS_SRC_COLOR,
GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA,
};
std::vector<GLenum> validOpAlphas = {
GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA,
};
std::vector<GLfloat> validScales = {
1.0f,
2.0f,
4.0f,
};
for (int i = 0; i < kTrials; i++)
{
GLenum textureUnit = rng.randomSelect(validUnits);
GLenum mode = rng.randomSelect(validEnvModes);
GLenum combineRgb = rng.randomSelect(validCombineRgbs);
GLenum combineAlpha = rng.randomSelect(validCombineAlphas);
GLenum src0Rgb = rng.randomSelect(validSrcs);
GLenum src0Alpha = rng.randomSelect(validSrcs);
GLenum src1Rgb = rng.randomSelect(validSrcs);
GLenum src1Alpha = rng.randomSelect(validSrcs);
GLenum src2Rgb = rng.randomSelect(validSrcs);
GLenum src2Alpha = rng.randomSelect(validSrcs);
GLenum op0Rgb = rng.randomSelect(validOpRgbs);
GLenum op0Alpha = rng.randomSelect(validOpAlphas);
GLenum op1Rgb = rng.randomSelect(validOpRgbs);
GLenum op1Alpha = rng.randomSelect(validOpAlphas);
GLenum op2Rgb = rng.randomSelect(validOpRgbs);
GLenum op2Alpha = rng.randomSelect(validOpAlphas);
GLColor32F envColor(rng.randomFloatBetween(0.0f, 1.0f), rng.randomFloatBetween(0.0f, 1.0f),
rng.randomFloatBetween(0.0f, 1.0f), rng.randomFloatBetween(0.0f, 1.0f));
GLfloat rgbScale = rng.randomSelect(validScales);
GLfloat alphaScale = rng.randomSelect(validScales);
glActiveTexture(textureUnit);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, combineRgb);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, combineAlpha);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, src0Rgb);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, src0Alpha);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, src1Rgb);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, src1Alpha);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, src2Rgb);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_ALPHA, src2Alpha);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, op0Rgb);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, op0Alpha);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, op1Rgb);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, op1Alpha);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, op2Rgb);
EXPECT_GL_NO_ERROR();
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA, op2Alpha);
EXPECT_GL_NO_ERROR();
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &envColor.R);
EXPECT_GL_NO_ERROR();
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, rgbScale);
EXPECT_GL_NO_ERROR();
glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, alphaScale);
EXPECT_GL_NO_ERROR();
verifyEnvironment(mode, combineRgb, combineAlpha, src0Rgb, src0Alpha, src1Rgb, src1Alpha,
src2Rgb, src2Alpha, op0Rgb, op0Alpha, op1Rgb, op1Alpha, op2Rgb, op2Alpha,
envColor, rgbScale, alphaScale);
}
}
ANGLE_INSTANTIATE_TEST_ES1(TextureEnvTest);