liyujie
2025-08-28 786ff4f4ca2374bdd9177f2e24b503d43e7a3b93
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#ifndef _GLSFRAGMENTOPUTIL_HPP
#define _GLSFRAGMENTOPUTIL_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program OpenGL (ES) Module
 * -----------------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Fragment operation test utilities.
 *//*--------------------------------------------------------------------*/
 
#include "tcuDefs.hpp"
#include "gluShaderUtil.hpp"
#include "tcuVector.hpp"
#include "tcuTexture.hpp"
#include "rrFragmentOperations.hpp"
 
namespace glu
{
class ShaderProgram;
class RenderContext;
}
 
namespace deqp
{
namespace gls
{
namespace FragmentOpUtil
{
 
struct Quad
{
   tcu::Vec2        posA;
   tcu::Vec2        posB;
 
   // Normalized device coordinates (range [-1, 1]).
   // In order (A.x, A.y), (A.x, B.y), (B.x, A.y), (B.x, B.y)
   tcu::Vec4        color[4];
   tcu::Vec4        color1[4];
   float            depth[4];
 
   Quad (void)
       : posA(-1.0f, -1.0f)
       , posB( 1.0f,  1.0f)
   {
       for (int i = 0; i < DE_LENGTH_OF_ARRAY(depth); i++)
           depth[i] = 0.0f;
   }
};
 
class QuadRenderer
{
public:
                               QuadRenderer                (const glu::RenderContext& context, glu::GLSLVersion glslVersion);
                               ~QuadRenderer                (void);
 
   void                        render                        (const Quad& quad) const;
 
private:
                               QuadRenderer                (const QuadRenderer& other); // Not allowed!
   QuadRenderer&                operator=                    (const QuadRenderer& other); // Not allowed!
 
   const glu::RenderContext&    m_context;
   glu::ShaderProgram*            m_program;
   int                            m_positionLoc;
   int                            m_colorLoc;
   int                            m_color1Loc;
   const bool                    m_blendFuncExt;
};
 
struct IntegerQuad
{
   tcu::IVec2    posA;
   tcu::IVec2    posB;
 
   // Viewport coordinates (depth in range [0, 1]).
   // In order (A.x, A.y), (A.x, B.y), (B.x, A.y), (B.x, B.y)
   tcu::Vec4    color[4];
   tcu::Vec4    color1[4];
   float        depth[4];
 
   IntegerQuad (int windowWidth, int windowHeight)
       : posA(0,                0)
       , posB(windowWidth-1,    windowHeight-1)
   {
       for (int i = 0; i < DE_LENGTH_OF_ARRAY(depth); i++)
           depth[i] = 0.0f;
   }
 
   IntegerQuad (void)
       : posA(0, 0)
       , posB(1, 1)
   {
       for (int i = 0; i < DE_LENGTH_OF_ARRAY(depth); i++)
           depth[i] = 0.0f;
   }
};
 
class ReferenceQuadRenderer
{
public:
                               ReferenceQuadRenderer    (void);
 
   void                        render                    (const tcu::PixelBufferAccess&            colorBuffer,
                                                        const tcu::PixelBufferAccess&            depthBuffer,
                                                        const tcu::PixelBufferAccess&            stencilBuffer,
                                                        const IntegerQuad&                        quad,
                                                        const rr::FragmentOperationState&        state);
 
private:
   enum
   {
       MAX_FRAGMENT_BUFFER_SIZE = 1024
   };
 
   void                        flushFragmentBuffer (const rr::MultisamplePixelBufferAccess&    colorBuffer,
                                                    const rr::MultisamplePixelBufferAccess&    depthBuffer,
                                                    const rr::MultisamplePixelBufferAccess&    stencilBuffer,
                                                    rr::FaceType                                faceType,
                                                    const rr::FragmentOperationState&            state);
 
   rr::Fragment                m_fragmentBuffer[MAX_FRAGMENT_BUFFER_SIZE];
   float                        m_fragmentDepths[MAX_FRAGMENT_BUFFER_SIZE];
   int                            m_fragmentBufferSize;
 
   rr::FragmentProcessor        m_fragmentProcessor;
};
 
 
// These functions take a normally-indexed 2d pixel buffer and return a pixel buffer access
// that indexes the same memory area, but using the multisample indexing convention.
tcu::PixelBufferAccess                    getMultisampleAccess(const tcu::PixelBufferAccess&            original);
tcu::ConstPixelBufferAccess                getMultisampleAccess(const tcu::ConstPixelBufferAccess&    original);
 
} // FragmentOpUtil
} // gls
} // deqp
 
#endif // _GLSFRAGMENTOPUTIL_HPP