Home | History | Annotate | Download | only in referencerenderer
      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 
     30 MultisamplePixelBufferAccess::MultisamplePixelBufferAccess (const tcu::PixelBufferAccess& rawAccess)
     31 	: m_access(rawAccess)
     32 {
     33 }
     34 
     35 MultisamplePixelBufferAccess::MultisamplePixelBufferAccess (void)
     36 	: m_access(tcu::PixelBufferAccess(tcu::TextureFormat(), 0, 0, 0, 0, 0, DE_NULL))
     37 {
     38 }
     39 
     40 const 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 
     53 MultisamplePixelBufferAccess 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 
     66 MultisamplePixelBufferAccess MultisamplePixelBufferAccess::fromMultisampleAccess (const tcu::PixelBufferAccess& multisampledAccess)
     67 {
     68 	return MultisamplePixelBufferAccess(multisampledAccess);
     69 }
     70 
     71 MultisampleConstPixelBufferAccess::MultisampleConstPixelBufferAccess (void)
     72 	: m_access(tcu::ConstPixelBufferAccess(tcu::TextureFormat(), 0, 0, 0, 0, 0, DE_NULL))
     73 {
     74 }
     75 
     76 MultisampleConstPixelBufferAccess::MultisampleConstPixelBufferAccess (const tcu::ConstPixelBufferAccess& rawAccess)
     77 	: m_access(rawAccess)
     78 {
     79 }
     80 
     81 MultisampleConstPixelBufferAccess::MultisampleConstPixelBufferAccess (const rr::MultisamplePixelBufferAccess& msAccess)
     82 	: m_access(msAccess.raw())
     83 {
     84 }
     85 
     86 const 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 
     99 MultisampleConstPixelBufferAccess 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 
    112 MultisampleConstPixelBufferAccess MultisampleConstPixelBufferAccess::fromMultisampleAccess (const tcu::ConstPixelBufferAccess& multisampledAccess)
    113 {
    114 	return MultisampleConstPixelBufferAccess(multisampledAccess);
    115 }
    116 
    117 MultisamplePixelBufferAccess 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 
    122 MultisampleConstPixelBufferAccess 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 
    127 void 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 
    147 tcu::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 
    156 void clear (const MultisamplePixelBufferAccess& access, const tcu::Vec4& color)
    157 {
    158 	tcu::clear(access.raw(), color);
    159 }
    160 
    161 void clear (const MultisamplePixelBufferAccess& access, const tcu::IVec4& color)
    162 {
    163 	tcu::clear(access.raw(), color);
    164 }
    165 
    166 void clearDepth (const MultisamplePixelBufferAccess& access, float depth)
    167 {
    168 	tcu::clearDepth(access.raw(), depth);
    169 }
    170 
    171 void clearStencil (const MultisamplePixelBufferAccess& access, int stencil)
    172 {
    173 	tcu::clearStencil(access.raw(), stencil);
    174 }
    175 
    176 } // rr
    177