xref: /aosp_15_r20/external/deqp/framework/referencerenderer/rrMultisamplePixelBufferAccess.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program Reference Renderer
3*35238bceSAndroid Build Coastguard Worker  * -----------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Multisampled pixel buffer access
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "rrMultisamplePixelBufferAccess.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
26*35238bceSAndroid Build Coastguard Worker 
27*35238bceSAndroid Build Coastguard Worker namespace rr
28*35238bceSAndroid Build Coastguard Worker {
29*35238bceSAndroid Build Coastguard Worker 
MultisamplePixelBufferAccess(const tcu::PixelBufferAccess & rawAccess)30*35238bceSAndroid Build Coastguard Worker MultisamplePixelBufferAccess::MultisamplePixelBufferAccess(const tcu::PixelBufferAccess &rawAccess)
31*35238bceSAndroid Build Coastguard Worker     : m_access(rawAccess)
32*35238bceSAndroid Build Coastguard Worker {
33*35238bceSAndroid Build Coastguard Worker }
34*35238bceSAndroid Build Coastguard Worker 
MultisamplePixelBufferAccess(void)35*35238bceSAndroid Build Coastguard Worker MultisamplePixelBufferAccess::MultisamplePixelBufferAccess(void) : m_access(tcu::PixelBufferAccess())
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker }
38*35238bceSAndroid Build Coastguard Worker 
toSinglesampleAccess(void) const39*35238bceSAndroid Build Coastguard Worker const tcu::PixelBufferAccess MultisamplePixelBufferAccess::toSinglesampleAccess(void) const
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(getNumSamples() == 1);
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker     return tcu::PixelBufferAccess(
44*35238bceSAndroid Build Coastguard Worker         m_access.getFormat(), tcu::IVec3(m_access.getHeight(), m_access.getDepth(), 1),
45*35238bceSAndroid Build Coastguard Worker         tcu::IVec3(m_access.getRowPitch(), m_access.getSlicePitch(), m_access.getSlicePitch() * m_access.getDepth()),
46*35238bceSAndroid Build Coastguard Worker         m_access.getDataPtr());
47*35238bceSAndroid Build Coastguard Worker }
48*35238bceSAndroid Build Coastguard Worker 
fromSinglesampleAccess(const tcu::PixelBufferAccess & original)49*35238bceSAndroid Build Coastguard Worker MultisamplePixelBufferAccess MultisamplePixelBufferAccess::fromSinglesampleAccess(
50*35238bceSAndroid Build Coastguard Worker     const tcu::PixelBufferAccess &original)
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker     return MultisamplePixelBufferAccess(tcu::PixelBufferAccess(
53*35238bceSAndroid Build Coastguard Worker         original.getFormat(), tcu::IVec3(1, original.getWidth(), original.getHeight()),
54*35238bceSAndroid Build Coastguard Worker         tcu::IVec3(original.getPixelPitch(), original.getPixelPitch(), original.getRowPitch()), original.getDataPtr()));
55*35238bceSAndroid Build Coastguard Worker }
56*35238bceSAndroid Build Coastguard Worker 
fromMultisampleAccess(const tcu::PixelBufferAccess & multisampledAccess)57*35238bceSAndroid Build Coastguard Worker MultisamplePixelBufferAccess MultisamplePixelBufferAccess::fromMultisampleAccess(
58*35238bceSAndroid Build Coastguard Worker     const tcu::PixelBufferAccess &multisampledAccess)
59*35238bceSAndroid Build Coastguard Worker {
60*35238bceSAndroid Build Coastguard Worker     return MultisamplePixelBufferAccess(multisampledAccess);
61*35238bceSAndroid Build Coastguard Worker }
62*35238bceSAndroid Build Coastguard Worker 
MultisampleConstPixelBufferAccess(void)63*35238bceSAndroid Build Coastguard Worker MultisampleConstPixelBufferAccess::MultisampleConstPixelBufferAccess(void) : m_access(tcu::ConstPixelBufferAccess())
64*35238bceSAndroid Build Coastguard Worker {
65*35238bceSAndroid Build Coastguard Worker }
66*35238bceSAndroid Build Coastguard Worker 
MultisampleConstPixelBufferAccess(const tcu::ConstPixelBufferAccess & rawAccess)67*35238bceSAndroid Build Coastguard Worker MultisampleConstPixelBufferAccess::MultisampleConstPixelBufferAccess(const tcu::ConstPixelBufferAccess &rawAccess)
68*35238bceSAndroid Build Coastguard Worker     : m_access(rawAccess)
69*35238bceSAndroid Build Coastguard Worker {
70*35238bceSAndroid Build Coastguard Worker }
71*35238bceSAndroid Build Coastguard Worker 
MultisampleConstPixelBufferAccess(const rr::MultisamplePixelBufferAccess & msAccess)72*35238bceSAndroid Build Coastguard Worker MultisampleConstPixelBufferAccess::MultisampleConstPixelBufferAccess(const rr::MultisamplePixelBufferAccess &msAccess)
73*35238bceSAndroid Build Coastguard Worker     : m_access(msAccess.raw())
74*35238bceSAndroid Build Coastguard Worker {
75*35238bceSAndroid Build Coastguard Worker }
76*35238bceSAndroid Build Coastguard Worker 
toSinglesampleAccess(void) const77*35238bceSAndroid Build Coastguard Worker const tcu::ConstPixelBufferAccess MultisampleConstPixelBufferAccess::toSinglesampleAccess(void) const
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(getNumSamples() == 1);
80*35238bceSAndroid Build Coastguard Worker 
81*35238bceSAndroid Build Coastguard Worker     return tcu::ConstPixelBufferAccess(
82*35238bceSAndroid Build Coastguard Worker         m_access.getFormat(), tcu::IVec3(m_access.getHeight(), m_access.getDepth(), 1),
83*35238bceSAndroid Build Coastguard Worker         tcu::IVec3(m_access.getRowPitch(), m_access.getSlicePitch(), m_access.getSlicePitch() * m_access.getDepth()),
84*35238bceSAndroid Build Coastguard Worker         m_access.getDataPtr());
85*35238bceSAndroid Build Coastguard Worker }
86*35238bceSAndroid Build Coastguard Worker 
fromSinglesampleAccess(const tcu::ConstPixelBufferAccess & original)87*35238bceSAndroid Build Coastguard Worker MultisampleConstPixelBufferAccess MultisampleConstPixelBufferAccess::fromSinglesampleAccess(
88*35238bceSAndroid Build Coastguard Worker     const tcu::ConstPixelBufferAccess &original)
89*35238bceSAndroid Build Coastguard Worker {
90*35238bceSAndroid Build Coastguard Worker     return MultisampleConstPixelBufferAccess(tcu::ConstPixelBufferAccess(
91*35238bceSAndroid Build Coastguard Worker         original.getFormat(), tcu::IVec3(1, original.getWidth(), original.getHeight()),
92*35238bceSAndroid Build Coastguard Worker         tcu::IVec3(original.getPixelPitch(), original.getPixelPitch(), original.getRowPitch()), original.getDataPtr()));
93*35238bceSAndroid Build Coastguard Worker }
94*35238bceSAndroid Build Coastguard Worker 
fromMultisampleAccess(const tcu::ConstPixelBufferAccess & multisampledAccess)95*35238bceSAndroid Build Coastguard Worker MultisampleConstPixelBufferAccess MultisampleConstPixelBufferAccess::fromMultisampleAccess(
96*35238bceSAndroid Build Coastguard Worker     const tcu::ConstPixelBufferAccess &multisampledAccess)
97*35238bceSAndroid Build Coastguard Worker {
98*35238bceSAndroid Build Coastguard Worker     return MultisampleConstPixelBufferAccess(multisampledAccess);
99*35238bceSAndroid Build Coastguard Worker }
100*35238bceSAndroid Build Coastguard Worker 
getSubregion(const MultisamplePixelBufferAccess & access,int x,int y,int width,int height)101*35238bceSAndroid Build Coastguard Worker MultisamplePixelBufferAccess getSubregion(const MultisamplePixelBufferAccess &access, int x, int y, int width,
102*35238bceSAndroid Build Coastguard Worker                                           int height)
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker     return MultisamplePixelBufferAccess::fromMultisampleAccess(
105*35238bceSAndroid Build Coastguard Worker         tcu::getSubregion(access.raw(), 0, x, y, access.getNumSamples(), width, height));
106*35238bceSAndroid Build Coastguard Worker }
107*35238bceSAndroid Build Coastguard Worker 
getSubregion(const MultisampleConstPixelBufferAccess & access,int x,int y,int width,int height)108*35238bceSAndroid Build Coastguard Worker MultisampleConstPixelBufferAccess getSubregion(const MultisampleConstPixelBufferAccess &access, int x, int y, int width,
109*35238bceSAndroid Build Coastguard Worker                                                int height)
110*35238bceSAndroid Build Coastguard Worker {
111*35238bceSAndroid Build Coastguard Worker     return MultisampleConstPixelBufferAccess::fromMultisampleAccess(
112*35238bceSAndroid Build Coastguard Worker         tcu::getSubregion(access.raw(), 0, x, y, access.getNumSamples(), width, height));
113*35238bceSAndroid Build Coastguard Worker }
114*35238bceSAndroid Build Coastguard Worker 
resolveMultisampleColorBuffer(const tcu::PixelBufferAccess & dst,const MultisampleConstPixelBufferAccess & src)115*35238bceSAndroid Build Coastguard Worker void resolveMultisampleColorBuffer(const tcu::PixelBufferAccess &dst, const MultisampleConstPixelBufferAccess &src)
116*35238bceSAndroid Build Coastguard Worker {
117*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(dst.getWidth() == src.raw().getHeight());
118*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(dst.getHeight() == src.raw().getDepth());
119*35238bceSAndroid Build Coastguard Worker 
120*35238bceSAndroid Build Coastguard Worker     if (src.getNumSamples() == 1)
121*35238bceSAndroid Build Coastguard Worker     {
122*35238bceSAndroid Build Coastguard Worker         // fast-path for non-multisampled cases
123*35238bceSAndroid Build Coastguard Worker         tcu::copy(dst, src.toSinglesampleAccess());
124*35238bceSAndroid Build Coastguard Worker     }
125*35238bceSAndroid Build Coastguard Worker     else
126*35238bceSAndroid Build Coastguard Worker     {
127*35238bceSAndroid Build Coastguard Worker         const float numSamplesInv = 1.0f / (float)src.getNumSamples();
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < dst.getHeight(); y++)
130*35238bceSAndroid Build Coastguard Worker             for (int x = 0; x < dst.getWidth(); x++)
131*35238bceSAndroid Build Coastguard Worker             {
132*35238bceSAndroid Build Coastguard Worker                 tcu::Vec4 sum;
133*35238bceSAndroid Build Coastguard Worker                 for (int s = 0; s < src.raw().getWidth(); s++)
134*35238bceSAndroid Build Coastguard Worker                     sum += src.raw().getPixel(s, x, y);
135*35238bceSAndroid Build Coastguard Worker 
136*35238bceSAndroid Build Coastguard Worker                 dst.setPixel(sum * numSamplesInv, x, y);
137*35238bceSAndroid Build Coastguard Worker             }
138*35238bceSAndroid Build Coastguard Worker     }
139*35238bceSAndroid Build Coastguard Worker }
140*35238bceSAndroid Build Coastguard Worker 
resolveMultisampleDepthBuffer(const tcu::PixelBufferAccess & dst,const MultisampleConstPixelBufferAccess & src)141*35238bceSAndroid Build Coastguard Worker void resolveMultisampleDepthBuffer(const tcu::PixelBufferAccess &dst, const MultisampleConstPixelBufferAccess &src)
142*35238bceSAndroid Build Coastguard Worker {
143*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(dst.getWidth() == src.raw().getHeight());
144*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(dst.getHeight() == src.raw().getDepth());
145*35238bceSAndroid Build Coastguard Worker 
146*35238bceSAndroid Build Coastguard Worker     const tcu::ConstPixelBufferAccess effectiveSrc =
147*35238bceSAndroid Build Coastguard Worker         tcu::getEffectiveDepthStencilAccess(src.raw(), tcu::Sampler::MODE_DEPTH);
148*35238bceSAndroid Build Coastguard Worker     const tcu::PixelBufferAccess effectiveDst = tcu::getEffectiveDepthStencilAccess(dst, tcu::Sampler::MODE_DEPTH);
149*35238bceSAndroid Build Coastguard Worker 
150*35238bceSAndroid Build Coastguard Worker     if (src.getNumSamples() == 1)
151*35238bceSAndroid Build Coastguard Worker     {
152*35238bceSAndroid Build Coastguard Worker         // fast-path for non-multisampled cases
153*35238bceSAndroid Build Coastguard Worker         tcu::copy(effectiveDst,
154*35238bceSAndroid Build Coastguard Worker                   MultisampleConstPixelBufferAccess::fromMultisampleAccess(effectiveSrc).toSinglesampleAccess());
155*35238bceSAndroid Build Coastguard Worker     }
156*35238bceSAndroid Build Coastguard Worker     else
157*35238bceSAndroid Build Coastguard Worker     {
158*35238bceSAndroid Build Coastguard Worker         const float numSamplesInv = 1.0f / (float)src.getNumSamples();
159*35238bceSAndroid Build Coastguard Worker 
160*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < dst.getHeight(); y++)
161*35238bceSAndroid Build Coastguard Worker             for (int x = 0; x < dst.getWidth(); x++)
162*35238bceSAndroid Build Coastguard Worker             {
163*35238bceSAndroid Build Coastguard Worker                 float sum = 0.0f;
164*35238bceSAndroid Build Coastguard Worker                 for (int s = 0; s < src.getNumSamples(); s++)
165*35238bceSAndroid Build Coastguard Worker                     sum += effectiveSrc.getPixDepth(s, x, y);
166*35238bceSAndroid Build Coastguard Worker 
167*35238bceSAndroid Build Coastguard Worker                 effectiveDst.setPixDepth(sum * numSamplesInv, x, y);
168*35238bceSAndroid Build Coastguard Worker             }
169*35238bceSAndroid Build Coastguard Worker     }
170*35238bceSAndroid Build Coastguard Worker }
171*35238bceSAndroid Build Coastguard Worker 
resolveMultisampleStencilBuffer(const tcu::PixelBufferAccess & dst,const MultisampleConstPixelBufferAccess & src)172*35238bceSAndroid Build Coastguard Worker void resolveMultisampleStencilBuffer(const tcu::PixelBufferAccess &dst, const MultisampleConstPixelBufferAccess &src)
173*35238bceSAndroid Build Coastguard Worker {
174*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(dst.getWidth() == src.raw().getHeight());
175*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(dst.getHeight() == src.raw().getDepth());
176*35238bceSAndroid Build Coastguard Worker 
177*35238bceSAndroid Build Coastguard Worker     const tcu::ConstPixelBufferAccess effectiveSrc =
178*35238bceSAndroid Build Coastguard Worker         tcu::getEffectiveDepthStencilAccess(src.raw(), tcu::Sampler::MODE_STENCIL);
179*35238bceSAndroid Build Coastguard Worker     const tcu::PixelBufferAccess effectiveDst = tcu::getEffectiveDepthStencilAccess(dst, tcu::Sampler::MODE_STENCIL);
180*35238bceSAndroid Build Coastguard Worker 
181*35238bceSAndroid Build Coastguard Worker     if (src.getNumSamples() == 1)
182*35238bceSAndroid Build Coastguard Worker     {
183*35238bceSAndroid Build Coastguard Worker         // fast-path for non-multisampled cases
184*35238bceSAndroid Build Coastguard Worker         tcu::copy(effectiveDst,
185*35238bceSAndroid Build Coastguard Worker                   MultisampleConstPixelBufferAccess::fromMultisampleAccess(effectiveSrc).toSinglesampleAccess());
186*35238bceSAndroid Build Coastguard Worker     }
187*35238bceSAndroid Build Coastguard Worker     else
188*35238bceSAndroid Build Coastguard Worker     {
189*35238bceSAndroid Build Coastguard Worker         // Resolve by selecting one
190*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < dst.getHeight(); y++)
191*35238bceSAndroid Build Coastguard Worker             for (int x = 0; x < dst.getWidth(); x++)
192*35238bceSAndroid Build Coastguard Worker                 effectiveDst.setPixStencil(effectiveSrc.getPixStencil(0, x, y), x, y);
193*35238bceSAndroid Build Coastguard Worker     }
194*35238bceSAndroid Build Coastguard Worker }
195*35238bceSAndroid Build Coastguard Worker 
resolveMultisampleBuffer(const tcu::PixelBufferAccess & dst,const MultisampleConstPixelBufferAccess & src)196*35238bceSAndroid Build Coastguard Worker void resolveMultisampleBuffer(const tcu::PixelBufferAccess &dst, const MultisampleConstPixelBufferAccess &src)
197*35238bceSAndroid Build Coastguard Worker {
198*35238bceSAndroid Build Coastguard Worker     switch (src.raw().getFormat().order)
199*35238bceSAndroid Build Coastguard Worker     {
200*35238bceSAndroid Build Coastguard Worker     case tcu::TextureFormat::D:
201*35238bceSAndroid Build Coastguard Worker         resolveMultisampleDepthBuffer(dst, src);
202*35238bceSAndroid Build Coastguard Worker         return;
203*35238bceSAndroid Build Coastguard Worker 
204*35238bceSAndroid Build Coastguard Worker     case tcu::TextureFormat::S:
205*35238bceSAndroid Build Coastguard Worker         resolveMultisampleStencilBuffer(dst, src);
206*35238bceSAndroid Build Coastguard Worker         return;
207*35238bceSAndroid Build Coastguard Worker 
208*35238bceSAndroid Build Coastguard Worker     case tcu::TextureFormat::DS:
209*35238bceSAndroid Build Coastguard Worker         resolveMultisampleDepthBuffer(dst, src);
210*35238bceSAndroid Build Coastguard Worker         resolveMultisampleStencilBuffer(dst, src);
211*35238bceSAndroid Build Coastguard Worker         return;
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker     default:
214*35238bceSAndroid Build Coastguard Worker         resolveMultisampleColorBuffer(dst, src);
215*35238bceSAndroid Build Coastguard Worker         return;
216*35238bceSAndroid Build Coastguard Worker     }
217*35238bceSAndroid Build Coastguard Worker }
218*35238bceSAndroid Build Coastguard Worker 
resolveMultisamplePixel(const MultisampleConstPixelBufferAccess & access,int x,int y)219*35238bceSAndroid Build Coastguard Worker tcu::Vec4 resolveMultisamplePixel(const MultisampleConstPixelBufferAccess &access, int x, int y)
220*35238bceSAndroid Build Coastguard Worker {
221*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 sum;
222*35238bceSAndroid Build Coastguard Worker     for (int s = 0; s < access.getNumSamples(); s++)
223*35238bceSAndroid Build Coastguard Worker         sum += access.raw().getPixel(s, x, y);
224*35238bceSAndroid Build Coastguard Worker 
225*35238bceSAndroid Build Coastguard Worker     return sum / (float)access.getNumSamples();
226*35238bceSAndroid Build Coastguard Worker }
227*35238bceSAndroid Build Coastguard Worker 
clear(const MultisamplePixelBufferAccess & access,const tcu::Vec4 & color)228*35238bceSAndroid Build Coastguard Worker void clear(const MultisamplePixelBufferAccess &access, const tcu::Vec4 &color)
229*35238bceSAndroid Build Coastguard Worker {
230*35238bceSAndroid Build Coastguard Worker     tcu::clear(access.raw(), color);
231*35238bceSAndroid Build Coastguard Worker }
232*35238bceSAndroid Build Coastguard Worker 
clear(const MultisamplePixelBufferAccess & access,const tcu::IVec4 & color)233*35238bceSAndroid Build Coastguard Worker void clear(const MultisamplePixelBufferAccess &access, const tcu::IVec4 &color)
234*35238bceSAndroid Build Coastguard Worker {
235*35238bceSAndroid Build Coastguard Worker     tcu::clear(access.raw(), color);
236*35238bceSAndroid Build Coastguard Worker }
237*35238bceSAndroid Build Coastguard Worker 
clearDepth(const MultisamplePixelBufferAccess & access,float depth)238*35238bceSAndroid Build Coastguard Worker void clearDepth(const MultisamplePixelBufferAccess &access, float depth)
239*35238bceSAndroid Build Coastguard Worker {
240*35238bceSAndroid Build Coastguard Worker     tcu::clearDepth(access.raw(), depth);
241*35238bceSAndroid Build Coastguard Worker }
242*35238bceSAndroid Build Coastguard Worker 
clearStencil(const MultisamplePixelBufferAccess & access,int stencil)243*35238bceSAndroid Build Coastguard Worker void clearStencil(const MultisamplePixelBufferAccess &access, int stencil)
244*35238bceSAndroid Build Coastguard Worker {
245*35238bceSAndroid Build Coastguard Worker     tcu::clearStencil(access.raw(), stencil);
246*35238bceSAndroid Build Coastguard Worker }
247*35238bceSAndroid Build Coastguard Worker 
248*35238bceSAndroid Build Coastguard Worker } // namespace rr
249