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
27namespace rr
28{
29
30MultisamplePixelBufferAccess::MultisamplePixelBufferAccess (const tcu::PixelBufferAccess& rawAccess)
31	: m_access(rawAccess)
32{
33}
34
35MultisamplePixelBufferAccess::MultisamplePixelBufferAccess (void)
36	: m_access(tcu::PixelBufferAccess(tcu::TextureFormat(), 0, 0, 0, 0, 0, DE_NULL))
37{
38}
39
40const tcu::PixelBufferAccess MultisamplePixelBufferAccess::toSinglesampleAccess (void) const
41{
42	DE_ASSERT(getNumSamples() == 1);
43
44	return tcu::PixelBufferAccess(m_access.getFormat(),
45								  m_access.getHeight(),
46								  m_access.getDepth(),
47								  1,
48								  m_access.getSlicePitch(),
49								  m_access.getSlicePitch() * m_access.getDepth(),
50								  m_access.getDataPtr());
51}
52
53MultisamplePixelBufferAccess MultisamplePixelBufferAccess::fromSinglesampleAccess (const tcu::PixelBufferAccess& original)
54{
55	return MultisamplePixelBufferAccess(
56				tcu::PixelBufferAccess(
57								original.getFormat(),
58								1,
59								original.getWidth(),
60								original.getHeight(),
61								original.getFormat().getPixelSize(),
62								original.getRowPitch(),
63								original.getDataPtr()));
64}
65
66MultisamplePixelBufferAccess MultisamplePixelBufferAccess::fromMultisampleAccess (const tcu::PixelBufferAccess& multisampledAccess)
67{
68	return MultisamplePixelBufferAccess(multisampledAccess);
69}
70
71MultisampleConstPixelBufferAccess::MultisampleConstPixelBufferAccess (void)
72	: m_access(tcu::ConstPixelBufferAccess(tcu::TextureFormat(), 0, 0, 0, 0, 0, DE_NULL))
73{
74}
75
76MultisampleConstPixelBufferAccess::MultisampleConstPixelBufferAccess (const tcu::ConstPixelBufferAccess& rawAccess)
77	: m_access(rawAccess)
78{
79}
80
81MultisampleConstPixelBufferAccess::MultisampleConstPixelBufferAccess (const rr::MultisamplePixelBufferAccess& msAccess)
82	: m_access(msAccess.raw())
83{
84}
85
86const tcu::ConstPixelBufferAccess MultisampleConstPixelBufferAccess::toSinglesampleAccess (void) const
87{
88	DE_ASSERT(getNumSamples() == 1);
89
90	return tcu::ConstPixelBufferAccess(m_access.getFormat(),
91									   m_access.getHeight(),
92									   m_access.getDepth(),
93									   1,
94									   m_access.getSlicePitch(),
95									   m_access.getSlicePitch() * m_access.getDepth(),
96									   m_access.getDataPtr());
97}
98
99MultisampleConstPixelBufferAccess MultisampleConstPixelBufferAccess::fromSinglesampleAccess (const tcu::ConstPixelBufferAccess& original)
100{
101	return MultisampleConstPixelBufferAccess(
102				tcu::ConstPixelBufferAccess(
103								original.getFormat(),
104								1,
105								original.getWidth(),
106								original.getHeight(),
107								original.getFormat().getPixelSize(),
108								original.getRowPitch(),
109								original.getDataPtr()));
110}
111
112MultisampleConstPixelBufferAccess MultisampleConstPixelBufferAccess::fromMultisampleAccess (const tcu::ConstPixelBufferAccess& multisampledAccess)
113{
114	return MultisampleConstPixelBufferAccess(multisampledAccess);
115}
116
117MultisamplePixelBufferAccess getSubregion (const MultisamplePixelBufferAccess& access, int x, int y, int width, int height)
118{
119	return MultisamplePixelBufferAccess::fromMultisampleAccess(tcu::getSubregion(access.raw(), 0, x, y, access.getNumSamples(), width, height));
120}
121
122MultisampleConstPixelBufferAccess getSubregion (const MultisampleConstPixelBufferAccess& access, int x, int y, int width, int height)
123{
124	return MultisampleConstPixelBufferAccess::fromMultisampleAccess(tcu::getSubregion(access.raw(), 0, x, y, access.getNumSamples(), width, height));
125}
126
127void resolveMultisampleColorBuffer (const tcu::PixelBufferAccess& dst, const MultisampleConstPixelBufferAccess& src)
128{
129	DE_ASSERT(dst.getWidth() == src.raw().getHeight());
130	DE_ASSERT(dst.getHeight() == src.raw().getDepth());
131
132	float numSamplesInv = 1.0f / (float)src.getNumSamples();
133
134	for (int y = 0; y < dst.getHeight(); y++)
135	{
136		for (int x = 0; x < dst.getWidth(); x++)
137		{
138			tcu::Vec4 sum;
139			for (int s = 0; s < src.raw().getWidth(); s++)
140				sum += src.raw().getPixel(s, x, y);
141
142			dst.setPixel(sum*numSamplesInv, x, y);
143		}
144	}
145}
146
147tcu::Vec4 resolveMultisamplePixel (const MultisampleConstPixelBufferAccess& access, int x, int y)
148{
149	tcu::Vec4 sum;
150	for (int s = 0; s < access.getNumSamples(); s++)
151		sum += access.raw().getPixel(s, x, y);
152
153	return sum / (float)access.getNumSamples();
154}
155
156void clear (const MultisamplePixelBufferAccess& access, const tcu::Vec4& color)
157{
158	tcu::clear(access.raw(), color);
159}
160
161void clear (const MultisamplePixelBufferAccess& access, const tcu::IVec4& color)
162{
163	tcu::clear(access.raw(), color);
164}
165
166void clearDepth (const MultisamplePixelBufferAccess& access, float depth)
167{
168	tcu::clearDepth(access.raw(), depth);
169}
170
171void clearStencil (const MultisamplePixelBufferAccess& access, int stencil)
172{
173	tcu::clearStencil(access.raw(), stencil);
174}
175
176} // rr
177