1cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza/* 2cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Copyright 2013 The Android Open Source Project 3cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 4cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 5cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * you may not use this file except in compliance with the License. 6cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * You may obtain a copy of the License at 7cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 8cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * http://www.apache.org/licenses/LICENSE-2.0 9cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * 10cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Unless required by applicable law or agreed to in writing, software 11cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 12cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * See the License for the specific language governing permissions and 14cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * limitations under the License. 15cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza */ 16cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 17cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#define LOG_TAG "MultiTextureConsumer_test" 18cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza//#define LOG_NDEBUG 0 19cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 20cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include "GLTest.h" 21cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 22cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include <gui/GLConsumer.h> 23cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include <gui/Surface.h> 24cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 25cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include <android/native_window.h> 26cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 27cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include <GLES/glext.h> 28cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 29cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozanamespace android { 30cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 31cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozaclass MultiTextureConsumerTest : public GLTest { 32cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozaprotected: 33cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza enum { TEX_ID = 123 }; 34cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 35cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza virtual void SetUp() { 36cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLTest::SetUp(); 375603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<IGraphicBufferProducer> producer; 385603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<IGraphicBufferConsumer> consumer; 395603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza BufferQueue::createBufferQueue(&producer, &consumer); 40e49ba8e2ed8e17156eb00c8fc8e2285df62bc018Dan Stoza mGlConsumer = new GLConsumer(consumer, TEX_ID, 41e49ba8e2ed8e17156eb00c8fc8e2285df62bc018Dan Stoza GLConsumer::TEXTURE_EXTERNAL, true, false); 425603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza mSurface = new Surface(producer); 43cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mANW = mSurface.get(); 44cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 45cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 46cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza virtual void TearDown() { 47cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLTest::TearDown(); 48cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 49cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza virtual EGLint const* getContextAttribs() { 50cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return NULL; 51cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 52cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza virtual EGLint const* getConfigAttribs() { 53cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza static EGLint sDefaultConfigAttribs[] = { 54cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, 55cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_RED_SIZE, 8, 56cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_GREEN_SIZE, 8, 57cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_BLUE_SIZE, 8, 58cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_ALPHA_SIZE, 8, 59cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EGL_NONE }; 60cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 61cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza return sDefaultConfigAttribs; 62cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 63cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GLConsumer> mGlConsumer; 64cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<Surface> mSurface; 65cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindow* mANW; 66cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}; 67cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 68cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(MultiTextureConsumerTest, EGLImageTargetWorks) { 69cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ANativeWindow_Buffer buffer; 70cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 71cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(native_window_set_usage(mANW, GRALLOC_USAGE_SW_WRITE_OFTEN), NO_ERROR); 72cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(native_window_set_buffers_format(mANW, HAL_PIXEL_FORMAT_RGBA_8888), NO_ERROR); 73cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 74cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glShadeModel(GL_FLAT); 75cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDisable(GL_DITHER); 76cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDisable(GL_CULL_FACE); 77cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glViewport(0, 0, getSurfaceWidth(), getSurfaceHeight()); 78cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glOrthof(0, getSurfaceWidth(), 0, getSurfaceHeight(), 0, 1); 79cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glEnableClientState(GL_VERTEX_ARRAY); 80cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glColor4f(1, 1, 1, 1); 81cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 82cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glBindTexture(GL_TEXTURE_EXTERNAL_OES, TEX_ID); 83cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 84cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 85cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 86cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 87cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 88cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza uint32_t texel = 0x80808080; 89cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glBindTexture(GL_TEXTURE_2D, TEX_ID+1); 90cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texel); 91cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 92cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 93cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 94cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 95cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 96cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glActiveTexture(GL_TEXTURE1); 97cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glBindTexture(GL_TEXTURE_2D, TEX_ID+1); 98cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glEnable(GL_TEXTURE_2D); 99cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 100cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 101cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glActiveTexture(GL_TEXTURE0); 102cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glBindTexture(GL_TEXTURE_EXTERNAL_OES, TEX_ID); 103cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glEnable(GL_TEXTURE_EXTERNAL_OES); 104cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 105cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 106cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glClear(GL_COLOR_BUFFER_BIT); 107cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int i=0 ; i<8 ; i++) { 108cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSurface->lock(&buffer, NULL); 109cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza memset(buffer.bits, (i&7) * 0x20, buffer.stride * buffer.height * 4); 110cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mSurface->unlockAndPost(); 111cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 112cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza mGlConsumer->updateTexImage(); 113cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 114cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GLfloat vertices[][2] = { {i*16.0f, 0}, {(i+1)*16.0f, 0}, {(i+1)*16.0f, 16.0f}, {i*16.0f, 16.0f} }; 115cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glVertexPointer(2, GL_FLOAT, 0, vertices); 116cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 117cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 118cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(GLenum(GL_NO_ERROR), glGetError()); 119cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 120cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 121cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int i=0 ; i<8 ; i++) { 122cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel(i*16 + 8, 8, i*16, i*16, i*16, i*16, 0)); 123cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 124cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 125cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 126cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} // namespace android 127