blob: 2655573be53c397795787855db0de598e9e05f3c [file] [log] [blame]
/*
* Copyright (C) 2017 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.
*/
package android.hardware.cts;
import android.hardware.HardwareBuffer;
import android.opengl.EGL14;
import android.opengl.EGLConfig;
import android.opengl.EGLContext;
import android.opengl.EGLDisplay;
import android.opengl.EGLSurface;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import static android.opengl.EGL14.EGL_HEIGHT;
import static android.opengl.EGL14.EGL_NONE;
import static android.opengl.EGL14.EGL_NO_CONTEXT;
import static android.opengl.EGL14.EGL_NO_SURFACE;
import static android.opengl.EGL14.EGL_WIDTH;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Test {@link HardwareBuffer}.
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
public class HardwareBufferTest {
private static boolean sHasFloatBuffers;
@SuppressWarnings("SameParameterValue")
private static native HardwareBuffer nativeCreateHardwareBuffer(int width, int height,
int format, int layers, long usage);
private static native void nativeReleaseHardwareBuffer(HardwareBuffer hardwareBufferObj);
static {
System.loadLibrary("ctshardware_jni");
}
@BeforeClass
public static void hasFloatBuffers() {
EGLDisplay eglDisplay = null;
EGLContext eglContext = null;
EGLSurface eglSurface = null;
try {
eglDisplay = Egl14Utils.createEglDisplay();
EGLConfig eglConfig = Egl14Utils.getEglConfig(eglDisplay, 2);
eglContext = Egl14Utils.createEglContext(eglDisplay, eglConfig, 2);
eglSurface = EGL14.eglCreatePbufferSurface(eglDisplay, eglConfig, new int[] {
EGL_WIDTH, 1,
EGL_HEIGHT, 1,
EGL_NONE
}, 0);
EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
sHasFloatBuffers = GlUtils.getMajorVersion() >= 3 ||
GlUtils.hasExtensions("GL_OES_texture_half_float",
"GL_OES_texture_half_float_linear");
EGL14.eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
EGL14.eglDestroySurface(eglDisplay, eglSurface);
Egl14Utils.destroyEglContext(eglDisplay, eglContext);
Egl14Utils.releaseAndTerminate(eglDisplay);
eglDisplay = null;
eglContext = null;
eglSurface = null;
} finally {
if (eglDisplay != null) {
if (eglContext != null) {
EGL14.eglDestroyContext(eglDisplay, eglContext);
}
if (eglSurface != null) {
EGL14.eglDestroySurface(eglDisplay, eglSurface);
}
EGL14.eglTerminate(eglDisplay);
}
}
}
@Test
public void testCreate() {
HardwareBuffer buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGBA_8888, 1,
HardwareBuffer.USAGE0_CPU_READ);
assertTrue(buffer != null);
assertEquals(2, buffer.getWidth());
assertEquals(4, buffer.getHeight());
assertEquals(HardwareBuffer.RGBA_8888, buffer.getFormat());
assertEquals(1, buffer.getLayers());
assertEquals(HardwareBuffer.USAGE0_CPU_READ, buffer.getUsage());
buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGBX_8888, 1,
HardwareBuffer.USAGE0_CPU_READ);
assertEquals(HardwareBuffer.RGBX_8888, buffer.getFormat());
buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGB_888, 1,
HardwareBuffer.USAGE0_CPU_READ);
assertEquals(HardwareBuffer.RGB_888, buffer.getFormat());
buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGB_565, 1,
HardwareBuffer.USAGE0_CPU_READ);
assertEquals(HardwareBuffer.RGB_565, buffer.getFormat());
buffer = HardwareBuffer.create(2, 1, HardwareBuffer.BLOB, 1,
HardwareBuffer.USAGE0_CPU_READ);
assertEquals(HardwareBuffer.BLOB, buffer.getFormat());
if (sHasFloatBuffers) {
buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGBA_FP16, 1,
HardwareBuffer.USAGE0_CPU_READ);
assertEquals(HardwareBuffer.RGBA_FP16, buffer.getFormat());
buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGBA_1010102, 1,
HardwareBuffer.USAGE0_CPU_READ);
assertEquals(HardwareBuffer.RGBA_1010102, buffer.getFormat());
}
}
@SuppressWarnings("EmptyCatchBlock")
@Test
public void testCreateFailsWithInvalidArguments() {
HardwareBuffer buffer = null;
try {
buffer = HardwareBuffer.create(0, 4, HardwareBuffer.RGB_888, 1,
HardwareBuffer.USAGE0_CPU_READ);
} catch (IllegalArgumentException e) {}
assertEquals(null, buffer);
try {
buffer = HardwareBuffer.create(2, 0, HardwareBuffer.RGB_888, 1,
HardwareBuffer.USAGE0_CPU_READ);
} catch (IllegalArgumentException e) {}
assertEquals(null, buffer);
try {
buffer = HardwareBuffer.create(2, 4, 0, 1,
HardwareBuffer.USAGE0_CPU_READ);
} catch (IllegalArgumentException e) {}
assertEquals(null, buffer);
try {
buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGB_888, -1,
HardwareBuffer.USAGE0_CPU_READ);
} catch (IllegalArgumentException e) {}
assertEquals(null, buffer);
try {
buffer = HardwareBuffer.create(2, 2, HardwareBuffer.BLOB, 1,
HardwareBuffer.USAGE0_CPU_READ);
} catch (IllegalArgumentException e) {}
assertEquals(null, buffer);
if (sHasFloatBuffers) {
try {
buffer = HardwareBuffer.create(0, 4, HardwareBuffer.RGBA_FP16, 1,
HardwareBuffer.USAGE0_CPU_READ);
} catch (IllegalArgumentException e) {
}
assertEquals(null, buffer);
try {
buffer = HardwareBuffer.create(0, 4, HardwareBuffer.RGBA_1010102, 1,
HardwareBuffer.USAGE0_CPU_READ);
} catch (IllegalArgumentException e) {
}
assertEquals(null, buffer);
}
}
@Test
public void testCreateFromNativeObject() {
HardwareBuffer buffer = nativeCreateHardwareBuffer(2, 4, HardwareBuffer.RGBA_8888, 1,
HardwareBuffer.USAGE0_CPU_READ);
assertTrue(buffer != null);
assertEquals(2, buffer.getWidth());
assertEquals(4, buffer.getHeight());
assertEquals(HardwareBuffer.RGBA_8888, buffer.getFormat());
assertEquals(1, buffer.getLayers());
assertEquals(HardwareBuffer.USAGE0_CPU_READ, buffer.getUsage());
nativeReleaseHardwareBuffer(buffer);
}
}