blob: b07a5f5479d9a6f77cb5a05888ac793e774f8ce2 [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.
//
// DifferentStencilMasksTest:
// Tests the equality between stencilWriteMask and stencilBackWriteMask.
//
#include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"
using namespace angle;
namespace
{
class DifferentStencilMasksTest : public ANGLETest
{
protected:
DifferentStencilMasksTest() : mProgram(0)
{
setWindowWidth(128);
setWindowHeight(128);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
setConfigDepthBits(24);
setConfigStencilBits(8);
setWebGLCompatibilityEnabled(true);
}
void testSetUp() override
{
mProgram = CompileProgram(essl1_shaders::vs::Zero(), essl1_shaders::fs::Blue());
ASSERT_NE(0u, mProgram);
glEnable(GL_STENCIL_TEST);
ASSERT_GL_NO_ERROR();
}
void testTearDown() override
{
glDisable(GL_STENCIL_TEST);
if (mProgram != 0)
glDeleteProgram(mProgram);
}
GLuint mProgram;
};
// Tests that effectively same front and back masks are legal.
TEST_P(DifferentStencilMasksTest, DrawWithSameEffectiveMask)
{
// 0x00ff and 0x01ff are effectively 0x00ff by being masked by the current stencil bits, 8.
glStencilMaskSeparate(GL_FRONT, 0x00ff);
glStencilMaskSeparate(GL_BACK, 0x01ff);
glUseProgram(mProgram);
glDrawArrays(GL_TRIANGLES, 0, 3);
EXPECT_GL_NO_ERROR();
}
// Tests that effectively different front and back masks are illegal.
TEST_P(DifferentStencilMasksTest, DrawWithDifferentMask)
{
// TODO(hqle): Make this test work for Metal. http://anglebug.com/4134
ANGLE_SKIP_TEST_IF(IsMetal());
glStencilMaskSeparate(GL_FRONT, 0x0001);
glStencilMaskSeparate(GL_BACK, 0x0002);
glUseProgram(mProgram);
glDrawArrays(GL_TRIANGLES, 0, 3);
EXPECT_GL_ERROR(GL_INVALID_OPERATION);
}
// Tests that effectively different front and back masks, without stencil bits, are legal.
TEST_P(DifferentStencilMasksTest, DrawWithDifferentMask_NoStencilBuffer)
{
GLTexture texture;
glBindTexture(GL_TEXTURE_2D, texture.get());
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.get(), 0);
glStencilMaskSeparate(GL_FRONT, 0x0001);
glStencilMaskSeparate(GL_BACK, 0x0002);
glUseProgram(mProgram);
glDrawArrays(GL_TRIANGLES, 0, 3);
EXPECT_GL_NO_ERROR();
}
// Use this to select which configurations (e.g. which renderer, which GLES major version) these
// tests should be run against.
ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DifferentStencilMasksTest);
} // anonymous namespace