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