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