xref: /aosp_15_r20/external/deqp/framework/referencerenderer/rrShadingContext.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 #ifndef _RRSHADINGCONTEXT_HPP
2 #define _RRSHADINGCONTEXT_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Reference Renderer
5  * -----------------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief Shading context
24  *//*--------------------------------------------------------------------*/
25 
26 #include "rrDefs.hpp"
27 #include "rrGenericVector.hpp"
28 #include "rrFragmentPacket.hpp"
29 
30 namespace rr
31 {
32 
33 /*--------------------------------------------------------------------*//*!
34  * \brief Fragment shading context
35  *
36  * Contains per-primitive information used in fragment shading
37  *//*--------------------------------------------------------------------*/
38 struct FragmentShadingContext
39 {
40     FragmentShadingContext(const GenericVec4 *varying0, const GenericVec4 *varying1, const GenericVec4 *varying2,
41                            GenericVec4 *outputArray, GenericVec4 *outputArraySrc1, float *fragmentDepths,
42                            int primitiveID, int numFragmentOutputs, int numSamples, FaceType visibleFace_);
43 
44     const GenericVec4 *varyings[3];     //!< Vertex shader outputs. Pointer will be NULL if there is no such vertex.
45     GenericVec4 *const outputArray;     //!< Fragment output array
46     GenericVec4 *const outputArraySrc1; //!< Fragment output array for source 1.
47     const int primitiveID;              //!< Geometry shader output
48     const int numFragmentOutputs;       //!< Fragment output count
49     const int numSamples;               //!< Number of samples
50     float *
51         fragmentDepths; //!< Fragment packet depths. Pointer will be NULL if there is no depth buffer. Each sample has per-sample depth values
52     FaceType visibleFace; //!< Which face (front or back) is visible
53 };
54 
55 // Write output
56 
57 template <typename T>
writeFragmentOutput(const FragmentShadingContext & context,int packetNdx,int fragNdx,int outputNdx,const T & value)58 void writeFragmentOutput(const FragmentShadingContext &context, int packetNdx, int fragNdx, int outputNdx,
59                          const T &value)
60 {
61     DE_ASSERT(packetNdx >= 0);
62     DE_ASSERT(fragNdx >= 0 && fragNdx < 4);
63     DE_ASSERT(outputNdx >= 0 && outputNdx < context.numFragmentOutputs);
64 
65     context.outputArray[outputNdx + context.numFragmentOutputs * (fragNdx + packetNdx * 4)] = value;
66 }
67 
68 template <typename T>
writeFragmentOutputDualSource(const FragmentShadingContext & context,int packetNdx,int fragNdx,int outputNdx,const T & value,const T & value1)69 void writeFragmentOutputDualSource(const FragmentShadingContext &context, int packetNdx, int fragNdx, int outputNdx,
70                                    const T &value, const T &value1)
71 {
72     DE_ASSERT(packetNdx >= 0);
73     DE_ASSERT(fragNdx >= 0 && fragNdx < 4);
74     DE_ASSERT(outputNdx >= 0 && outputNdx < context.numFragmentOutputs);
75 
76     context.outputArray[outputNdx + context.numFragmentOutputs * (fragNdx + packetNdx * 4)]     = value;
77     context.outputArraySrc1[outputNdx + context.numFragmentOutputs * (fragNdx + packetNdx * 4)] = value1;
78 }
79 
80 // Read Varying
81 
82 template <typename T>
readPointVarying(const FragmentPacket & packet,const FragmentShadingContext & context,int varyingLoc,int fragNdx)83 tcu::Vector<T, 4> readPointVarying(const FragmentPacket &packet, const FragmentShadingContext &context, int varyingLoc,
84                                    int fragNdx)
85 {
86     DE_UNREF(fragNdx);
87     DE_UNREF(packet);
88 
89     return context.varyings[0][varyingLoc].get<T>();
90 }
91 
92 template <typename T>
readLineVarying(const FragmentPacket & packet,const FragmentShadingContext & context,int varyingLoc,int fragNdx)93 tcu::Vector<T, 4> readLineVarying(const FragmentPacket &packet, const FragmentShadingContext &context, int varyingLoc,
94                                   int fragNdx)
95 {
96     return packet.barycentric[0][fragNdx] * context.varyings[0][varyingLoc].get<T>() +
97            packet.barycentric[1][fragNdx] * context.varyings[1][varyingLoc].get<T>();
98 }
99 
100 template <typename T>
readTriangleVarying(const FragmentPacket & packet,const FragmentShadingContext & context,int varyingLoc,int fragNdx)101 tcu::Vector<T, 4> readTriangleVarying(const FragmentPacket &packet, const FragmentShadingContext &context,
102                                       int varyingLoc, int fragNdx)
103 {
104     return packet.barycentric[0][fragNdx] * context.varyings[0][varyingLoc].get<T>() +
105            packet.barycentric[1][fragNdx] * context.varyings[1][varyingLoc].get<T>() +
106            packet.barycentric[2][fragNdx] * context.varyings[2][varyingLoc].get<T>();
107 }
108 
109 template <typename T>
readVarying(const FragmentPacket & packet,const FragmentShadingContext & context,int varyingLoc,int fragNdx)110 tcu::Vector<T, 4> readVarying(const FragmentPacket &packet, const FragmentShadingContext &context, int varyingLoc,
111                               int fragNdx)
112 {
113     if (context.varyings[1] == DE_NULL)
114         return readPointVarying<T>(packet, context, varyingLoc, fragNdx);
115     if (context.varyings[2] == DE_NULL)
116         return readLineVarying<T>(packet, context, varyingLoc, fragNdx);
117     return readTriangleVarying<T>(packet, context, varyingLoc, fragNdx);
118 }
119 
120 // Derivative
121 
122 template <typename T, int Size>
dFdxLocal(tcu::Vector<T,Size> outFragmentdFdx[4],const tcu::Vector<T,Size> func[4])123 void dFdxLocal(tcu::Vector<T, Size> outFragmentdFdx[4], const tcu::Vector<T, Size> func[4])
124 {
125     const tcu::Vector<T, Size> dFdx[2] = {func[1] - func[0], func[3] - func[2]};
126 
127     outFragmentdFdx[0] = dFdx[0];
128     outFragmentdFdx[1] = dFdx[0];
129     outFragmentdFdx[2] = dFdx[1];
130     outFragmentdFdx[3] = dFdx[1];
131 }
132 
133 template <typename T, int Size>
dFdyLocal(tcu::Vector<T,Size> outFragmentdFdy[4],const tcu::Vector<T,Size> func[4])134 void dFdyLocal(tcu::Vector<T, Size> outFragmentdFdy[4], const tcu::Vector<T, Size> func[4])
135 {
136     const tcu::Vector<T, Size> dFdy[2] = {func[2] - func[0], func[3] - func[1]};
137 
138     outFragmentdFdy[0] = dFdy[0];
139     outFragmentdFdy[1] = dFdy[1];
140     outFragmentdFdy[2] = dFdy[0];
141     outFragmentdFdy[3] = dFdy[1];
142 }
143 
144 template <typename T>
dFdxVarying(tcu::Vector<T,4> outFragmentdFdx[4],const FragmentPacket & packet,const FragmentShadingContext & context,int varyingLoc)145 inline void dFdxVarying(tcu::Vector<T, 4> outFragmentdFdx[4], const FragmentPacket &packet,
146                         const FragmentShadingContext &context, int varyingLoc)
147 {
148     const tcu::Vector<T, 4> func[4] = {
149         readVarying<T>(packet, context, varyingLoc, 0),
150         readVarying<T>(packet, context, varyingLoc, 1),
151         readVarying<T>(packet, context, varyingLoc, 2),
152         readVarying<T>(packet, context, varyingLoc, 3),
153     };
154 
155     dFdxLocal(outFragmentdFdx, func);
156 }
157 
158 template <typename T>
dFdyVarying(tcu::Vector<T,4> outFragmentdFdy[4],const FragmentPacket & packet,const FragmentShadingContext & context,int varyingLoc)159 inline void dFdyVarying(tcu::Vector<T, 4> outFragmentdFdy[4], const FragmentPacket &packet,
160                         const FragmentShadingContext &context, int varyingLoc)
161 {
162     const tcu::Vector<T, 4> func[4] = {
163         readVarying<T>(packet, context, varyingLoc, 0),
164         readVarying<T>(packet, context, varyingLoc, 1),
165         readVarying<T>(packet, context, varyingLoc, 2),
166         readVarying<T>(packet, context, varyingLoc, 3),
167     };
168 
169     dFdyLocal(outFragmentdFdy, func);
170 }
171 
172 // Fragent depth
173 
readFragmentDepth(const FragmentShadingContext & context,int packetNdx,int fragNdx,int sampleNdx)174 inline float readFragmentDepth(const FragmentShadingContext &context, int packetNdx, int fragNdx, int sampleNdx)
175 {
176     // Reading or writing to fragment depth values while there is no depth buffer is legal but not supported by rr
177     DE_ASSERT(context.fragmentDepths);
178     return context.fragmentDepths[(packetNdx * 4 + fragNdx) * context.numSamples + sampleNdx];
179 }
180 
writeFragmentDepth(const FragmentShadingContext & context,int packetNdx,int fragNdx,int sampleNdx,float depthValue)181 inline void writeFragmentDepth(const FragmentShadingContext &context, int packetNdx, int fragNdx, int sampleNdx,
182                                float depthValue)
183 {
184     // Reading or writing to fragment depth values while there is no depth buffer is legal but not supported by rr
185     DE_ASSERT(context.fragmentDepths);
186     context.fragmentDepths[(packetNdx * 4 + fragNdx) * context.numSamples + sampleNdx] = depthValue;
187 }
188 
189 } // namespace rr
190 
191 #endif // _RRSHADINGCONTEXT_HPP
192