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 30cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(mANW.get(), 31cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza texWidth, texHeight, HAL_PIXEL_FORMAT_RGBA_8888)); 32cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_set_usage(mANW.get(), 33cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN)); 34cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 35cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza android_native_buffer_t* anb; 36cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), 37cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb)); 38cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(anb != NULL); 39cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 40cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 41cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 42cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Fill the buffer with green 43cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza uint8_t* img = NULL; 44cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 45cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza fillRGBA8BufferSolid(img, texWidth, texHeight, buf->getStride(), 0, 255, 46cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 0, 255); 47cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->unlock(); 48cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), buf->getNativeBuffer(), 49cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza -1)); 50cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 51cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 52cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 53cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glBindFramebuffer(GL_FRAMEBUFFER, mFbo); 54cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 55cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glBindFramebuffer(GL_FRAMEBUFFER, 0); 56cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 57cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza for (int i = 0; i < 4; i++) { 58cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza SCOPED_TRACE(String8::format("frame %d", i).string()); 59cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 60cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(mANW.get(), 61cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza &anb)); 62cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_TRUE(anb != NULL); 63cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 64cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf = new GraphicBuffer(anb, false); 65cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 66cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza // Fill the buffer with red 67cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, 68cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza (void**)(&img))); 69cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza fillRGBA8BufferSolid(img, texWidth, texHeight, buf->getStride(), 255, 0, 70cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 0, 255); 71cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, buf->unlock()); 72cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mANW->queueBuffer(mANW.get(), 73cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza buf->getNativeBuffer(), -1)); 74cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 75cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza ASSERT_EQ(NO_ERROR, mST->updateTexImage()); 76cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 77cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza drawTexture(); 78cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 79cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 24, 39, 255, 0, 0, 255)); 80cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza } 81cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 82cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza glBindFramebuffer(GL_FRAMEBUFFER, mFbo); 83cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 84cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza EXPECT_TRUE(checkPixel( 24, 39, 0, 255, 0, 255)); 85cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} 86cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza 87cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} // namespace android 88