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 "SurfaceTextureFBO_test" 18cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza//#define LOG_NDEBUG 0 19cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 20cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include "SurfaceTextureFBO.h" 21cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 22cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozanamespace android { 23cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 24cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// This test is intended to verify that proper synchronization is done when 25cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// rendering into an FBO. 26cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureFBOTest, BlitFromCpuFilledBufferToFbo) { 27cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texWidth = 64; 28cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza const int texHeight = 64; 29cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 30583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(NO_ERROR, native_window_api_connect(mANW.get(), 31583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos NATIVE_WINDOW_API_CPU)); 32f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_buffers_dimensions(mANW.get(), 33f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza texWidth, texHeight)); 34f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_buffers_format(mANW.get(), 35f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza HAL_PIXEL_FORMAT_RGBA_8888)); 36cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 37cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 38cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 39cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza android_native_buffer_t* anb; 40cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), 41cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb)); 42cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(anb != NULL); 43cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 44cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 45cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 46cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Fill the buffer with green 47cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza uint8_t* img = NULL; 48cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 49cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza fillRGBA8BufferSolid(img, texWidth, texHeight, buf->getStride(), 0, 255, 50cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 0, 255); 51cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->unlock(); 52cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer(), 53cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza -1)); 54cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 55cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 56cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 57cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glBindFramebuffer(GL_FRAMEBUFFER, mFbo); 58cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 59cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glBindFramebuffer(GL_FRAMEBUFFER, 0); 60cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 61cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int i = 0; i < 4; i++) { 62cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza SCOPED_TRACE(String8::format("frame %d", i).string()); 63cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 64cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), 65cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb)); 66cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(anb != NULL); 67cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 68cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf = new GraphicBuffer(anb, false); 69cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 70cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Fill the buffer with red 71cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, 72cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza (void**)(&img))); 73cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza fillRGBA8BufferSolid(img, texWidth, texHeight, buf->getStride(), 255, 0, 74cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 0, 255); 75cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, buf->unlock()); 76cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), 77cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->getNativeBuffer(), -1)); 78cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 79cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 80cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 81cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 82cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 83cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 24, 39, 255, 0, 0, 255)); 84cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 85cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 86cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glBindFramebuffer(GL_FRAMEBUFFER, mFbo); 87cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 88cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 24, 39, 0, 255, 0, 255)); 89cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 90cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 91cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} // namespace android 92