1 #ifndef _VKTCONDITIONALRENDERINGTESTUTIL_HPP
2 #define _VKTCONDITIONALRENDERINGTESTUTIL_HPP
3 /*------------------------------------------------------------------------
4  * Vulkan Conformance Tests
5  * ------------------------
6  *
7  * Copyright (c) 2018 The Khronos Group Inc.
8  * Copyright (c) 2018 Danylo Piliaiev <[email protected]>
9  *
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  *      http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  *
22  *//*!
23  * \file
24  * \brief Conditional Rendering Test Utils
25  *//*--------------------------------------------------------------------*/
26 
27 #include "vkDefs.hpp"
28 #include "vkObjUtil.hpp"
29 #include "vktDrawBufferObjectUtil.hpp"
30 #include "vktTestCase.hpp"
31 #include "deSharedPtr.hpp"
32 
33 namespace vkt
34 {
35 namespace conditional
36 {
37 
38 enum ConditionalBufferMemory
39 {
40     LOCAL,
41     HOST
42 };
43 
44 struct ConditionalData
45 {
46     bool conditionInPrimaryCommandBuffer;
47     bool conditionInSecondaryCommandBuffer;
48     bool conditionInverted;
49     bool conditionInherited;
50     uint32_t conditionValue;
51     bool padConditionValue;
52     bool allocationOffset;  // Apply an offset to the condition variable buffer allocation.
53     bool clearInRenderPass; // Clear the color attachment as part of beginning the render pass instead of outside.
54     bool secondaryCommandBufferNested;
55 
56     bool expectCommandExecution;
57 
58     ConditionalBufferMemory memoryType;
59 };
60 
61 static const ConditionalData s_testsData[] = {
62     //    CONDPRI    CONDSEC    INV        INH        V    PAD        ALLOCOFFSET    RP_CLEAR    NEST        RES        MEM
63     {true, false, false, false, 1, false, false, false, false, true, HOST},
64     {true, false, false, false, 0, false, false, false, false, false, HOST},
65     {true, false, true, false, 0, false, false, false, false, true, HOST},
66     {true, false, true, false, 1, false, false, false, false, false, HOST},
67     {true, false, false, true, 1, false, false, false, false, true, HOST},
68     {true, false, false, true, 0, false, false, false, false, false, HOST},
69     {true, false, true, true, 0, false, false, false, false, true, HOST},
70     {true, false, true, true, 1, false, false, false, false, false, HOST},
71 
72     {true, false, false, false, 1, false, false, false, false, true, LOCAL},
73     {true, false, false, false, 0, false, false, false, false, false, LOCAL},
74     {true, false, true, false, 0, false, false, false, false, true, LOCAL},
75     {true, false, true, false, 1, false, false, false, false, false, LOCAL},
76     {true, false, false, true, 1, false, false, false, false, true, LOCAL},
77     {true, false, false, true, 0, false, false, false, false, false, LOCAL},
78     {true, false, true, true, 0, false, false, false, false, true, LOCAL},
79     {true, false, true, true, 1, false, false, false, false, false, LOCAL},
80 
81     {false, true, false, false, 1, false, false, false, false, true, HOST},
82     {false, true, false, false, 0, false, false, false, false, false, HOST},
83     {false, true, true, false, 0, false, false, false, false, true, HOST},
84     {false, true, true, false, 1, false, false, false, false, false, HOST},
85 
86     {false, true, false, false, 1, false, false, false, false, true, LOCAL},
87     {false, true, false, false, 0, false, false, false, false, false, LOCAL},
88     {false, true, true, false, 0, false, false, false, false, true, LOCAL},
89     {false, true, true, false, 1, false, false, false, false, false, LOCAL},
90 
91     // Test that inheritance does not affect outcome of secondary command buffer with conditional rendering or not.
92     {false, false, false, true, 0, false, false, false, false, true, HOST},
93     {false, false, false, true, 0, false, false, false, false, true, LOCAL},
94 
95     {false, true, false, true, 1, false, false, false, false, true, HOST},
96     {false, true, false, true, 0, false, false, false, false, false, HOST},
97     {false, true, true, true, 1, false, false, false, false, false, HOST},
98     {false, true, true, true, 0, false, false, false, false, true, HOST},
99 
100     {false, true, false, true, 1, false, false, false, false, true, LOCAL},
101     {false, true, false, true, 0, false, false, false, false, false, LOCAL},
102     {false, true, true, true, 1, false, false, false, false, false, LOCAL},
103     {false, true, true, true, 0, false, false, false, false, true, LOCAL},
104 
105     // Test clearing the attachment when beginning the render pass.
106     {true, false, false, false, 1, false, false, true, true, true, HOST},
107     {true, false, false, false, 0, false, false, true, true, false, HOST},
108     {true, false, true, false, 0, false, false, true, true, true, HOST},
109     {true, false, true, false, 1, false, false, true, true, false, HOST},
110 
111     // Test secondary buffers with nesting
112     {true, false, false, true, 1, false, false, false, true, true, HOST},
113     {true, false, false, true, 0, false, false, false, true, false, HOST},
114     {true, false, true, true, 0, false, false, false, true, true, HOST},
115     {true, false, true, true, 1, false, false, false, true, false, HOST},
116 
117     {true, false, false, true, 1, false, false, false, true, true, LOCAL},
118     {true, false, false, true, 0, false, false, false, true, false, LOCAL},
119     {true, false, true, true, 0, false, false, false, true, true, LOCAL},
120     {true, false, true, true, 1, false, false, false, true, false, LOCAL},
121 
122     {false, true, false, false, 1, false, false, false, true, true, HOST},
123     {false, true, false, false, 0, false, false, false, true, false, HOST},
124     {false, true, true, false, 0, false, false, false, true, true, HOST},
125     {false, true, true, false, 1, false, false, false, true, false, HOST},
126 
127     {false, true, false, false, 1, false, false, false, true, true, LOCAL},
128     {false, true, false, false, 0, false, false, false, true, false, LOCAL},
129     {false, true, true, false, 0, false, false, false, true, true, LOCAL},
130     {false, true, true, false, 1, false, false, false, true, false, LOCAL},
131 
132     {false, false, false, true, 0, false, false, false, true, true, HOST},
133     {false, false, false, true, 0, false, false, false, true, true, LOCAL},
134 
135     {false, true, false, true, 1, false, false, false, true, true, HOST},
136     {false, true, false, true, 0, false, false, false, true, false, HOST},
137     {false, true, true, true, 1, false, false, false, true, false, HOST},
138     {false, true, true, true, 0, false, false, false, true, true, HOST},
139 
140     {false, true, false, true, 1, false, false, false, true, true, LOCAL},
141     {false, true, false, true, 0, false, false, false, true, false, LOCAL},
142     {false, true, true, true, 1, false, false, false, true, false, LOCAL},
143     {false, true, true, true, 0, false, false, false, true, true, LOCAL},
144 };
145 
146 std::ostream &operator<<(std::ostream &str, ConditionalData const &c);
147 
148 void checkConditionalRenderingCapabilities(vkt::Context &context, const ConditionalData &data);
149 void checkNestedRenderPassCapabilities(vkt::Context &context);
150 de::SharedPtr<Draw::Buffer> createConditionalRenderingBuffer(vkt::Context &context, const ConditionalData &data);
151 void beginConditionalRendering(const vk::DeviceInterface &vk, vk::VkCommandBuffer cmdBuffer, Draw::Buffer &buffer,
152                                const ConditionalData &data);
153 
154 } // namespace conditional
155 } // namespace vkt
156 
157 #endif // _VKTCONDITIONALRENDERINGTESTUTIL_HPP
158