blob: 64fb2629ef37ffbe04020e777cd031a4a6e4fccc [file] [log] [blame]
#include "shared.rsh"
#pragma version(1)
#pragma rs java_package_name(android.renderscript.cts)
rs_sampler gNearest;
rs_sampler gLinear;
rs_sampler gMipNearest;
rs_sampler gMipLinear;
static uchar4 lod0Color = {255, 255, 0, 0};
static uchar4 lod1Color = {255, 0, 255, 0};
static uchar4 lod2Color = {0, 255, 255, 0};
static uchar4 lod3Color = {255, 255, 255, 0};
static bool compare(float4 expected, float4 value) {
float allowedDelta = 10.0f;
float4 diff = fabs(expected - value);
if (diff.x > allowedDelta || diff.y > allowedDelta ||
diff.z > allowedDelta || diff.w > allowedDelta) {
return false;
}
return true;
}
static bool sub_test_RGBA_1D(rs_allocation alloc1D, float location, float lod,
float4 expected0, float4 expected1, float4 expected2, float4 expected3) {
bool failed = false;
float4 result = rsSample(alloc1D, gNearest, location, lod);
_RS_ASSERT(compare(expected0, result));
result = rsSample(alloc1D, gLinear, location, lod);
_RS_ASSERT(compare(expected1, result));
result = rsSample(alloc1D, gMipNearest, location, lod);
_RS_ASSERT(compare(expected2, result));
result = rsSample(alloc1D, gMipLinear, location, lod);
_RS_ASSERT(compare(expected3, result));
return !failed;
}
static bool sub_test_RGBA_2D(rs_allocation alloc2D, float2 location, float lod,
float4 expected0, float4 expected1, float4 expected2, float4 expected3) {
bool failed = false;
float4 result = rsSample(alloc2D, gNearest, location, lod);
_RS_ASSERT(compare(expected0, result));
result = rsSample(alloc2D, gLinear, location, lod);
_RS_ASSERT(compare(expected1, result));
result = rsSample(alloc2D, gMipNearest, location, lod);
_RS_ASSERT(compare(expected2, result));
result = rsSample(alloc2D, gMipLinear, location, lod);
_RS_ASSERT(compare(expected3, result));
return !failed;
}
void test_RGBA(rs_allocation alloc1D, rs_allocation alloc2D) {
bool failed = false;
float4 result;
float4 fLOD0 = rsUnpackColor8888(lod0Color);
float4 fLOD1 = rsUnpackColor8888(lod1Color);
float4 fLOD2 = rsUnpackColor8888(lod2Color);
float4 fLOD3 = rsUnpackColor8888(lod3Color);
float4 fLOD04 = fLOD0*0.6f + fLOD1*0.4f;
float4 fLOD06 = fLOD0*0.4f + fLOD1*0.6f;
// Test for proper LOD sampling behaviour
uint32_t numSamples = 5;
for (uint32_t i = 0; i < numSamples; i ++) {
float location = (float)i/(float)(numSamples - 1);
// No lod specified, should be lod 0
result = rsSample(alloc1D, gNearest, location);
_RS_ASSERT(compare(fLOD0, result));
result = rsSample(alloc1D, gLinear, location);
_RS_ASSERT(compare(fLOD0, result));
result = rsSample(alloc1D, gMipNearest, location);
_RS_ASSERT(compare(fLOD0, result));
result = rsSample(alloc1D, gMipLinear, location);
_RS_ASSERT(compare(fLOD0, result));
// Mid lod test
float lod = 0.4f;
_RS_ASSERT(sub_test_RGBA_1D(alloc1D, location, lod, fLOD0, fLOD0, fLOD0, fLOD04));
lod = 0.6f;
_RS_ASSERT(sub_test_RGBA_1D(alloc1D, location, lod, fLOD0, fLOD0, fLOD1, fLOD06));
// Base lod sample
lod = 0.0f;
_RS_ASSERT(sub_test_RGBA_1D(alloc1D, location, lod, fLOD0, fLOD0, fLOD0, fLOD0));
// lod 1 test
lod = 1.0f;
_RS_ASSERT(sub_test_RGBA_1D(alloc1D, location, lod, fLOD0, fLOD0, fLOD1, fLOD1));
// lod 2 test
lod = 2.0f;
_RS_ASSERT(sub_test_RGBA_1D(alloc1D, location, lod, fLOD0, fLOD0, fLOD2, fLOD2));
// lod 3 test
lod = 3.0f;
_RS_ASSERT(sub_test_RGBA_1D(alloc1D, location, lod, fLOD0, fLOD0, fLOD3, fLOD3));
// lod 4 test, but only have 3 lods
lod = 4.0f;
_RS_ASSERT(sub_test_RGBA_1D(alloc1D, location, lod, fLOD0, fLOD0, fLOD3, fLOD3));
// 2D case
float2 f2Location;
f2Location.x = location;
f2Location.y = location;
// No lod specified, should be lod 0
result = rsSample(alloc2D, gNearest, f2Location);
_RS_ASSERT(compare(fLOD0, result));
result = rsSample(alloc2D, gLinear, f2Location);
_RS_ASSERT(compare(fLOD0, result));
result = rsSample(alloc2D, gMipNearest, f2Location);
_RS_ASSERT(compare(fLOD0, result));
result = rsSample(alloc2D, gMipLinear, f2Location);
_RS_ASSERT(compare(fLOD0, result));
// Mid lod test
lod = 0.4f;
_RS_ASSERT(sub_test_RGBA_2D(alloc2D, f2Location, lod, fLOD0, fLOD0, fLOD0, fLOD04));
lod = 0.6f;
_RS_ASSERT(sub_test_RGBA_2D(alloc2D, f2Location, lod, fLOD0, fLOD0, fLOD1, fLOD06));
// Base lod sample
lod = 0.0f;
_RS_ASSERT(sub_test_RGBA_2D(alloc2D, f2Location, lod, fLOD0, fLOD0, fLOD0, fLOD0));
// lod 1 test
lod = 1.0f;
_RS_ASSERT(sub_test_RGBA_2D(alloc2D, f2Location, lod, fLOD0, fLOD0, fLOD1, fLOD1));
// lod 2 test
lod = 2.0f;
_RS_ASSERT(sub_test_RGBA_2D(alloc2D, f2Location, lod, fLOD0, fLOD0, fLOD2, fLOD2));
// lod 2 test
lod = 3.0f;
_RS_ASSERT(sub_test_RGBA_2D(alloc2D, f2Location, lod, fLOD0, fLOD0, fLOD3, fLOD3));
// lod 4 test, but only have 3 lods
lod = 4.0f;
_RS_ASSERT(sub_test_RGBA_2D(alloc2D, f2Location, lod, fLOD0, fLOD0, fLOD3, fLOD3));
}
if (failed) {
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
}
else {
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
}
}