xref: /aosp_15_r20/external/deqp/framework/referencerenderer/rrRasterizer.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _RRRASTERIZER_HPP
2*35238bceSAndroid Build Coastguard Worker #define _RRRASTERIZER_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 Reference rasterizer
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "rrDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "rrRenderState.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "rrFragmentPacket.hpp"
30*35238bceSAndroid Build Coastguard Worker 
31*35238bceSAndroid Build Coastguard Worker namespace rr
32*35238bceSAndroid Build Coastguard Worker {
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker //! Rasterizer configuration
35*35238bceSAndroid Build Coastguard Worker enum
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker     RASTERIZER_MAX_SAMPLES_PER_FRAGMENT = 16
38*35238bceSAndroid Build Coastguard Worker };
39*35238bceSAndroid Build Coastguard Worker 
40*35238bceSAndroid Build Coastguard Worker //! Get coverage bit value.
getCoverageBit(int numSamples,int x,int y,int sampleNdx)41*35238bceSAndroid Build Coastguard Worker inline uint64_t getCoverageBit(int numSamples, int x, int y, int sampleNdx)
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker     const int numBits    = (int)sizeof(uint64_t) * 8;
44*35238bceSAndroid Build Coastguard Worker     const int maxSamples = numBits / 4;
45*35238bceSAndroid Build Coastguard Worker     DE_STATIC_ASSERT(maxSamples >= RASTERIZER_MAX_SAMPLES_PER_FRAGMENT);
46*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inRange(numSamples, 1, maxSamples) && de::inBounds(x, 0, 2) && de::inBounds(y, 0, 2));
47*35238bceSAndroid Build Coastguard Worker     return 1ull << ((x * 2 + y) * numSamples + sampleNdx);
48*35238bceSAndroid Build Coastguard Worker }
49*35238bceSAndroid Build Coastguard Worker 
50*35238bceSAndroid Build Coastguard Worker //! Get all sample bits for fragment
getCoverageFragmentSampleBits(int numSamples,int x,int y)51*35238bceSAndroid Build Coastguard Worker inline uint64_t getCoverageFragmentSampleBits(int numSamples, int x, int y)
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(de::inBounds(x, 0, 2) && de::inBounds(y, 0, 2));
54*35238bceSAndroid Build Coastguard Worker     const uint64_t fragMask = (1ull << numSamples) - 1;
55*35238bceSAndroid Build Coastguard Worker     return fragMask << (x * 2 + y) * numSamples;
56*35238bceSAndroid Build Coastguard Worker }
57*35238bceSAndroid Build Coastguard Worker 
58*35238bceSAndroid Build Coastguard Worker //! Set bit in coverage mask.
setCoverageValue(uint64_t mask,int numSamples,int x,int y,int sampleNdx,bool val)59*35238bceSAndroid Build Coastguard Worker inline uint64_t setCoverageValue(uint64_t mask, int numSamples, int x, int y, int sampleNdx, bool val)
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker     const uint64_t bit = getCoverageBit(numSamples, x, y, sampleNdx);
62*35238bceSAndroid Build Coastguard Worker     return val ? (mask | bit) : (mask & ~bit);
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker 
65*35238bceSAndroid Build Coastguard Worker //! Get coverage bit value in mask.
getCoverageValue(uint64_t mask,int numSamples,int x,int y,int sampleNdx)66*35238bceSAndroid Build Coastguard Worker inline bool getCoverageValue(uint64_t mask, int numSamples, int x, int y, int sampleNdx)
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker     return (mask & getCoverageBit(numSamples, x, y, sampleNdx)) != 0;
69*35238bceSAndroid Build Coastguard Worker }
70*35238bceSAndroid Build Coastguard Worker 
71*35238bceSAndroid Build Coastguard Worker //! Test if any sample for fragment is live
getCoverageAnyFragmentSampleLive(uint64_t mask,int numSamples,int x,int y)72*35238bceSAndroid Build Coastguard Worker inline bool getCoverageAnyFragmentSampleLive(uint64_t mask, int numSamples, int x, int y)
73*35238bceSAndroid Build Coastguard Worker {
74*35238bceSAndroid Build Coastguard Worker     return (mask & getCoverageFragmentSampleBits(numSamples, x, y)) != 0;
75*35238bceSAndroid Build Coastguard Worker }
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker //! Get position of first coverage bit of fragment - equivalent to deClz64(getCoverageFragmentSampleBits(numSamples, x, y)).
getCoverageOffset(int numSamples,int x,int y)78*35238bceSAndroid Build Coastguard Worker inline int getCoverageOffset(int numSamples, int x, int y)
79*35238bceSAndroid Build Coastguard Worker {
80*35238bceSAndroid Build Coastguard Worker     return (x * 2 + y) * numSamples;
81*35238bceSAndroid Build Coastguard Worker }
82*35238bceSAndroid Build Coastguard Worker 
83*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
84*35238bceSAndroid Build Coastguard Worker  * \brief Edge function
85*35238bceSAndroid Build Coastguard Worker  *
86*35238bceSAndroid Build Coastguard Worker  * Edge function can be evaluated for point P (in fixed-point coordinates
87*35238bceSAndroid Build Coastguard Worker  * with SUBPIXEL_BITS fractional part) by computing
88*35238bceSAndroid Build Coastguard Worker  *  D = a*Px + b*Py + c
89*35238bceSAndroid Build Coastguard Worker  *
90*35238bceSAndroid Build Coastguard Worker  * D will be fixed-point value where lower (SUBPIXEL_BITS*2) bits will
91*35238bceSAndroid Build Coastguard Worker  * be fractional part.
92*35238bceSAndroid Build Coastguard Worker  *
93*35238bceSAndroid Build Coastguard Worker  * a and b are stored with SUBPIXEL_BITS fractional part, while c is stored
94*35238bceSAndroid Build Coastguard Worker  * with SUBPIXEL_BITS*2 fractional bits.
95*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
96*35238bceSAndroid Build Coastguard Worker struct EdgeFunction
97*35238bceSAndroid Build Coastguard Worker {
EdgeFunctionrr::EdgeFunction98*35238bceSAndroid Build Coastguard Worker     inline EdgeFunction(void) : a(0), b(0), c(0), inclusive(false)
99*35238bceSAndroid Build Coastguard Worker     {
100*35238bceSAndroid Build Coastguard Worker     }
101*35238bceSAndroid Build Coastguard Worker 
102*35238bceSAndroid Build Coastguard Worker     int64_t a;
103*35238bceSAndroid Build Coastguard Worker     int64_t b;
104*35238bceSAndroid Build Coastguard Worker     int64_t c;
105*35238bceSAndroid Build Coastguard Worker     bool inclusive; //!< True if edge is inclusive according to fill rules.
106*35238bceSAndroid Build Coastguard Worker };
107*35238bceSAndroid Build Coastguard Worker 
108*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
109*35238bceSAndroid Build Coastguard Worker  * \brief Triangle rasterizer
110*35238bceSAndroid Build Coastguard Worker  *
111*35238bceSAndroid Build Coastguard Worker  * Triangle rasterizer implements following features:
112*35238bceSAndroid Build Coastguard Worker  *  - Rasterization using fixed-point coordinates
113*35238bceSAndroid Build Coastguard Worker  *  - 1, 4, and 16 -sample rasterization
114*35238bceSAndroid Build Coastguard Worker  *  - Depth interpolation
115*35238bceSAndroid Build Coastguard Worker  *  - Perspective-correct barycentric computation for interpolation
116*35238bceSAndroid Build Coastguard Worker  *  - Visible face determination
117*35238bceSAndroid Build Coastguard Worker  *
118*35238bceSAndroid Build Coastguard Worker  * It does not (and will not) implement following:
119*35238bceSAndroid Build Coastguard Worker  *  - Triangle setup
120*35238bceSAndroid Build Coastguard Worker  *  - Clipping
121*35238bceSAndroid Build Coastguard Worker  *  - Degenerate elimination
122*35238bceSAndroid Build Coastguard Worker  *  - Coordinate transformation (inputs are in screen-space)
123*35238bceSAndroid Build Coastguard Worker  *  - Culling - logic can be implemented outside by querying visible face
124*35238bceSAndroid Build Coastguard Worker  *  - Scissoring (this can be done by controlling viewport rectangle)
125*35238bceSAndroid Build Coastguard Worker  *  - Any per-fragment operations
126*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
127*35238bceSAndroid Build Coastguard Worker class TriangleRasterizer
128*35238bceSAndroid Build Coastguard Worker {
129*35238bceSAndroid Build Coastguard Worker public:
130*35238bceSAndroid Build Coastguard Worker     TriangleRasterizer(const tcu::IVec4 &viewport, const int numSamples, const RasterizationState &state,
131*35238bceSAndroid Build Coastguard Worker                        const int suppixelBits);
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker     void init(const tcu::Vec4 &v0, const tcu::Vec4 &v1, const tcu::Vec4 &v2);
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker     // Following functions are only available after init()
getVisibleFace(void) const136*35238bceSAndroid Build Coastguard Worker     FaceType getVisibleFace(void) const
137*35238bceSAndroid Build Coastguard Worker     {
138*35238bceSAndroid Build Coastguard Worker         return m_face;
139*35238bceSAndroid Build Coastguard Worker     }
140*35238bceSAndroid Build Coastguard Worker     void rasterize(FragmentPacket *const fragmentPackets, float *const depthValues, const int maxFragmentPackets,
141*35238bceSAndroid Build Coastguard Worker                    int &numPacketsRasterized);
142*35238bceSAndroid Build Coastguard Worker 
143*35238bceSAndroid Build Coastguard Worker private:
144*35238bceSAndroid Build Coastguard Worker     void rasterizeSingleSample(FragmentPacket *const fragmentPackets, float *const depthValues,
145*35238bceSAndroid Build Coastguard Worker                                const int maxFragmentPackets, int &numPacketsRasterized);
146*35238bceSAndroid Build Coastguard Worker 
147*35238bceSAndroid Build Coastguard Worker     template <int NumSamples>
148*35238bceSAndroid Build Coastguard Worker     void rasterizeMultiSample(FragmentPacket *const fragmentPackets, float *const depthValues,
149*35238bceSAndroid Build Coastguard Worker                               const int maxFragmentPackets, int &numPacketsRasterized);
150*35238bceSAndroid Build Coastguard Worker 
151*35238bceSAndroid Build Coastguard Worker     // Constant rasterization state.
152*35238bceSAndroid Build Coastguard Worker     const tcu::IVec4 m_viewport;
153*35238bceSAndroid Build Coastguard Worker     const int m_numSamples;
154*35238bceSAndroid Build Coastguard Worker     const Winding m_winding;
155*35238bceSAndroid Build Coastguard Worker     const HorizontalFill m_horizontalFill;
156*35238bceSAndroid Build Coastguard Worker     const VerticalFill m_verticalFill;
157*35238bceSAndroid Build Coastguard Worker     const int m_subpixelBits;
158*35238bceSAndroid Build Coastguard Worker 
159*35238bceSAndroid Build Coastguard Worker     // Per-triangle rasterization state.
160*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 m_v0;
161*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 m_v1;
162*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 m_v2;
163*35238bceSAndroid Build Coastguard Worker     EdgeFunction m_edge01;
164*35238bceSAndroid Build Coastguard Worker     EdgeFunction m_edge12;
165*35238bceSAndroid Build Coastguard Worker     EdgeFunction m_edge20;
166*35238bceSAndroid Build Coastguard Worker     FaceType m_face;                           //!< Triangle orientation, eg. visible face.
167*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 m_bboxMin;                      //!< Bounding box min (inclusive).
168*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 m_bboxMax;                      //!< Bounding box max (inclusive).
169*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 m_curPos;                       //!< Current rasterization position.
170*35238bceSAndroid Build Coastguard Worker     ViewportOrientation m_viewportOrientation; //!< Direction of +x+y axis
171*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE;
172*35238bceSAndroid Build Coastguard Worker 
173*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
174*35238bceSAndroid Build Coastguard Worker  * \brief Single sample line rasterizer
175*35238bceSAndroid Build Coastguard Worker  *
176*35238bceSAndroid Build Coastguard Worker  * Line rasterizer implements following features:
177*35238bceSAndroid Build Coastguard Worker  *  - Rasterization using fixed-point coordinates
178*35238bceSAndroid Build Coastguard Worker  *  - Depth interpolation
179*35238bceSAndroid Build Coastguard Worker  *  - Perspective-correct interpolation
180*35238bceSAndroid Build Coastguard Worker  *
181*35238bceSAndroid Build Coastguard Worker  * It does not (and will not) implement following:
182*35238bceSAndroid Build Coastguard Worker  *  - Clipping
183*35238bceSAndroid Build Coastguard Worker  *  - Multisampled line rasterization
184*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
185*35238bceSAndroid Build Coastguard Worker class SingleSampleLineRasterizer
186*35238bceSAndroid Build Coastguard Worker {
187*35238bceSAndroid Build Coastguard Worker public:
188*35238bceSAndroid Build Coastguard Worker     SingleSampleLineRasterizer(const tcu::IVec4 &viewport, const int subpixelBits);
189*35238bceSAndroid Build Coastguard Worker     ~SingleSampleLineRasterizer(void);
190*35238bceSAndroid Build Coastguard Worker 
191*35238bceSAndroid Build Coastguard Worker     void init(const tcu::Vec4 &v0, const tcu::Vec4 &v1, float lineWidth, uint32_t stippleFactor,
192*35238bceSAndroid Build Coastguard Worker               uint16_t stipplePattern);
193*35238bceSAndroid Build Coastguard Worker 
194*35238bceSAndroid Build Coastguard Worker     // only available after init()
195*35238bceSAndroid Build Coastguard Worker     void rasterize(FragmentPacket *const fragmentPackets, float *const depthValues, const int maxFragmentPackets,
196*35238bceSAndroid Build Coastguard Worker                    int &numPacketsRasterized);
197*35238bceSAndroid Build Coastguard Worker 
resetStipple()198*35238bceSAndroid Build Coastguard Worker     void resetStipple()
199*35238bceSAndroid Build Coastguard Worker     {
200*35238bceSAndroid Build Coastguard Worker         m_stippleCounter = 0;
201*35238bceSAndroid Build Coastguard Worker     }
202*35238bceSAndroid Build Coastguard Worker 
203*35238bceSAndroid Build Coastguard Worker private:
204*35238bceSAndroid Build Coastguard Worker     SingleSampleLineRasterizer(const SingleSampleLineRasterizer &);            // not allowed
205*35238bceSAndroid Build Coastguard Worker     SingleSampleLineRasterizer &operator=(const SingleSampleLineRasterizer &); // not allowed
206*35238bceSAndroid Build Coastguard Worker 
207*35238bceSAndroid Build Coastguard Worker     // Constant rasterization state.
208*35238bceSAndroid Build Coastguard Worker     const tcu::IVec4 m_viewport;
209*35238bceSAndroid Build Coastguard Worker     const int m_subpixelBits;
210*35238bceSAndroid Build Coastguard Worker 
211*35238bceSAndroid Build Coastguard Worker     // Per-line rasterization state.
212*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 m_v0;
213*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 m_v1;
214*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 m_bboxMin;     //!< Bounding box min (inclusive).
215*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 m_bboxMax;     //!< Bounding box max (inclusive).
216*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 m_curPos;      //!< Current rasterization position.
217*35238bceSAndroid Build Coastguard Worker     int32_t m_curRowFragment; //!< Current rasterization position of one fragment in column of lineWidth fragments
218*35238bceSAndroid Build Coastguard Worker     float m_lineWidth;
219*35238bceSAndroid Build Coastguard Worker     uint32_t m_stippleFactor;
220*35238bceSAndroid Build Coastguard Worker     uint16_t m_stipplePattern;
221*35238bceSAndroid Build Coastguard Worker     uint32_t m_stippleCounter;
222*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE;
223*35238bceSAndroid Build Coastguard Worker 
224*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
225*35238bceSAndroid Build Coastguard Worker  * \brief Multisampled line rasterizer
226*35238bceSAndroid Build Coastguard Worker  *
227*35238bceSAndroid Build Coastguard Worker  * Line rasterizer implements following features:
228*35238bceSAndroid Build Coastguard Worker  *  - Rasterization using fixed-point coordinates
229*35238bceSAndroid Build Coastguard Worker  *  - Depth interpolation
230*35238bceSAndroid Build Coastguard Worker  *  - Perspective-correct interpolation
231*35238bceSAndroid Build Coastguard Worker  *
232*35238bceSAndroid Build Coastguard Worker  * It does not (and will not) implement following:
233*35238bceSAndroid Build Coastguard Worker  *  - Clipping
234*35238bceSAndroid Build Coastguard Worker  *  - Aliased line rasterization
235*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
236*35238bceSAndroid Build Coastguard Worker class MultiSampleLineRasterizer
237*35238bceSAndroid Build Coastguard Worker {
238*35238bceSAndroid Build Coastguard Worker public:
239*35238bceSAndroid Build Coastguard Worker     MultiSampleLineRasterizer(const int numSamples, const tcu::IVec4 &viewport, const int subpixelBits);
240*35238bceSAndroid Build Coastguard Worker     ~MultiSampleLineRasterizer();
241*35238bceSAndroid Build Coastguard Worker 
242*35238bceSAndroid Build Coastguard Worker     void init(const tcu::Vec4 &v0, const tcu::Vec4 &v1, float lineWidth);
243*35238bceSAndroid Build Coastguard Worker 
244*35238bceSAndroid Build Coastguard Worker     // only available after init()
245*35238bceSAndroid Build Coastguard Worker     void rasterize(FragmentPacket *const fragmentPackets, float *const depthValues, const int maxFragmentPackets,
246*35238bceSAndroid Build Coastguard Worker                    int &numPacketsRasterized);
247*35238bceSAndroid Build Coastguard Worker 
248*35238bceSAndroid Build Coastguard Worker private:
249*35238bceSAndroid Build Coastguard Worker     MultiSampleLineRasterizer(const MultiSampleLineRasterizer &);            // not allowed
250*35238bceSAndroid Build Coastguard Worker     MultiSampleLineRasterizer &operator=(const MultiSampleLineRasterizer &); // not allowed
251*35238bceSAndroid Build Coastguard Worker 
252*35238bceSAndroid Build Coastguard Worker     // Constant rasterization state.
253*35238bceSAndroid Build Coastguard Worker     const int m_numSamples;
254*35238bceSAndroid Build Coastguard Worker 
255*35238bceSAndroid Build Coastguard Worker     // Per-line rasterization state.
256*35238bceSAndroid Build Coastguard Worker     TriangleRasterizer
257*35238bceSAndroid Build Coastguard Worker         m_triangleRasterizer0; //!< not in array because we want to initialize these in the initialization list
258*35238bceSAndroid Build Coastguard Worker     TriangleRasterizer m_triangleRasterizer1;
259*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE;
260*35238bceSAndroid Build Coastguard Worker 
261*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
262*35238bceSAndroid Build Coastguard Worker  * \brief Pixel diamond
263*35238bceSAndroid Build Coastguard Worker  *
264*35238bceSAndroid Build Coastguard Worker  * Structure representing a diamond a line exits.
265*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
266*35238bceSAndroid Build Coastguard Worker struct LineExitDiamond
267*35238bceSAndroid Build Coastguard Worker {
268*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 position;
269*35238bceSAndroid Build Coastguard Worker };
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
272*35238bceSAndroid Build Coastguard Worker  * \brief Line exit diamond generator
273*35238bceSAndroid Build Coastguard Worker  *
274*35238bceSAndroid Build Coastguard Worker  * For a given line, generates list of diamonds the line exits using the
275*35238bceSAndroid Build Coastguard Worker  * line-exit rules of the line rasterization. Does not do scissoring.
276*35238bceSAndroid Build Coastguard Worker  *
277*35238bceSAndroid Build Coastguard Worker  * \note Not used by rr, but provided to prevent test cases requiring
278*35238bceSAndroid Build Coastguard Worker  *       accurate diamonds from abusing SingleSampleLineRasterizer.
279*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
280*35238bceSAndroid Build Coastguard Worker class LineExitDiamondGenerator
281*35238bceSAndroid Build Coastguard Worker {
282*35238bceSAndroid Build Coastguard Worker public:
283*35238bceSAndroid Build Coastguard Worker     LineExitDiamondGenerator(const int subpixelBits);
284*35238bceSAndroid Build Coastguard Worker     ~LineExitDiamondGenerator(void);
285*35238bceSAndroid Build Coastguard Worker 
286*35238bceSAndroid Build Coastguard Worker     void init(const tcu::Vec4 &v0, const tcu::Vec4 &v1);
287*35238bceSAndroid Build Coastguard Worker 
288*35238bceSAndroid Build Coastguard Worker     // only available after init()
289*35238bceSAndroid Build Coastguard Worker     void rasterize(LineExitDiamond *const lineDiamonds, const int maxDiamonds, int &numWritten);
290*35238bceSAndroid Build Coastguard Worker 
291*35238bceSAndroid Build Coastguard Worker private:
292*35238bceSAndroid Build Coastguard Worker     LineExitDiamondGenerator(const LineExitDiamondGenerator &);            // not allowed
293*35238bceSAndroid Build Coastguard Worker     LineExitDiamondGenerator &operator=(const LineExitDiamondGenerator &); // not allowed
294*35238bceSAndroid Build Coastguard Worker 
295*35238bceSAndroid Build Coastguard Worker     const int m_subpixelBits;
296*35238bceSAndroid Build Coastguard Worker 
297*35238bceSAndroid Build Coastguard Worker     // Per-line rasterization state.
298*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 m_v0;
299*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 m_v1;
300*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 m_bboxMin; //!< Bounding box min (inclusive).
301*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 m_bboxMax; //!< Bounding box max (inclusive).
302*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 m_curPos;  //!< Current rasterization position.
303*35238bceSAndroid Build Coastguard Worker };
304*35238bceSAndroid Build Coastguard Worker 
305*35238bceSAndroid Build Coastguard Worker } // namespace rr
306*35238bceSAndroid Build Coastguard Worker 
307*35238bceSAndroid Build Coastguard Worker #endif // _RRRASTERIZER_HPP
308