234 lines
5.4 KiB
C++
234 lines
5.4 KiB
C++
/*-------------------------------------------------------------------------
|
|
* drawElements C++ Base Library
|
|
* -----------------------------
|
|
*
|
|
* Copyright 2014 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*//*!
|
|
* \file
|
|
* \brief Array buffer
|
|
*//*--------------------------------------------------------------------*/
|
|
|
|
#include "deArrayBuffer.hpp"
|
|
|
|
#if defined(DE_VALGRIND_BUILD) && defined(HAVE_VALGRIND_MEMCHECK_H)
|
|
# include <valgrind/memcheck.h>
|
|
#endif
|
|
|
|
namespace de
|
|
{
|
|
namespace detail
|
|
{
|
|
|
|
void* ArrayBuffer_AlignedMalloc (size_t numBytes, size_t alignment)
|
|
{
|
|
const int sizeAsInt = (int)numBytes;
|
|
void* ptr;
|
|
|
|
// int overflow
|
|
if (sizeAsInt < 0 || numBytes != (size_t)sizeAsInt)
|
|
throw std::bad_alloc();
|
|
|
|
// alloc
|
|
ptr = deAlignedMalloc(sizeAsInt, (int)alignment);
|
|
if (!ptr)
|
|
throw std::bad_alloc();
|
|
|
|
// mark area as undefined for valgrind
|
|
#if defined(DE_VALGRIND_BUILD) && defined(HAVE_VALGRIND_MEMCHECK_H)
|
|
if (RUNNING_ON_VALGRIND)
|
|
{
|
|
VALGRIND_MAKE_MEM_UNDEFINED(ptr, numBytes);
|
|
}
|
|
#endif
|
|
|
|
return ptr;
|
|
}
|
|
|
|
void ArrayBuffer_AlignedFree (void* ptr)
|
|
{
|
|
deAlignedFree(ptr);
|
|
}
|
|
|
|
} // detail
|
|
|
|
void ArrayBuffer_selfTest (void)
|
|
{
|
|
// default constructor
|
|
{
|
|
de::ArrayBuffer<int> buf;
|
|
DE_TEST_ASSERT(buf.size() == 0);
|
|
DE_TEST_ASSERT(buf.getPtr() == DE_NULL);
|
|
}
|
|
|
|
// sized constructor
|
|
{
|
|
de::ArrayBuffer<int> buf(4);
|
|
DE_TEST_ASSERT(buf.size() == 4);
|
|
DE_TEST_ASSERT(buf.getPtr() != DE_NULL);
|
|
}
|
|
|
|
// copy constructor
|
|
{
|
|
de::ArrayBuffer<int> originalBuf(4);
|
|
*originalBuf.getElementPtr(0) = 1;
|
|
*originalBuf.getElementPtr(1) = 2;
|
|
*originalBuf.getElementPtr(2) = 3;
|
|
*originalBuf.getElementPtr(3) = 4;
|
|
|
|
de::ArrayBuffer<int> targetBuf(originalBuf);
|
|
|
|
DE_TEST_ASSERT(*originalBuf.getElementPtr(0) == 1);
|
|
DE_TEST_ASSERT(*originalBuf.getElementPtr(1) == 2);
|
|
DE_TEST_ASSERT(*originalBuf.getElementPtr(2) == 3);
|
|
DE_TEST_ASSERT(*originalBuf.getElementPtr(3) == 4);
|
|
|
|
DE_TEST_ASSERT(*targetBuf.getElementPtr(0) == 1);
|
|
DE_TEST_ASSERT(*targetBuf.getElementPtr(1) == 2);
|
|
DE_TEST_ASSERT(*targetBuf.getElementPtr(2) == 3);
|
|
DE_TEST_ASSERT(*targetBuf.getElementPtr(3) == 4);
|
|
}
|
|
|
|
// assignment
|
|
{
|
|
de::ArrayBuffer<int> originalBuf(4);
|
|
*originalBuf.getElementPtr(0) = 1;
|
|
*originalBuf.getElementPtr(1) = 2;
|
|
*originalBuf.getElementPtr(2) = 3;
|
|
*originalBuf.getElementPtr(3) = 4;
|
|
|
|
de::ArrayBuffer<int> targetBuf(1);
|
|
|
|
targetBuf = originalBuf;
|
|
|
|
DE_TEST_ASSERT(*originalBuf.getElementPtr(0) == 1);
|
|
DE_TEST_ASSERT(*originalBuf.getElementPtr(1) == 2);
|
|
DE_TEST_ASSERT(*originalBuf.getElementPtr(2) == 3);
|
|
DE_TEST_ASSERT(*originalBuf.getElementPtr(3) == 4);
|
|
|
|
DE_TEST_ASSERT(*targetBuf.getElementPtr(0) == 1);
|
|
DE_TEST_ASSERT(*targetBuf.getElementPtr(1) == 2);
|
|
DE_TEST_ASSERT(*targetBuf.getElementPtr(2) == 3);
|
|
DE_TEST_ASSERT(*targetBuf.getElementPtr(3) == 4);
|
|
}
|
|
|
|
// clear
|
|
{
|
|
de::ArrayBuffer<int> buf(4);
|
|
buf.clear();
|
|
DE_TEST_ASSERT(buf.size() == 0);
|
|
DE_TEST_ASSERT(buf.getPtr() == DE_NULL);
|
|
}
|
|
|
|
// setStorage
|
|
{
|
|
de::ArrayBuffer<int> buf(4);
|
|
buf.setStorage(12);
|
|
DE_TEST_ASSERT(buf.size() == 12);
|
|
DE_TEST_ASSERT(buf.getPtr() != DE_NULL);
|
|
}
|
|
|
|
// setStorage, too large
|
|
{
|
|
de::ArrayBuffer<int> buf(4);
|
|
*buf.getElementPtr(0) = 1;
|
|
*buf.getElementPtr(1) = 2;
|
|
*buf.getElementPtr(2) = 3;
|
|
*buf.getElementPtr(3) = 4;
|
|
|
|
try
|
|
{
|
|
buf.setStorage((size_t)-1);
|
|
|
|
// setStorage succeeded, all ok
|
|
}
|
|
catch (std::bad_alloc&)
|
|
{
|
|
// alloc failed, check storage not changed
|
|
|
|
DE_TEST_ASSERT(buf.size() == 4);
|
|
DE_TEST_ASSERT(*buf.getElementPtr(0) == 1);
|
|
DE_TEST_ASSERT(*buf.getElementPtr(1) == 2);
|
|
DE_TEST_ASSERT(*buf.getElementPtr(2) == 3);
|
|
DE_TEST_ASSERT(*buf.getElementPtr(3) == 4);
|
|
}
|
|
}
|
|
|
|
// swap
|
|
{
|
|
de::ArrayBuffer<int> buf;
|
|
de::ArrayBuffer<int> source(4);
|
|
*source.getElementPtr(0) = 1;
|
|
*source.getElementPtr(1) = 2;
|
|
*source.getElementPtr(2) = 3;
|
|
*source.getElementPtr(3) = 4;
|
|
|
|
buf.swap(source);
|
|
|
|
DE_TEST_ASSERT(source.size() == 0);
|
|
DE_TEST_ASSERT(buf.size() == 4);
|
|
DE_TEST_ASSERT(*buf.getElementPtr(0) == 1);
|
|
DE_TEST_ASSERT(*buf.getElementPtr(1) == 2);
|
|
DE_TEST_ASSERT(*buf.getElementPtr(2) == 3);
|
|
DE_TEST_ASSERT(*buf.getElementPtr(3) == 4);
|
|
}
|
|
|
|
// default
|
|
{
|
|
de::ArrayBuffer<int> source(4);
|
|
int dst;
|
|
*source.getElementPtr(1) = 2;
|
|
|
|
deMemcpy(&dst, (int*)source.getPtr() + 1, sizeof(int));
|
|
|
|
DE_TEST_ASSERT(dst == 2);
|
|
}
|
|
|
|
// Aligned
|
|
{
|
|
de::ArrayBuffer<int, 64, sizeof(int)> source(4);
|
|
int dst;
|
|
*source.getElementPtr(1) = 2;
|
|
|
|
deMemcpy(&dst, (int*)source.getPtr() + 1, sizeof(int));
|
|
|
|
DE_TEST_ASSERT(dst == 2);
|
|
}
|
|
|
|
// Strided
|
|
{
|
|
de::ArrayBuffer<int, 4, 64> source(4);
|
|
int dst;
|
|
*source.getElementPtr(1) = 2;
|
|
|
|
deMemcpy(&dst, (deUint8*)source.getPtr() + 64, sizeof(int));
|
|
|
|
DE_TEST_ASSERT(dst == 2);
|
|
}
|
|
|
|
// Aligned, Strided
|
|
{
|
|
de::ArrayBuffer<int, 32, 64> source(4);
|
|
int dst;
|
|
*source.getElementPtr(1) = 2;
|
|
|
|
deMemcpy(&dst, (deUint8*)source.getPtr() + 64, sizeof(int));
|
|
|
|
DE_TEST_ASSERT(dst == 2);
|
|
}
|
|
}
|
|
|
|
} // de
|