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 "SurfaceTextureGLToGL_test"
18cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza//#define LOG_NDEBUG 0
19cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
20cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include "SurfaceTextureGLToGL.h"
21cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
22cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozanamespace android {
23cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
24cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, TransformHintGetsRespected) {
25cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    const uint32_t texWidth = 32;
26cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    const uint32_t texHeight = 64;
27cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
28cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->setDefaultBufferSize(texWidth, texHeight);
29cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->setTransformHint(NATIVE_WINDOW_TRANSFORM_ROT_90);
30cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
31cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This test requires 3 buffers to avoid deadlock because we're
3219e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    // both producer and consumer, and only using one thread. Set max dequeued
3319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    // to 2, and max acquired already defaults to 1.
3419e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    ASSERT_EQ(OK, mSTC->setMaxDequeuedBufferCount(2));
35cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
36b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos    SetUpWindowAndContext();
37b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos
38cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Do the producer side of things
39cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
40cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mProducerEglSurface, mProducerEglContext));
41cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
42cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
43cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Start a buffer with our chosen size and transform hint moving
44cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // through the system.
45cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);  // give the driver something to do
46cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
47cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->updateTexImage();  // consume it
48cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Swap again.
49cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
50cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
51cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->updateTexImage();
52cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
53cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // The current buffer should either show the effects of the transform
54cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // hint (in the form of an inverse transform), or show that the
55cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // transform hint has been ignored.
56cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    sp<GraphicBuffer> buf = mST->getCurrentBuffer();
57cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    if (mST->getCurrentTransform() == NATIVE_WINDOW_TRANSFORM_ROT_270) {
58cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(texWidth, buf->getHeight());
59cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(texHeight, buf->getWidth());
60cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    } else {
61cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(texWidth, buf->getWidth());
62cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(texHeight, buf->getHeight());
63cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    }
64cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
65cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Reset the transform hint and confirm that it takes.
66cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->setTransformHint(0);
67cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
68cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
69cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->updateTexImage();
70cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
71cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
72cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->updateTexImage();
73cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
74cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    buf = mST->getCurrentBuffer();
75cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ((uint32_t) 0, mST->getCurrentTransform());
76cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(texWidth, buf->getWidth());
77cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(texHeight, buf->getHeight());
78cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}
79cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
80cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, TexturingFromGLFilledRGBABufferPow2) {
81cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    const int texWidth = 64;
82cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    const int texHeight = 64;
83cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
84cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->setDefaultBufferSize(texWidth, texHeight);
85cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
86cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This test requires 3 buffers to complete run on a single thread.
8719e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    // Set max dequeued to 2, and max acquired already defaults to 1.
8819e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    ASSERT_EQ(OK, mSTC->setMaxDequeuedBufferCount(2));
89cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
90b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos    SetUpWindowAndContext();
91b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos
92cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Do the producer side of things
93cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
94cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mProducerEglSurface, mProducerEglContext));
95cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
96cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
97cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This is needed to ensure we pick up a buffer of the correct size.
98cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
99cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
100cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(0.6, 0.6, 0.6, 0.6);
101cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
102cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
103cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glEnable(GL_SCISSOR_TEST);
104cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glScissor(4, 4, 4, 4);
105cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(1.0, 0.0, 0.0, 1.0);
106cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
107cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
108cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glScissor(24, 48, 4, 4);
109cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(0.0, 1.0, 0.0, 1.0);
110cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
111cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
112cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glScissor(37, 17, 4, 4);
113cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(0.0, 0.0, 1.0, 1.0);
114cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
115cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
116cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
117cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
118cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Do the consumer side of things
119cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
120cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mEglContext));
121cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
122cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
123cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glDisable(GL_SCISSOR_TEST);
124cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
125cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Skip the first frame, which was empty
126cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(NO_ERROR, mST->updateTexImage());
127cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(NO_ERROR, mST->updateTexImage());
128cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
129cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(0.2, 0.2, 0.2, 0.2);
130cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
131cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
132cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glViewport(0, 0, texWidth, texHeight);
133cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    drawTexture();
134cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
135cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 0,  0, 153, 153, 153, 153));
136cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(63,  0, 153, 153, 153, 153));
137cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(63, 63, 153, 153, 153, 153));
138cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 0, 63, 153, 153, 153, 153));
139cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
140cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 4,  7, 255,   0,   0, 255));
141cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(25, 51,   0, 255,   0, 255));
142cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(40, 19,   0,   0, 255, 255));
143cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(29, 51, 153, 153, 153, 153));
144cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 5, 32, 153, 153, 153, 153));
145cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(13,  8, 153, 153, 153, 153));
146cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(46,  3, 153, 153, 153, 153));
147cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(30, 33, 153, 153, 153, 153));
148cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 6, 52, 153, 153, 153, 153));
149cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(55, 33, 153, 153, 153, 153));
150cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(16, 29, 153, 153, 153, 153));
151cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 1, 30, 153, 153, 153, 153));
152cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(41, 37, 153, 153, 153, 153));
153cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(46, 29, 153, 153, 153, 153));
154cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(15, 25, 153, 153, 153, 153));
155cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 3, 52, 153, 153, 153, 153));
156cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}
157cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
158cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, EglDestroySurfaceUnrefsBuffers) {
159b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos    SetUpWindowAndContext();
160cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    sp<GraphicBuffer> buffers[2];
161cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
162cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This test requires async mode to run on a single thread.
163cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
164cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mProducerEglSurface, mProducerEglContext));
165cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
166cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglSwapInterval(mEglDisplay, 0));
167cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
168cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
169cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    for (int i = 0; i < 2; i++) {
170cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        // Produce a frame
171cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
172cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza                mProducerEglSurface, mProducerEglContext));
173cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(EGL_SUCCESS, eglGetError());
174cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        glClear(GL_COLOR_BUFFER_BIT);
175cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        eglSwapBuffers(mEglDisplay, mProducerEglSurface);
176cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
177cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        // Consume a frame
178cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
179cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza                mEglContext));
180cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(EGL_SUCCESS, eglGetError());
181cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        mFW->waitForFrame();
182cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(NO_ERROR, mST->updateTexImage());
183cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        buffers[i] = mST->getCurrentBuffer();
184cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    }
185cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
186cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Destroy the GL texture object to release its ref on buffers[2].
187cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    GLuint texID = TEX_ID;
188cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glDeleteTextures(1, &texID);
189cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
190cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Destroy the EGLSurface
191cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface));
192cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
193cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mProducerEglSurface = EGL_NO_SURFACE;
194cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
195cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This test should have the only reference to buffer 0.
196cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_EQ(1, buffers[0]->getStrongCount());
197cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
198d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine    // The GLConsumer should hold one reference to buffer 1 in its
199d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine    // mCurrentTextureImage member and another reference in mEglSlots. The third
200d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine    // reference is in this test.
201d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine    EXPECT_EQ(3, buffers[1]->getStrongCount());
202cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}
203cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
204cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, EglDestroySurfaceAfterAbandonUnrefsBuffers) {
205b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos    SetUpWindowAndContext();
206cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    sp<GraphicBuffer> buffers[3];
207cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
208cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This test requires async mode to run on a single thread.
209cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
210cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mProducerEglSurface, mProducerEglContext));
211cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
212cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglSwapInterval(mEglDisplay, 0));
213cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
214cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
215cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    for (int i = 0; i < 3; i++) {
216cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        // Produce a frame
217cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
218cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza                mProducerEglSurface, mProducerEglContext));
219cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(EGL_SUCCESS, eglGetError());
220cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        glClear(GL_COLOR_BUFFER_BIT);
221cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        EXPECT_TRUE(eglSwapBuffers(mEglDisplay, mProducerEglSurface));
222cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(EGL_SUCCESS, eglGetError());
223cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
224cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        // Consume a frame
225cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
226cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza                mEglContext));
227cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(EGL_SUCCESS, eglGetError());
228cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        mFW->waitForFrame();
229cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        ASSERT_EQ(NO_ERROR, mST->updateTexImage());
230cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        buffers[i] = mST->getCurrentBuffer();
231cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    }
232cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
233cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Abandon the GLConsumer, releasing the ref that the GLConsumer has
234cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // on buffers[2].
235cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->abandon();
236cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
237cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Destroy the GL texture object to release its ref on buffers[2].
238cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    GLuint texID = TEX_ID;
239cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glDeleteTextures(1, &texID);
240cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
241cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Destroy the EGLSurface.
242cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface));
243cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
244cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mProducerEglSurface = EGL_NO_SURFACE;
245cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
246cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_EQ(1, buffers[1]->getStrongCount());
247cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
248cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Depending on how lazily the GL driver dequeues buffers, we may end up
249d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine    // with either two or three total buffers.  If there are three, each entry
250d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine    // of the buffers array will be unique and there should only be one
251d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine    // reference (the one in this test). If there are two the first and last
252d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine    // element in the array will be equal meaning that buffer representing both
253d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine    // 0 and 2 will have two references (one for 0 and one for 2).
254cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    if (buffers[2] != buffers[0]) {
255d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine        EXPECT_EQ(1, buffers[0]->getStrongCount());
256cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        EXPECT_EQ(1, buffers[2]->getStrongCount());
257d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine    } else {
258d8ead0ccd4b700e43a78efe9b140d4a069dc343dMichael Lentine        EXPECT_EQ(2, buffers[0]->getStrongCount());
259cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    }
260cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}
261cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
262cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, EglMakeCurrentBeforeConsumerDeathUnrefsBuffers) {
263b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos    SetUpWindowAndContext();
264cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    sp<GraphicBuffer> buffer;
265cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
266cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
267cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mProducerEglSurface, mProducerEglContext));
268cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
269cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Produce a frame
270cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
271cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglSwapBuffers(mEglDisplay, mProducerEglSurface));
272cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
273cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
274cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Destroy the EGLSurface.
275cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface));
276cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
277cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mProducerEglSurface = EGL_NO_SURFACE;
278cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mSTC.clear();
279cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mANW.clear();
280cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mTextureRenderer.clear();
281cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
282cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Consume a frame
283cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(NO_ERROR, mST->updateTexImage());
284cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    buffer = mST->getCurrentBuffer();
285cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
286cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Destroy the GL texture object to release its ref
287cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    GLuint texID = TEX_ID;
288cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glDeleteTextures(1, &texID);
289cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
290cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // make un-current, all references to buffer should be gone
291cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE,
292cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            EGL_NO_SURFACE, EGL_NO_CONTEXT));
293cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
294cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Destroy consumer
295cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST.clear();
296cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
297cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_EQ(1, buffer->getStrongCount());
298cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}
299cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
300cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, EglMakeCurrentAfterConsumerDeathUnrefsBuffers) {
301b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos    SetUpWindowAndContext();
302cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    sp<GraphicBuffer> buffer;
303cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
304cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
305cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mProducerEglSurface, mProducerEglContext));
306cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
307cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Produce a frame
308cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
309cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglSwapBuffers(mEglDisplay, mProducerEglSurface));
310cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
311cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
312cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Destroy the EGLSurface.
313cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglDestroySurface(mEglDisplay, mProducerEglSurface));
314cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
315cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mProducerEglSurface = EGL_NO_SURFACE;
316cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mSTC.clear();
317cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mANW.clear();
318cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mTextureRenderer.clear();
319cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
320cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Consume a frame
321cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(NO_ERROR, mST->updateTexImage());
322cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    buffer = mST->getCurrentBuffer();
323cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
324cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Destroy the GL texture object to release its ref
325cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    GLuint texID = TEX_ID;
326cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glDeleteTextures(1, &texID);
327cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
328cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Destroy consumer
329cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST.clear();
330cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
331cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // make un-current, all references to buffer should be gone
332cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE,
333cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            EGL_NO_SURFACE, EGL_NO_CONTEXT));
334cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
335cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_EQ(1, buffer->getStrongCount());
336cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}
337cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
338cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, TexturingFromUserSizedGLFilledBuffer) {
339cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    enum { texWidth = 64 };
340cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    enum { texHeight = 64 };
341cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
342cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This test requires 3 buffers to complete run on a single thread.
34319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    // Set max dequeued to 2, and max acquired already defaults to 1.
34419e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    ASSERT_EQ(OK, mSTC->setMaxDequeuedBufferCount(2));
345cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
346b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos    SetUpWindowAndContext();
347b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos
348cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Set the user buffer size.
349cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    native_window_set_buffers_user_dimensions(mANW.get(), texWidth, texHeight);
350cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
351cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Do the producer side of things
352cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
353cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mProducerEglSurface, mProducerEglContext));
354cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
355cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
356cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This is needed to ensure we pick up a buffer of the correct size.
357cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
358cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
359cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(0.6, 0.6, 0.6, 0.6);
360cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
361cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
362cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glEnable(GL_SCISSOR_TEST);
363cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glScissor(4, 4, 1, 1);
364cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(1.0, 0.0, 0.0, 1.0);
365cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
366cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
367cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
368cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
369cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Do the consumer side of things
370cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
371cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mEglContext));
372cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
373cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
374cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glDisable(GL_SCISSOR_TEST);
375cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
376cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Skip the first frame, which was empty
377cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(NO_ERROR, mST->updateTexImage());
378cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(NO_ERROR, mST->updateTexImage());
379cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
380cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(0.2, 0.2, 0.2, 0.2);
381cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
382cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
383cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glViewport(0, 0, texWidth, texHeight);
384cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    drawTexture();
385cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
386cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 0,  0, 153, 153, 153, 153));
387cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(63,  0, 153, 153, 153, 153));
388cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(63, 63, 153, 153, 153, 153));
389cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 0, 63, 153, 153, 153, 153));
390cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
391cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 4,  4, 255,   0,   0, 255));
392cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 5,  5, 153, 153, 153, 153));
393cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 3,  3, 153, 153, 153, 153));
394cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(45, 52, 153, 153, 153, 153));
395cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(12, 36, 153, 153, 153, 153));
396cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}
397cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
398cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, TexturingFromPreRotatedUserSizedGLFilledBuffer) {
399cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    enum { texWidth = 64 };
400cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    enum { texHeight = 16 };
401cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
402cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This test requires 3 buffers to complete run on a single thread.
40319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    // Set max dequeued to 2, and max acquired already defaults to 1.
40419e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    ASSERT_EQ(OK, mSTC->setMaxDequeuedBufferCount(2));
405cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
406b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos    SetUpWindowAndContext();
407b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos
408cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Set the transform hint.
409cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->setTransformHint(NATIVE_WINDOW_TRANSFORM_ROT_90);
410cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
411cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Set the user buffer size.
412cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    native_window_set_buffers_user_dimensions(mANW.get(), texWidth, texHeight);
413cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
414cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Do the producer side of things
415cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
416cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mProducerEglSurface, mProducerEglContext));
417cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
418cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
419cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This is needed to ensure we pick up a buffer of the correct size and the
420cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // new rotation hint.
421cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
422cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
423cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(0.6, 0.6, 0.6, 0.6);
424cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
425cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
426cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glEnable(GL_SCISSOR_TEST);
427cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glScissor(24, 4, 1, 1);
428cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(1.0, 0.0, 0.0, 1.0);
429cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
430cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
431cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
432cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
433cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Do the consumer side of things
434cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
435cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mEglContext));
436cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
437cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
438cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glDisable(GL_SCISSOR_TEST);
439cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
440cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Skip the first frame, which was empty
441cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(NO_ERROR, mST->updateTexImage());
442cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(NO_ERROR, mST->updateTexImage());
443cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
444cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(0.2, 0.2, 0.2, 0.2);
445cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
446cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
447cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glViewport(0, 0, texWidth, texHeight);
448cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    drawTexture();
449cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
450cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 0,  0, 153, 153, 153, 153));
451cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(63,  0, 153, 153, 153, 153));
452cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(63, 15, 153, 153, 153, 153));
453cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 0, 15, 153, 153, 153, 153));
454cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
455cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(24,  4, 255,   0,   0, 255));
456cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(25,  5, 153, 153, 153, 153));
457cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(23,  3, 153, 153, 153, 153));
458cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(45, 13, 153, 153, 153, 153));
459cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(12,  8, 153, 153, 153, 153));
460cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}
461cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
462cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan StozaTEST_F(SurfaceTextureGLToGLTest, TexturingFromPreRotatedGLFilledBuffer) {
463cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    enum { texWidth = 64 };
464cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    enum { texHeight = 16 };
465cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
466cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This test requires 3 buffers to complete run on a single thread.
46719e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    // Set max dequeued to 2, and max acquired already defaults to 1.
46819e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    ASSERT_EQ(OK, mSTC->setMaxDequeuedBufferCount(2));
469cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
470b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos    SetUpWindowAndContext();
471b687a2814ca9db576eb1ea33dea90ac35cd61bc1Pablo Ceballos
472cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Set the transform hint.
473cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->setTransformHint(NATIVE_WINDOW_TRANSFORM_ROT_90);
474cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
475cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Set the default buffer size.
476cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    mST->setDefaultBufferSize(texWidth, texHeight);
477cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
478cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Do the producer side of things
479cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mProducerEglSurface,
480cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mProducerEglSurface, mProducerEglContext));
481cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
482cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
483cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // This is needed to ensure we pick up a buffer of the correct size and the
484cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // new rotation hint.
485cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
486cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
487cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(0.6, 0.6, 0.6, 0.6);
488cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
489cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
490cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glEnable(GL_SCISSOR_TEST);
491cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glScissor(24, 4, 1, 1);
492cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(1.0, 0.0, 0.0, 1.0);
493cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
494cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
495cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    eglSwapBuffers(mEglDisplay, mProducerEglSurface);
496cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
497cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Do the consumer side of things
498cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
499cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mEglContext));
500cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(EGL_SUCCESS, eglGetError());
501cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
502cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glDisable(GL_SCISSOR_TEST);
503cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
504cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    // Skip the first frame, which was empty
505cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(NO_ERROR, mST->updateTexImage());
506cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    ASSERT_EQ(NO_ERROR, mST->updateTexImage());
507cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
508cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClearColor(0.2, 0.2, 0.2, 0.2);
509cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glClear(GL_COLOR_BUFFER_BIT);
510cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
511cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    glViewport(0, 0, texWidth, texHeight);
512cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    drawTexture();
513cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
514cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 0,  0, 153, 153, 153, 153));
515cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(63,  0, 153, 153, 153, 153));
516cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(63, 15, 153, 153, 153, 153));
517cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel( 0, 15, 153, 153, 153, 153));
518cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
519cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(24,  4, 255,   0,   0, 255));
520cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(25,  5, 153, 153, 153, 153));
521cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(23,  3, 153, 153, 153, 153));
522cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(45, 13, 153, 153, 153, 153));
523cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    EXPECT_TRUE(checkPixel(12,  8, 153, 153, 153, 153));
524cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza}
525cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
526cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} // namespace android
527