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