Home | History | Annotate | Download | only in decpp
      1 /*-------------------------------------------------------------------------
      2  * drawElements C++ Base Library
      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 Array buffer
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "deArrayBuffer.hpp"
     25 
     26 #if defined(DE_VALGRIND_BUILD) && defined(HAVE_VALGRIND_MEMCHECK_H)
     27 #	include <valgrind/memcheck.h>
     28 #endif
     29 
     30 namespace de
     31 {
     32 namespace detail
     33 {
     34 
     35 void* ArrayBuffer_AlignedMalloc (size_t numBytes, size_t alignment)
     36 {
     37 	const int	sizeAsInt	= (int)numBytes;
     38 	void*		ptr;
     39 
     40 	// int overflow
     41 	if (sizeAsInt < 0 || numBytes != (size_t)sizeAsInt)
     42 		throw std::bad_alloc();
     43 
     44 	// alloc
     45 	ptr = deAlignedMalloc(sizeAsInt, (int)alignment);
     46 	if (!ptr)
     47 		throw std::bad_alloc();
     48 
     49 	// mark area as undefined for valgrind
     50 #if defined(DE_VALGRIND_BUILD) && defined(HAVE_VALGRIND_MEMCHECK_H)
     51 	if (RUNNING_ON_VALGRIND)
     52 	{
     53 		VALGRIND_MAKE_MEM_UNDEFINED(ptr, numBytes);
     54 	}
     55 #endif
     56 
     57 	return ptr;
     58 }
     59 
     60 void ArrayBuffer_AlignedFree (void* ptr)
     61 {
     62 	deAlignedFree(ptr);
     63 }
     64 
     65 } // detail
     66 
     67 void ArrayBuffer_selfTest (void)
     68 {
     69 	// default constructor
     70 	{
     71 		de::ArrayBuffer<int> buf;
     72 		DE_TEST_ASSERT(buf.size() == 0);
     73 		DE_TEST_ASSERT(buf.getPtr() == DE_NULL);
     74 	}
     75 
     76 	// sized constructor
     77 	{
     78 		de::ArrayBuffer<int> buf(4);
     79 		DE_TEST_ASSERT(buf.size() == 4);
     80 		DE_TEST_ASSERT(buf.getPtr() != DE_NULL);
     81 	}
     82 
     83 	// copy constructor
     84 	{
     85 		de::ArrayBuffer<int> originalBuf(4);
     86 		*originalBuf.getElementPtr(0) = 1;
     87 		*originalBuf.getElementPtr(1) = 2;
     88 		*originalBuf.getElementPtr(2) = 3;
     89 		*originalBuf.getElementPtr(3) = 4;
     90 
     91 		de::ArrayBuffer<int> targetBuf(originalBuf);
     92 
     93 		DE_TEST_ASSERT(*originalBuf.getElementPtr(0) == 1);
     94 		DE_TEST_ASSERT(*originalBuf.getElementPtr(1) == 2);
     95 		DE_TEST_ASSERT(*originalBuf.getElementPtr(2) == 3);
     96 		DE_TEST_ASSERT(*originalBuf.getElementPtr(3) == 4);
     97 
     98 		DE_TEST_ASSERT(*targetBuf.getElementPtr(0) == 1);
     99 		DE_TEST_ASSERT(*targetBuf.getElementPtr(1) == 2);
    100 		DE_TEST_ASSERT(*targetBuf.getElementPtr(2) == 3);
    101 		DE_TEST_ASSERT(*targetBuf.getElementPtr(3) == 4);
    102 	}
    103 
    104 	// assignment
    105 	{
    106 		de::ArrayBuffer<int> originalBuf(4);
    107 		*originalBuf.getElementPtr(0) = 1;
    108 		*originalBuf.getElementPtr(1) = 2;
    109 		*originalBuf.getElementPtr(2) = 3;
    110 		*originalBuf.getElementPtr(3) = 4;
    111 
    112 		de::ArrayBuffer<int> targetBuf(1);
    113 
    114 		targetBuf = originalBuf;
    115 
    116 		DE_TEST_ASSERT(*originalBuf.getElementPtr(0) == 1);
    117 		DE_TEST_ASSERT(*originalBuf.getElementPtr(1) == 2);
    118 		DE_TEST_ASSERT(*originalBuf.getElementPtr(2) == 3);
    119 		DE_TEST_ASSERT(*originalBuf.getElementPtr(3) == 4);
    120 
    121 		DE_TEST_ASSERT(*targetBuf.getElementPtr(0) == 1);
    122 		DE_TEST_ASSERT(*targetBuf.getElementPtr(1) == 2);
    123 		DE_TEST_ASSERT(*targetBuf.getElementPtr(2) == 3);
    124 		DE_TEST_ASSERT(*targetBuf.getElementPtr(3) == 4);
    125 	}
    126 
    127 	// clear
    128 	{
    129 		de::ArrayBuffer<int> buf(4);
    130 		buf.clear();
    131 		DE_TEST_ASSERT(buf.size() == 0);
    132 		DE_TEST_ASSERT(buf.getPtr() == DE_NULL);
    133 	}
    134 
    135 	// setStorage
    136 	{
    137 		de::ArrayBuffer<int> buf(4);
    138 		buf.setStorage(12);
    139 		DE_TEST_ASSERT(buf.size() == 12);
    140 		DE_TEST_ASSERT(buf.getPtr() != DE_NULL);
    141 	}
    142 
    143 	// setStorage, too large
    144 	{
    145 		de::ArrayBuffer<int> buf(4);
    146 		*buf.getElementPtr(0) = 1;
    147 		*buf.getElementPtr(1) = 2;
    148 		*buf.getElementPtr(2) = 3;
    149 		*buf.getElementPtr(3) = 4;
    150 
    151 		try
    152 		{
    153 			buf.setStorage((size_t)-1);
    154 
    155 			// setStorage succeeded, all ok
    156 		}
    157 		catch (std::bad_alloc&)
    158 		{
    159 			// alloc failed, check storage not changed
    160 
    161 			DE_TEST_ASSERT(buf.size() == 4);
    162 			DE_TEST_ASSERT(*buf.getElementPtr(0) == 1);
    163 			DE_TEST_ASSERT(*buf.getElementPtr(1) == 2);
    164 			DE_TEST_ASSERT(*buf.getElementPtr(2) == 3);
    165 			DE_TEST_ASSERT(*buf.getElementPtr(3) == 4);
    166 		}
    167 	}
    168 
    169 	// swap
    170 	{
    171 		de::ArrayBuffer<int> buf;
    172 		de::ArrayBuffer<int> source(4);
    173 		*source.getElementPtr(0) = 1;
    174 		*source.getElementPtr(1) = 2;
    175 		*source.getElementPtr(2) = 3;
    176 		*source.getElementPtr(3) = 4;
    177 
    178 		buf.swap(source);
    179 
    180 		DE_TEST_ASSERT(source.size() == 0);
    181 		DE_TEST_ASSERT(buf.size() == 4);
    182 		DE_TEST_ASSERT(*buf.getElementPtr(0) == 1);
    183 		DE_TEST_ASSERT(*buf.getElementPtr(1) == 2);
    184 		DE_TEST_ASSERT(*buf.getElementPtr(2) == 3);
    185 		DE_TEST_ASSERT(*buf.getElementPtr(3) == 4);
    186 	}
    187 
    188 	// default
    189 	{
    190 		de::ArrayBuffer<int> source(4);
    191 		int dst;
    192 		*source.getElementPtr(1) = 2;
    193 
    194 		deMemcpy(&dst, (int*)source.getPtr() + 1, sizeof(int));
    195 
    196 		DE_TEST_ASSERT(dst == 2);
    197 	}
    198 
    199 	// Aligned
    200 	{
    201 		de::ArrayBuffer<int, 64, sizeof(int)> source(4);
    202 		int dst;
    203 		*source.getElementPtr(1) = 2;
    204 
    205 		deMemcpy(&dst, (int*)source.getPtr() + 1, sizeof(int));
    206 
    207 		DE_TEST_ASSERT(dst == 2);
    208 	}
    209 
    210 	// Strided
    211 	{
    212 		de::ArrayBuffer<int, 4, 64> source(4);
    213 		int dst;
    214 		*source.getElementPtr(1) = 2;
    215 
    216 		deMemcpy(&dst, (deUint8*)source.getPtr() + 64, sizeof(int));
    217 
    218 		DE_TEST_ASSERT(dst == 2);
    219 	}
    220 
    221 	// Aligned, Strided
    222 	{
    223 		de::ArrayBuffer<int, 32, 64> source(4);
    224 		int dst;
    225 		*source.getElementPtr(1) = 2;
    226 
    227 		deMemcpy(&dst, (deUint8*)source.getPtr() + 64, sizeof(int));
    228 
    229 		DE_TEST_ASSERT(dst == 2);
    230 	}
    231 }
    232 
    233 } // de
    234