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