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