blob: 415702634f6c917ef3fa9743c003288c24825fef [file] [log] [blame]
/*
* Copyright (C) 2013 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.
*/
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <RenderScript.h>
#define LOG_TAG "rscpptest"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#include "ScriptC_setelementat.h"
using namespace android::RSC;
static void createTypedHelper (sp<RS> mRS, sp<const Element> e) {
Type::Builder typeBuilder(mRS, e);
for (int mips = 0; mips <= 1; mips ++) {
bool useMips = (mips == 1);
for (int faces = 0; faces <= 1; faces++) {
bool useFaces = (faces == 1);
for (uint32_t x = 1; x < 8; x ++) {
for (uint32_t y = 1; y < 8; y ++) {
typeBuilder.setMipmaps(useMips);
typeBuilder.setFaces(useFaces);
typeBuilder.setX(x);
typeBuilder.setY(y);
Allocation::createTyped(mRS, typeBuilder.create());
}
}
}
}
}
extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_typedTest(JNIEnv * env,
jclass obj,
jstring pathObj)
{
const char * path = env->GetStringUTFChars(pathObj, NULL);
sp<RS> mRS = new RS();
mRS->init(path);
env->ReleaseStringUTFChars(pathObj, path);
createTypedHelper(mRS, Element::A_8(mRS));
createTypedHelper(mRS, Element::RGBA_4444(mRS));
createTypedHelper(mRS, Element::RGBA_5551(mRS));
createTypedHelper(mRS, Element::RGB_565(mRS));
createTypedHelper(mRS, Element::RGB_888(mRS));
createTypedHelper(mRS, Element::RGBA_8888(mRS));
createTypedHelper(mRS, Element::F32(mRS));
createTypedHelper(mRS, Element::F32_2(mRS));
createTypedHelper(mRS, Element::F32_3(mRS));
createTypedHelper(mRS, Element::F32_4(mRS));
createTypedHelper(mRS, Element::F64(mRS));
createTypedHelper(mRS, Element::F64_2(mRS));
createTypedHelper(mRS, Element::F64_3(mRS));
createTypedHelper(mRS, Element::F64_4(mRS));
createTypedHelper(mRS, Element::I8(mRS));
createTypedHelper(mRS, Element::I8_2(mRS));
createTypedHelper(mRS, Element::I8_3(mRS));
createTypedHelper(mRS, Element::I8_4(mRS));
createTypedHelper(mRS, Element::I16(mRS));
createTypedHelper(mRS, Element::I16_2(mRS));
createTypedHelper(mRS, Element::I16_3(mRS));
createTypedHelper(mRS, Element::I16_4(mRS));
createTypedHelper(mRS, Element::I32(mRS));
createTypedHelper(mRS, Element::I32_2(mRS));
createTypedHelper(mRS, Element::I32_3(mRS));
createTypedHelper(mRS, Element::I32_4(mRS));
createTypedHelper(mRS, Element::I64(mRS));
createTypedHelper(mRS, Element::I64_2(mRS));
createTypedHelper(mRS, Element::I64_3(mRS));
createTypedHelper(mRS, Element::I64_4(mRS));
createTypedHelper(mRS, Element::U8(mRS));
createTypedHelper(mRS, Element::U8_2(mRS));
createTypedHelper(mRS, Element::U8_3(mRS));
createTypedHelper(mRS, Element::U8_4(mRS));
createTypedHelper(mRS, Element::U16(mRS));
createTypedHelper(mRS, Element::U16_2(mRS));
createTypedHelper(mRS, Element::U16_3(mRS));
createTypedHelper(mRS, Element::U16_4(mRS));
createTypedHelper(mRS, Element::U32(mRS));
createTypedHelper(mRS, Element::U32_2(mRS));
createTypedHelper(mRS, Element::U32_3(mRS));
createTypedHelper(mRS, Element::U32_4(mRS));
createTypedHelper(mRS, Element::U64(mRS));
createTypedHelper(mRS, Element::U64_2(mRS));
createTypedHelper(mRS, Element::U64_3(mRS));
createTypedHelper(mRS, Element::U64_4(mRS));
createTypedHelper(mRS, Element::MATRIX_2X2(mRS));
createTypedHelper(mRS, Element::MATRIX_3X3(mRS));
createTypedHelper(mRS, Element::MATRIX_4X4(mRS));
createTypedHelper(mRS, Element::SAMPLER(mRS));
createTypedHelper(mRS, Element::SCRIPT(mRS));
createTypedHelper(mRS, Element::TYPE(mRS));
createTypedHelper(mRS, Element::BOOLEAN(mRS));
createTypedHelper(mRS, Element::ELEMENT(mRS));
createTypedHelper(mRS, Element::ALLOCATION(mRS));
mRS->finish();
return true;
}
static bool helperFloatCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
bool passed = true;
sp<Allocation> A = Allocation::createSized(mRS, Element::F32(mRS), nElems);
float *src, *dst;
src = new float[nElems];
dst = new float[nElems];
for (int i = 0; i < count; i++) {
src[i] = (float)i;
dst[offset + i] = -1.0f;
}
switch (copyMode) {
case 0: A->copy1DFrom(src); break;
case 1: A->copy1DRangeFrom(offset, count, src); break;
}
A->copy1DTo(dst);
for (int i = 0; i < count; i++) {
if (dst[offset + i] != src[i]) {
passed = false;
break;
}
}
delete[] src;
delete[] dst;
return passed;
}
static bool helperCharCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
bool passed = true;
sp<Allocation> A = Allocation::createSized(mRS, Element::I8(mRS), nElems);
char *src, *dst;
src = new char[nElems];
dst = new char[nElems];
for (int i = 0; i < count; i++) {
src[i] = (char)i;
dst[offset + i] = -1;
}
switch (copyMode) {
case 0: A->copy1DFrom(src); break;
case 1: A->copy1DRangeFrom(offset, count, src); break;
}
A->copy1DTo(dst);
for (int i = 0; i < count; i++) {
if (dst[offset + i] != src[i]) {
passed = false;
break;
}
}
delete[] src;
delete[] dst;
return passed;
}
static bool helperShortCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
bool passed = true;
sp<Allocation> A = Allocation::createSized(mRS, Element::I16(mRS), nElems);
short *src, *dst;
src = new short[nElems];
dst = new short[nElems];
for (int i = 0; i < count; i++) {
src[i] = (short)i;
dst[offset + i] = -1;
}
switch (copyMode) {
case 0: A->copy1DFrom(src); break;
case 1: A->copy1DRangeFrom(offset, count, src); break;
}
A->copy1DTo(dst);
for (int i = 0; i < count; i++) {
if (dst[offset + i] != src[i]) {
passed = false;
break;
}
}
delete[] src;
delete[] dst;
return passed;
}
static bool helperIntCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
bool passed = true;
sp<Allocation> A = Allocation::createSized(mRS, Element::I32(mRS), nElems);
int *src, *dst;
src = new int[nElems];
dst = new int[nElems];
for (int i = 0; i < count; i++) {
src[i] = (int)i;
dst[offset + i] = -1;
}
switch (copyMode) {
case 0: A->copy1DFrom(src); break;
case 1: A->copy1DRangeFrom(offset, count, src); break;
}
A->copy1DTo(dst);
for (int i = 0; i < count; i++) {
if (dst[offset + i] != src[i]) {
passed = false;
break;
}
}
delete[] src;
delete[] dst;
return passed;
}
static bool helperDoubleCopy(sp<RS> mRS, int nElems, int offset, int count, int copyMode) {
bool passed = true;
sp<Allocation> A = Allocation::createSized(mRS, Element::F64(mRS), nElems);
double *src, *dst;
src = new double[nElems];
dst = new double[nElems];
for (int i = 0; i < count; i++) {
src[i] = (double)i;
dst[offset + i] = -1;
}
switch (copyMode) {
case 0: A->copy1DFrom(src); break;
case 1: A->copy1DRangeFrom(offset, count, src); break;
}
A->copy1DTo(dst);
for (int i = 0; i < count; i++) {
if (dst[offset + i] != src[i]) {
passed = false;
break;
}
}
delete[] src;
delete[] dst;
return passed;
}
static bool helperFloatAllocationCopy(sp<RS> mRS, int nElems, int offset, int count) {
bool passed = true;
sp<Allocation> srcA = Allocation::createSized(mRS, Element::F32(mRS), nElems);
sp<Allocation> dstA = Allocation::createSized(mRS, Element::F32(mRS), nElems);
float *src, *dst;
src = new float[nElems];
dst = new float[nElems];
for (int i = 0; i < nElems; i++) {
src[i] = (float)i;
dst[i] = -1.0f;
}
// First populate the source allocation
srcA->copy1DFrom(src);
// Now test allocation to allocation copy
dstA->copy1DRangeFrom(offset, count, srcA, offset);
dstA->copy1DTo(dst);
for (int i = 0; i < count; i++) {
if (dst[offset + i] != src[offset + i]) {
passed = false;
break;
}
}
delete[] src;
delete[] dst;
return passed;
}
static int elemsToTest = 20;
extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_test1DCopy(JNIEnv * env,
jclass obj,
jstring pathObj)
{
const char * path = env->GetStringUTFChars(pathObj, NULL);
sp<RS> mRS = new RS();
mRS->init(path);
env->ReleaseStringUTFChars(pathObj, path);
bool passed = true;
for (int s = 8; s <= elemsToTest; s += 2) {
for (int mode = 0; mode < 1; mode ++) {
passed &= helperFloatCopy(mRS, s, 0, s, mode);
passed &= helperCharCopy(mRS, s, 0, s, mode);
passed &= helperShortCopy(mRS, s, 0, s, mode);
passed &= helperIntCopy(mRS, s, 0, s, mode);
//helperBaseObjCopy(mRS, s, 0, s, mode);
}
// now test copy range
for (int mode = 1; mode < 2; mode ++) {
for (int off = 0; off < s; off ++) {
for (int count = 1; count <= s - off; count ++) {
passed &= helperFloatCopy(mRS, s, off, count, mode);
passed &= helperCharCopy(mRS, s, off, count, mode);
passed &= helperShortCopy(mRS, s, off, count, mode);
passed &= helperIntCopy(mRS, s, off, count, mode);
//helperBaseObjCopy(mRS, s, off, count, mode);
}
}
}
for (int off = 0; off < s; off ++) {
for (int count = 1; count <= s - off; count ++) {
passed &= helperFloatAllocationCopy(mRS, s, off, count);
//helperByteAllocationCopy(mRS, s, off, count);
}
}
}
return passed;
}
extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSAllocationTest_testSetElementAt(JNIEnv * env,
jclass obj,
jstring pathObj)
{
const char * path = env->GetStringUTFChars(pathObj, NULL);
sp<RS> mRS = new RS();
mRS->init(path);
env->ReleaseStringUTFChars(pathObj, path);
bool passed = true;
Type::Builder b(mRS, Element::I32(mRS));
b.setX(48);
sp<Allocation> largeArray = Allocation::createTyped(mRS, b.create());
b.setX(1);
sp<Allocation> singleElement = Allocation::createTyped(mRS, b.create());
sp<ScriptC_setelementat> script = new ScriptC_setelementat(mRS);
script->set_memset_toValue(1);
script->forEach_memset(singleElement);
script->set_dimX(48);
script->set_array(largeArray);
script->forEach_setLargeArray(singleElement);
int result = 0;
script->set_compare_value(10);
script->forEach_compare(largeArray);
script->forEach_getCompareResult(singleElement);
singleElement->copy1DTo(&result);
if (result != 2) {
passed = false;
}
return passed;
}