1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.hardware.cts; 18 19import android.hardware.HardwareBuffer; 20import android.opengl.EGL14; 21import android.opengl.EGLConfig; 22import android.opengl.EGLContext; 23import android.opengl.EGLDisplay; 24import android.opengl.EGLSurface; 25import android.support.test.filters.SmallTest; 26import android.support.test.runner.AndroidJUnit4; 27import org.junit.BeforeClass; 28import org.junit.Test; 29import org.junit.runner.RunWith; 30 31import static android.opengl.EGL14.EGL_HEIGHT; 32import static android.opengl.EGL14.EGL_NONE; 33import static android.opengl.EGL14.EGL_NO_CONTEXT; 34import static android.opengl.EGL14.EGL_NO_SURFACE; 35import static android.opengl.EGL14.EGL_WIDTH; 36import static org.junit.Assert.assertEquals; 37import static org.junit.Assert.assertTrue; 38 39/** 40 * Test {@link HardwareBuffer}. 41 */ 42@SmallTest 43@RunWith(AndroidJUnit4.class) 44public class HardwareBufferTest { 45 private static boolean sHasFloatBuffers; 46 47 @SuppressWarnings("SameParameterValue") 48 private static native HardwareBuffer nativeCreateHardwareBuffer(int width, int height, 49 int format, int layers, long usage); 50 private static native void nativeReleaseHardwareBuffer(HardwareBuffer hardwareBufferObj); 51 52 static { 53 System.loadLibrary("ctshardware_jni"); 54 } 55 56 @BeforeClass 57 public static void hasFloatBuffers() { 58 EGLDisplay eglDisplay = null; 59 EGLContext eglContext = null; 60 EGLSurface eglSurface = null; 61 try { 62 eglDisplay = Egl14Utils.createEglDisplay(); 63 EGLConfig eglConfig = Egl14Utils.getEglConfig(eglDisplay, 2); 64 eglContext = Egl14Utils.createEglContext(eglDisplay, eglConfig, 2); 65 66 eglSurface = EGL14.eglCreatePbufferSurface(eglDisplay, eglConfig, new int[] { 67 EGL_WIDTH, 1, 68 EGL_HEIGHT, 1, 69 EGL_NONE 70 }, 0); 71 EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext); 72 73 sHasFloatBuffers = GlUtils.getMajorVersion() >= 3 || 74 GlUtils.hasExtensions("GL_OES_texture_half_float", 75 "GL_OES_texture_half_float_linear"); 76 77 EGL14.eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 78 EGL14.eglDestroySurface(eglDisplay, eglSurface); 79 80 Egl14Utils.destroyEglContext(eglDisplay, eglContext); 81 Egl14Utils.releaseAndTerminate(eglDisplay); 82 83 eglDisplay = null; 84 eglContext = null; 85 eglSurface = null; 86 } finally { 87 if (eglDisplay != null) { 88 if (eglContext != null) { 89 EGL14.eglDestroyContext(eglDisplay, eglContext); 90 } 91 if (eglSurface != null) { 92 EGL14.eglDestroySurface(eglDisplay, eglSurface); 93 } 94 EGL14.eglTerminate(eglDisplay); 95 } 96 } 97 } 98 99 @Test 100 public void testCreate() { 101 HardwareBuffer buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGBA_8888, 1, 102 HardwareBuffer.USAGE_CPU_READ_RARELY); 103 assertTrue(buffer != null); 104 assertEquals(2, buffer.getWidth()); 105 assertEquals(4, buffer.getHeight()); 106 assertEquals(HardwareBuffer.RGBA_8888, buffer.getFormat()); 107 assertEquals(1, buffer.getLayers()); 108 assertEquals(HardwareBuffer.USAGE_CPU_READ_RARELY, buffer.getUsage()); 109 110 buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGBX_8888, 1, 111 HardwareBuffer.USAGE_CPU_READ_RARELY); 112 assertEquals(HardwareBuffer.RGBX_8888, buffer.getFormat()); 113 buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGB_888, 1, 114 HardwareBuffer.USAGE_CPU_READ_RARELY); 115 assertEquals(HardwareBuffer.RGB_888, buffer.getFormat()); 116 buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGB_565, 1, 117 HardwareBuffer.USAGE_CPU_READ_RARELY); 118 assertEquals(HardwareBuffer.RGB_565, buffer.getFormat()); 119 buffer = HardwareBuffer.create(2, 1, HardwareBuffer.BLOB, 1, 120 HardwareBuffer.USAGE_CPU_READ_RARELY); 121 assertEquals(HardwareBuffer.BLOB, buffer.getFormat()); 122 123 if (sHasFloatBuffers) { 124 buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGBA_FP16, 1, 125 HardwareBuffer.USAGE_CPU_READ_RARELY); 126 assertEquals(HardwareBuffer.RGBA_FP16, buffer.getFormat()); 127 buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGBA_1010102, 1, 128 HardwareBuffer.USAGE_CPU_READ_RARELY); 129 assertEquals(HardwareBuffer.RGBA_1010102, buffer.getFormat()); 130 } 131 } 132 133 @SuppressWarnings("EmptyCatchBlock") 134 @Test 135 public void testCreateFailsWithInvalidArguments() { 136 HardwareBuffer buffer = null; 137 try { 138 buffer = HardwareBuffer.create(0, 4, HardwareBuffer.RGB_888, 1, 139 HardwareBuffer.USAGE_CPU_READ_RARELY); 140 } catch (IllegalArgumentException e) {} 141 assertEquals(null, buffer); 142 try { 143 buffer = HardwareBuffer.create(2, 0, HardwareBuffer.RGB_888, 1, 144 HardwareBuffer.USAGE_CPU_READ_RARELY); 145 } catch (IllegalArgumentException e) {} 146 assertEquals(null, buffer); 147 try { 148 buffer = HardwareBuffer.create(2, 4, 0, 1, 149 HardwareBuffer.USAGE_CPU_READ_RARELY); 150 } catch (IllegalArgumentException e) {} 151 assertEquals(null, buffer); 152 try { 153 buffer = HardwareBuffer.create(2, 4, HardwareBuffer.RGB_888, -1, 154 HardwareBuffer.USAGE_CPU_READ_RARELY); 155 } catch (IllegalArgumentException e) {} 156 assertEquals(null, buffer); 157 try { 158 buffer = HardwareBuffer.create(2, 2, HardwareBuffer.BLOB, 1, 159 HardwareBuffer.USAGE_CPU_READ_RARELY); 160 } catch (IllegalArgumentException e) {} 161 assertEquals(null, buffer); 162 163 if (sHasFloatBuffers) { 164 try { 165 buffer = HardwareBuffer.create(0, 4, HardwareBuffer.RGBA_FP16, 1, 166 HardwareBuffer.USAGE_CPU_READ_RARELY); 167 } catch (IllegalArgumentException e) { 168 } 169 assertEquals(null, buffer); 170 try { 171 buffer = HardwareBuffer.create(0, 4, HardwareBuffer.RGBA_1010102, 1, 172 HardwareBuffer.USAGE_CPU_READ_RARELY); 173 } catch (IllegalArgumentException e) { 174 } 175 assertEquals(null, buffer); 176 } 177 } 178 179 @Test 180 public void testCreateFromNativeObject() { 181 HardwareBuffer buffer = nativeCreateHardwareBuffer(2, 4, HardwareBuffer.RGBA_8888, 1, 182 HardwareBuffer.USAGE_CPU_READ_RARELY); 183 assertTrue(buffer != null); 184 assertEquals(2, buffer.getWidth()); 185 assertEquals(4, buffer.getHeight()); 186 assertEquals(HardwareBuffer.RGBA_8888, buffer.getFormat()); 187 assertEquals(1, buffer.getLayers()); 188 assertEquals(HardwareBuffer.USAGE_CPU_READ_RARELY, buffer.getUsage()); 189 nativeReleaseHardwareBuffer(buffer); 190 } 191} 192