1 /*-------------------------------------------------------------------------
2  * OpenGL Conformance Test Suite
3  * -----------------------------
4  *
5  * Copyright (c) 2022-2022 The Khronos Group Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20 
21 /*!
22  * \file  esextcFragmentShadingRateRenderTarget.cpp
23  * \brief Base test group for fragment shading rate render target tests
24  */ /*-------------------------------------------------------------------*/
25 
26 #include "esextcFragmentShadingRateRenderTarget.hpp"
27 #include "esextcFragmentShadingRateAttachmentTests.hpp"
28 #include "glw.h"
29 
30 namespace glcts
31 {
32 
33 /// Constructor
34 ///
35 /// @param context       Test context
36 /// @param extParams   extra parameters
FragmentShadingRateRenderTarget(glcts::Context & context,const ExtParameters & extParams)37 FragmentShadingRateRenderTarget::FragmentShadingRateRenderTarget(glcts::Context &context,
38                                                                  const ExtParameters &extParams)
39     : TestCaseGroupBase(context, extParams, "render_target", "Fragment Shading Rate Attachment Tests")
40 {
41 }
42 
43 /// Initializes test cases for fragment shading rate tests
init(void)44 void FragmentShadingRateRenderTarget::init(void)
45 {
46     TestNode::init();
47 
48     // Combination or selection list
49     // scissor
50     // multiLayer
51     // multiView
52     // attachmentShadingRate
53     // multiShadingRate
54     // framebufferSize
55 
56     // Only one of following option can be enabled. scissor multiLayer, multiView.
57     // multiShadingRate can be enabled either cases multiLayer or multiView.
58     // scissor test enable only for the single layer case.
59     // layerCount is 2 for multLayer or multiView is enabled.
60 
61     struct TestKindParam
62     {
63         FragmentShadingRateAttachment::TestKind state;
64         std::string name;
65     };
66 
67     struct BooleanTestParam
68     {
69         bool state;
70         std::string name;
71     };
72 
73     struct UintTestParam
74     {
75         uint32_t state;
76         std::string name;
77     };
78 
79     const std::vector<TestKindParam> testKindParams{
80         {FragmentShadingRateAttachment::TestKind::Scissor, "scissor_"},
81         {FragmentShadingRateAttachment::TestKind::MultiView, "multiview_"},
82     };
83 
84     const std::vector<BooleanTestParam> attachmentShadingRateParams{{false, "api_"}, {true, "attachment_"}};
85 
86     const std::vector<BooleanTestParam> multiShadingRateParams{{false, ""}, {true, "multishadingratelayer_"}};
87 
88     const std::vector<UintTestParam> sizes{
89         {6, "6x6"},
90         {37, "37x37"},
91         {256, "256x256"},
92     };
93 
94     for (const TestKindParam &testKind : testKindParams)
95     {
96         for (const BooleanTestParam &attachmentShadingRate : attachmentShadingRateParams)
97         {
98             for (const BooleanTestParam &multiShadingRate : multiShadingRateParams)
99             {
100                 for (const UintTestParam &sz : sizes)
101                 {
102                     const uint32_t layerCount =
103                         (testKind.state == FragmentShadingRateAttachment::TestKind::MultiView) ? 2 : 1;
104 
105                     if (multiShadingRate.state && ((layerCount <= 1) || !attachmentShadingRate.state))
106                     {
107                         continue;
108                     }
109 
110                     std::string name = testKind.name + attachmentShadingRate.name + multiShadingRate.name + sz.name;
111 
112                     FragmentShadingRateAttachment::TestcaseParam testcaseParam = {
113                         testKind.state, attachmentShadingRate.state, multiShadingRate.state, sz.state, layerCount};
114 
115                     addChild(
116                         new FragmentShadingRateAttachment(m_context, m_extParams, testcaseParam, name.c_str(), ""));
117                 }
118             }
119         }
120     }
121 }
122 } // namespace glcts