xref: /aosp_15_r20/external/angle/src/tests/gl_tests/DifferentStencilMasksTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // DifferentStencilMasksTest:
7*8975f5c5SAndroid Build Coastguard Worker //   Tests the equality between stencilWriteMask and stencilBackWriteMask.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker namespace
16*8975f5c5SAndroid Build Coastguard Worker {
17*8975f5c5SAndroid Build Coastguard Worker class DifferentStencilMasksTest : public ANGLETest<>
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker   protected:
DifferentStencilMasksTest()20*8975f5c5SAndroid Build Coastguard Worker     DifferentStencilMasksTest() : mProgram(0)
21*8975f5c5SAndroid Build Coastguard Worker     {
22*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
23*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
24*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
25*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
26*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
27*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
28*8975f5c5SAndroid Build Coastguard Worker         setConfigDepthBits(24);
29*8975f5c5SAndroid Build Coastguard Worker         setConfigStencilBits(8);
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker         setWebGLCompatibilityEnabled(true);
32*8975f5c5SAndroid Build Coastguard Worker     }
33*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()34*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
35*8975f5c5SAndroid Build Coastguard Worker     {
36*8975f5c5SAndroid Build Coastguard Worker         mProgram = CompileProgram(essl1_shaders::vs::Zero(), essl1_shaders::fs::Blue());
37*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(0u, mProgram);
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_STENCIL_TEST);
40*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
41*8975f5c5SAndroid Build Coastguard Worker     }
42*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()43*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
44*8975f5c5SAndroid Build Coastguard Worker     {
45*8975f5c5SAndroid Build Coastguard Worker         glDisable(GL_STENCIL_TEST);
46*8975f5c5SAndroid Build Coastguard Worker         if (mProgram != 0)
47*8975f5c5SAndroid Build Coastguard Worker             glDeleteProgram(mProgram);
48*8975f5c5SAndroid Build Coastguard Worker     }
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
51*8975f5c5SAndroid Build Coastguard Worker };
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker // Tests that effectively same front and back masks are legal.
TEST_P(DifferentStencilMasksTest,DrawWithSameEffectiveMask)54*8975f5c5SAndroid Build Coastguard Worker TEST_P(DifferentStencilMasksTest, DrawWithSameEffectiveMask)
55*8975f5c5SAndroid Build Coastguard Worker {
56*8975f5c5SAndroid Build Coastguard Worker     // 0x00ff and 0x01ff are effectively 0x00ff by being masked by the current stencil bits, 8.
57*8975f5c5SAndroid Build Coastguard Worker     glStencilMaskSeparate(GL_FRONT, 0x00ff);
58*8975f5c5SAndroid Build Coastguard Worker     glStencilMaskSeparate(GL_BACK, 0x01ff);
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 3);
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
65*8975f5c5SAndroid Build Coastguard Worker }
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker // Tests that effectively different front and back masks are illegal.
TEST_P(DifferentStencilMasksTest,DrawWithDifferentMask)68*8975f5c5SAndroid Build Coastguard Worker TEST_P(DifferentStencilMasksTest, DrawWithDifferentMask)
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker     glStencilMaskSeparate(GL_FRONT, 0x0001);
71*8975f5c5SAndroid Build Coastguard Worker     glStencilMaskSeparate(GL_BACK, 0x0002);
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 3);
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
78*8975f5c5SAndroid Build Coastguard Worker }
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker // Tests that effectively different front and back masks, without stencil bits, are legal.
TEST_P(DifferentStencilMasksTest,DrawWithDifferentMask_NoStencilBuffer)81*8975f5c5SAndroid Build Coastguard Worker TEST_P(DifferentStencilMasksTest, DrawWithDifferentMask_NoStencilBuffer)
82*8975f5c5SAndroid Build Coastguard Worker {
83*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
84*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
85*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
88*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
89*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     glStencilMaskSeparate(GL_FRONT, 0x0001);
92*8975f5c5SAndroid Build Coastguard Worker     glStencilMaskSeparate(GL_BACK, 0x0002);
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 3);
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
99*8975f5c5SAndroid Build Coastguard Worker }
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker // Use this to select which configurations (e.g. which renderer, which GLES major version) these
102*8975f5c5SAndroid Build Coastguard Worker // tests should be run against.
103*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DifferentStencilMasksTest);
104*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
105