blob: 9cf91853cad11cf53f232447a884d566f5ed9d21 [file] [log] [blame]
Martin Radeve5285d22017-07-14 16:23:53 +03001//
2// Copyright 2017 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// Framebuffer multiview tests:
7// The tests modify and examine the multiview state.
8//
9
10#include "test_utils/ANGLETest.h"
11
12using namespace angle;
13
14class FramebufferMultiviewTest : public ANGLETest
15{
16 protected:
17 FramebufferMultiviewTest() : mFramebuffer(0), mTexture(0)
18 {
19 setWindowWidth(128);
20 setWindowHeight(128);
21 setWebGLCompatibilityEnabled(true);
22 }
23
24 void SetUp() override
25 {
26 ANGLETest::SetUp();
27
28 glGenFramebuffers(1, &mFramebuffer);
29 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
30
31 glGenTextures(1, &mTexture);
32 glBindTexture(GL_TEXTURE_2D, mTexture);
33 glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA16F, 1, 1);
34 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
35
36 glRequestExtensionANGLE = reinterpret_cast<PFNGLREQUESTEXTENSIONANGLEPROC>(
37 eglGetProcAddress("glRequestExtensionANGLE"));
38 }
39
40 void TearDown() override
41 {
42 if (mTexture != 0)
43 {
44 glDeleteTextures(1, &mTexture);
45 mTexture = 0;
46 }
47
48 if (mFramebuffer != 0)
49 {
50 glDeleteFramebuffers(1, &mFramebuffer);
51 mFramebuffer = 0;
52 }
53
54 ANGLETest::TearDown();
55 }
56
57 GLuint mFramebuffer;
58 GLuint mTexture;
59 PFNGLREQUESTEXTENSIONANGLEPROC glRequestExtensionANGLE = nullptr;
60};
61
62// Test that the framebuffer tokens introduced by ANGLE_multiview can be used query the framebuffer
63// state and that their corresponding default values are correctly set.
64TEST_P(FramebufferMultiviewTest, DefaultState)
65{
66 if (extensionRequestable("GL_ANGLE_multiview"))
67 {
68 glRequestExtensionANGLE("GL_ANGLE_multiview");
69 }
70
71 if (!extensionEnabled("GL_ANGLE_multiview"))
72 {
73 std::cout << "Test skipped due to missing GL_ANGLE_multiview." << std::endl;
74 return;
75 }
76
77 GLint numViews = -1;
78 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
79 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE,
80 &numViews);
81 EXPECT_GL_NO_ERROR();
82 EXPECT_EQ(1, numViews);
83
84 GLint baseViewIndex = -1;
85 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
86 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE,
87 &baseViewIndex);
88 EXPECT_GL_NO_ERROR();
89 EXPECT_EQ(0, baseViewIndex);
90
91 GLint multiviewLayout = GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE;
92 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
93 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE,
94 &multiviewLayout);
95 EXPECT_GL_NO_ERROR();
96 EXPECT_EQ(GL_NONE, multiviewLayout);
97
98 GLint viewportOffsets[2] = {-1, -1};
99 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
100 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE,
101 &viewportOffsets[0]);
102 EXPECT_GL_NO_ERROR();
103 EXPECT_EQ(0, viewportOffsets[0]);
104 EXPECT_EQ(0, viewportOffsets[1]);
105}
106
107// Test that without having the ANGLE_multiview extension, querying for the framebuffer state using
108// the ANGLE_multiview tokens results in an INVALID_ENUM error.
109TEST_P(FramebufferMultiviewTest, NegativeFramebufferStateQueries)
110{
111 GLint numViews = -1;
112 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
113 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE,
114 &numViews);
115 EXPECT_GL_ERROR(GL_INVALID_ENUM);
116
117 GLint baseViewIndex = -1;
118 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
119 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE,
120 &baseViewIndex);
121 EXPECT_GL_ERROR(GL_INVALID_ENUM);
122
123 GLint multiviewLayout = GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE;
124 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
125 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE,
126 &multiviewLayout);
127 EXPECT_GL_ERROR(GL_INVALID_ENUM);
128
129 GLint viewportOffsets[2] = {-1, -1};
130 glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
131 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE,
132 &viewportOffsets[0]);
133 EXPECT_GL_ERROR(GL_INVALID_ENUM);
134}
135
136ANGLE_INSTANTIATE_TEST(FramebufferMultiviewTest, ES3_OPENGL());