• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // RobustFragmentShaderOutputTest: Tests for the custom ANGLE extension.
7 
8 #include "test_utils/ANGLETest.h"
9 #include "test_utils/gl_raii.h"
10 
11 #include "util/random_utils.h"
12 
13 #include <stdint.h>
14 
15 using namespace angle;
16 
17 namespace
18 {
ExtEnabled()19 bool ExtEnabled()
20 {
21     return IsGLExtensionEnabled("GL_ANGLE_robust_fragment_shader_output");
22 }
23 }  // namespace
24 
25 class RobustFragmentShaderOutputTest : public ANGLETest
26 {
27   public:
RobustFragmentShaderOutputTest()28     RobustFragmentShaderOutputTest() {}
29 };
30 
31 // Basic behaviour from the extension.
TEST_P(RobustFragmentShaderOutputTest,Basic)32 TEST_P(RobustFragmentShaderOutputTest, Basic)
33 {
34     ANGLE_SKIP_TEST_IF(!ExtEnabled());
35 
36     const char kFS[] = R"(#version 300 es
37 precision mediump float;
38 out vec4 outvar;
39 void main() {
40     outvar = vec4(0.0, 1.0, 0.0, 1.0);
41 })";
42     ANGLE_GL_PROGRAM(testProgram, essl3_shaders::vs::Simple(), kFS);
43 
44     GLFramebuffer framebuffer;
45     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
46 
47     constexpr GLsizei kSize = 2;
48     std::vector<GLColor> bluePixels(kSize * kSize, GLColor::blue);
49 
50     GLTexture texA;
51     glBindTexture(GL_TEXTURE_2D, texA);
52     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
53                  bluePixels.data());
54     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texA, 0);
55 
56     GLTexture texB;
57     glBindTexture(GL_TEXTURE_2D, texB);
58     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
59                  bluePixels.data());
60     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, texB, 0);
61 
62     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
63 
64     // Verify initial attachment colors (blue).
65     glReadBuffer(GL_COLOR_ATTACHMENT0);
66     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
67 
68     glReadBuffer(GL_COLOR_ATTACHMENT1);
69     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
70 
71     constexpr std::array<GLenum, 2> kDrawBuffers = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
72     glDrawBuffers(2, kDrawBuffers.data());
73     glViewport(0, 0, kSize, kSize);
74     glUseProgram(testProgram);
75     ASSERT_GL_NO_ERROR();
76 
77     // Draw, verify first attachment is updated (green) and second is unchanged (blue).
78     drawQuad(testProgram, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
79     ASSERT_GL_NO_ERROR();
80 
81     glReadBuffer(GL_COLOR_ATTACHMENT0);
82     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
83 
84     glReadBuffer(GL_COLOR_ATTACHMENT1);
85     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
86 }
87 
88 ANGLE_INSTANTIATE_TEST_ES3(RobustFragmentShaderOutputTest);
89