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