xref: /aosp_15_r20/external/deqp/modules/egl/teglImageUtil.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program EGL Module
3*35238bceSAndroid Build Coastguard Worker  * ---------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Common utilities for EGL images.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "teglImageUtil.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "tcuTexture.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "egluGLUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "egluNativeWindow.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "egluNativePixmap.hpp"
32*35238bceSAndroid Build Coastguard Worker 
33*35238bceSAndroid Build Coastguard Worker #include "eglwLibrary.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "eglwEnums.hpp"
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
37*35238bceSAndroid Build Coastguard Worker 
38*35238bceSAndroid Build Coastguard Worker #include "gluObjectWrapper.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker namespace deqp
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace egl
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker namespace Image
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker using std::string;
49*35238bceSAndroid Build Coastguard Worker using std::vector;
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker using de::MovePtr;
52*35238bceSAndroid Build Coastguard Worker using de::UniquePtr;
53*35238bceSAndroid Build Coastguard Worker 
54*35238bceSAndroid Build Coastguard Worker using tcu::Texture2D;
55*35238bceSAndroid Build Coastguard Worker using tcu::TextureFormat;
56*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
57*35238bceSAndroid Build Coastguard Worker 
58*35238bceSAndroid Build Coastguard Worker using glu::Framebuffer;
59*35238bceSAndroid Build Coastguard Worker using glu::Texture;
60*35238bceSAndroid Build Coastguard Worker 
61*35238bceSAndroid Build Coastguard Worker using eglu::AttribMap;
62*35238bceSAndroid Build Coastguard Worker using eglu::NativeDisplay;
63*35238bceSAndroid Build Coastguard Worker using eglu::NativeDisplayFactory;
64*35238bceSAndroid Build Coastguard Worker using eglu::NativePixmap;
65*35238bceSAndroid Build Coastguard Worker using eglu::NativePixmapFactory;
66*35238bceSAndroid Build Coastguard Worker using eglu::NativeWindow;
67*35238bceSAndroid Build Coastguard Worker using eglu::NativeWindowFactory;
68*35238bceSAndroid Build Coastguard Worker using eglu::UniqueSurface;
69*35238bceSAndroid Build Coastguard Worker using eglu::WindowParams;
70*35238bceSAndroid Build Coastguard Worker 
71*35238bceSAndroid Build Coastguard Worker using namespace glw;
72*35238bceSAndroid Build Coastguard Worker using namespace eglw;
73*35238bceSAndroid Build Coastguard Worker 
74*35238bceSAndroid Build Coastguard Worker enum
75*35238bceSAndroid Build Coastguard Worker {
76*35238bceSAndroid Build Coastguard Worker     IMAGE_WIDTH  = 64,
77*35238bceSAndroid Build Coastguard Worker     IMAGE_HEIGHT = 64,
78*35238bceSAndroid Build Coastguard Worker };
79*35238bceSAndroid Build Coastguard Worker 
80*35238bceSAndroid Build Coastguard Worker template <typename T>
81*35238bceSAndroid Build Coastguard Worker struct NativeSurface : public ManagedSurface
82*35238bceSAndroid Build Coastguard Worker {
83*35238bceSAndroid Build Coastguard Worker public:
NativeSurfacedeqp::egl::Image::NativeSurface84*35238bceSAndroid Build Coastguard Worker     explicit NativeSurface(MovePtr<UniqueSurface> surface, MovePtr<T> native)
85*35238bceSAndroid Build Coastguard Worker         : ManagedSurface(surface)
86*35238bceSAndroid Build Coastguard Worker         , m_native(native)
87*35238bceSAndroid Build Coastguard Worker     {
88*35238bceSAndroid Build Coastguard Worker     }
89*35238bceSAndroid Build Coastguard Worker 
90*35238bceSAndroid Build Coastguard Worker private:
91*35238bceSAndroid Build Coastguard Worker     UniquePtr<T> m_native;
92*35238bceSAndroid Build Coastguard Worker };
93*35238bceSAndroid Build Coastguard Worker 
94*35238bceSAndroid Build Coastguard Worker typedef NativeSurface<NativeWindow> NativeWindowSurface;
95*35238bceSAndroid Build Coastguard Worker typedef NativeSurface<NativePixmap> NativePixmapSurface;
96*35238bceSAndroid Build Coastguard Worker 
createSurface(EglTestContext & eglTestCtx,EGLDisplay dpy,EGLConfig config,int width,int height)97*35238bceSAndroid Build Coastguard Worker MovePtr<ManagedSurface> createSurface(EglTestContext &eglTestCtx, EGLDisplay dpy, EGLConfig config, int width,
98*35238bceSAndroid Build Coastguard Worker                                       int height)
99*35238bceSAndroid Build Coastguard Worker {
100*35238bceSAndroid Build Coastguard Worker     const Library &egl                         = eglTestCtx.getLibrary();
101*35238bceSAndroid Build Coastguard Worker     EGLint surfaceTypeBits                     = eglu::getConfigAttribInt(egl, dpy, config, EGL_SURFACE_TYPE);
102*35238bceSAndroid Build Coastguard Worker     const NativeDisplayFactory &displayFactory = eglTestCtx.getNativeDisplayFactory();
103*35238bceSAndroid Build Coastguard Worker     NativeDisplay &nativeDisplay               = eglTestCtx.getNativeDisplay();
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker     if (surfaceTypeBits & EGL_PBUFFER_BIT)
106*35238bceSAndroid Build Coastguard Worker     {
107*35238bceSAndroid Build Coastguard Worker         static const EGLint attribs[] = {EGL_WIDTH, width, EGL_HEIGHT, height, EGL_NONE};
108*35238bceSAndroid Build Coastguard Worker         const EGLSurface surface      = egl.createPbufferSurface(dpy, config, attribs);
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker         EGLU_CHECK_MSG(egl, "eglCreatePbufferSurface()");
111*35238bceSAndroid Build Coastguard Worker 
112*35238bceSAndroid Build Coastguard Worker         return de::newMovePtr<ManagedSurface>(MovePtr<UniqueSurface>(new UniqueSurface(egl, dpy, surface)));
113*35238bceSAndroid Build Coastguard Worker     }
114*35238bceSAndroid Build Coastguard Worker     else if (surfaceTypeBits & EGL_WINDOW_BIT)
115*35238bceSAndroid Build Coastguard Worker     {
116*35238bceSAndroid Build Coastguard Worker         const NativeWindowFactory &windowFactory =
117*35238bceSAndroid Build Coastguard Worker             selectNativeWindowFactory(displayFactory, eglTestCtx.getTestContext().getCommandLine());
118*35238bceSAndroid Build Coastguard Worker 
119*35238bceSAndroid Build Coastguard Worker         MovePtr<NativeWindow> window(windowFactory.createWindow(
120*35238bceSAndroid Build Coastguard Worker             &nativeDisplay, dpy, config, DE_NULL, WindowParams(width, height, WindowParams::VISIBILITY_DONT_CARE)));
121*35238bceSAndroid Build Coastguard Worker         const EGLSurface surface = eglu::createWindowSurface(nativeDisplay, *window, dpy, config, DE_NULL);
122*35238bceSAndroid Build Coastguard Worker 
123*35238bceSAndroid Build Coastguard Worker         return MovePtr<ManagedSurface>(
124*35238bceSAndroid Build Coastguard Worker             new NativeWindowSurface(MovePtr<UniqueSurface>(new UniqueSurface(egl, dpy, surface)), window));
125*35238bceSAndroid Build Coastguard Worker     }
126*35238bceSAndroid Build Coastguard Worker     else if (surfaceTypeBits & EGL_PIXMAP_BIT)
127*35238bceSAndroid Build Coastguard Worker     {
128*35238bceSAndroid Build Coastguard Worker         const NativePixmapFactory &pixmapFactory =
129*35238bceSAndroid Build Coastguard Worker             selectNativePixmapFactory(displayFactory, eglTestCtx.getTestContext().getCommandLine());
130*35238bceSAndroid Build Coastguard Worker 
131*35238bceSAndroid Build Coastguard Worker         MovePtr<NativePixmap> pixmap(pixmapFactory.createPixmap(&nativeDisplay, dpy, config, DE_NULL, width, height));
132*35238bceSAndroid Build Coastguard Worker         const EGLSurface surface =
133*35238bceSAndroid Build Coastguard Worker             eglu::createPixmapSurface(eglTestCtx.getNativeDisplay(), *pixmap, dpy, config, DE_NULL);
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker         return MovePtr<ManagedSurface>(
136*35238bceSAndroid Build Coastguard Worker             new NativePixmapSurface(MovePtr<UniqueSurface>(new UniqueSurface(egl, dpy, surface)), pixmap));
137*35238bceSAndroid Build Coastguard Worker     }
138*35238bceSAndroid Build Coastguard Worker     else
139*35238bceSAndroid Build Coastguard Worker         TCU_FAIL("No valid surface types supported in config");
140*35238bceSAndroid Build Coastguard Worker }
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker class GLClientBuffer : public ClientBuffer
143*35238bceSAndroid Build Coastguard Worker {
get(void) const144*35238bceSAndroid Build Coastguard Worker     EGLClientBuffer get(void) const
145*35238bceSAndroid Build Coastguard Worker     {
146*35238bceSAndroid Build Coastguard Worker         return reinterpret_cast<EGLClientBuffer>(static_cast<uintptr_t>(getName()));
147*35238bceSAndroid Build Coastguard Worker     }
148*35238bceSAndroid Build Coastguard Worker 
149*35238bceSAndroid Build Coastguard Worker protected:
150*35238bceSAndroid Build Coastguard Worker     virtual GLuint getName(void) const = 0;
151*35238bceSAndroid Build Coastguard Worker };
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker class TextureClientBuffer : public GLClientBuffer
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker public:
TextureClientBuffer(const glw::Functions & gl)156*35238bceSAndroid Build Coastguard Worker     TextureClientBuffer(const glw::Functions &gl) : m_texture(gl)
157*35238bceSAndroid Build Coastguard Worker     {
158*35238bceSAndroid Build Coastguard Worker     }
getName(void) const159*35238bceSAndroid Build Coastguard Worker     GLuint getName(void) const
160*35238bceSAndroid Build Coastguard Worker     {
161*35238bceSAndroid Build Coastguard Worker         return *m_texture;
162*35238bceSAndroid Build Coastguard Worker     }
163*35238bceSAndroid Build Coastguard Worker 
164*35238bceSAndroid Build Coastguard Worker private:
165*35238bceSAndroid Build Coastguard Worker     glu::Texture m_texture;
166*35238bceSAndroid Build Coastguard Worker };
167*35238bceSAndroid Build Coastguard Worker 
168*35238bceSAndroid Build Coastguard Worker class GLImageSource : public ImageSource
169*35238bceSAndroid Build Coastguard Worker {
170*35238bceSAndroid Build Coastguard Worker public:
171*35238bceSAndroid Build Coastguard Worker     EGLImageKHR createImage(const Library &egl, EGLDisplay dpy, EGLContext ctx, EGLClientBuffer clientBuffer) const;
172*35238bceSAndroid Build Coastguard Worker 
173*35238bceSAndroid Build Coastguard Worker protected:
174*35238bceSAndroid Build Coastguard Worker     virtual AttribMap getCreateAttribs(void) const = 0;
175*35238bceSAndroid Build Coastguard Worker     virtual EGLenum getSource(void) const          = 0;
176*35238bceSAndroid Build Coastguard Worker };
177*35238bceSAndroid Build Coastguard Worker 
createImage(const Library & egl,EGLDisplay dpy,EGLContext ctx,EGLClientBuffer clientBuffer) const178*35238bceSAndroid Build Coastguard Worker EGLImageKHR GLImageSource::createImage(const Library &egl, EGLDisplay dpy, EGLContext ctx,
179*35238bceSAndroid Build Coastguard Worker                                        EGLClientBuffer clientBuffer) const
180*35238bceSAndroid Build Coastguard Worker {
181*35238bceSAndroid Build Coastguard Worker     AttribMap attribMap = getCreateAttribs();
182*35238bceSAndroid Build Coastguard Worker 
183*35238bceSAndroid Build Coastguard Worker     attribMap[EGL_IMAGE_PRESERVED_KHR] = EGL_TRUE;
184*35238bceSAndroid Build Coastguard Worker 
185*35238bceSAndroid Build Coastguard Worker     {
186*35238bceSAndroid Build Coastguard Worker         const vector<EGLint> attribs = eglu::attribMapToList(attribMap);
187*35238bceSAndroid Build Coastguard Worker         const EGLImageKHR image      = egl.createImageKHR(dpy, ctx, getSource(), clientBuffer, &attribs.front());
188*35238bceSAndroid Build Coastguard Worker         EGLU_CHECK_MSG(egl, "eglCreateImageKHR()");
189*35238bceSAndroid Build Coastguard Worker         return image;
190*35238bceSAndroid Build Coastguard Worker     }
191*35238bceSAndroid Build Coastguard Worker }
192*35238bceSAndroid Build Coastguard Worker 
193*35238bceSAndroid Build Coastguard Worker class TextureImageSource : public GLImageSource
194*35238bceSAndroid Build Coastguard Worker {
195*35238bceSAndroid Build Coastguard Worker public:
TextureImageSource(GLenum internalFormat,GLenum format,GLenum type,bool useTexLevel0)196*35238bceSAndroid Build Coastguard Worker     TextureImageSource(GLenum internalFormat, GLenum format, GLenum type, bool useTexLevel0)
197*35238bceSAndroid Build Coastguard Worker         : m_internalFormat(internalFormat)
198*35238bceSAndroid Build Coastguard Worker         , m_format(format)
199*35238bceSAndroid Build Coastguard Worker         , m_type(type)
200*35238bceSAndroid Build Coastguard Worker         , m_useTexLevel0(useTexLevel0)
201*35238bceSAndroid Build Coastguard Worker     {
202*35238bceSAndroid Build Coastguard Worker     }
203*35238bceSAndroid Build Coastguard Worker     MovePtr<ClientBuffer> createBuffer(const eglw::Library &egl, const glw::Functions &gl, Texture2D *reference) const;
204*35238bceSAndroid Build Coastguard Worker     GLenum getEffectiveFormat(void) const;
getInternalFormat(void) const205*35238bceSAndroid Build Coastguard Worker     GLenum getInternalFormat(void) const
206*35238bceSAndroid Build Coastguard Worker     {
207*35238bceSAndroid Build Coastguard Worker         return m_internalFormat;
208*35238bceSAndroid Build Coastguard Worker     }
209*35238bceSAndroid Build Coastguard Worker 
210*35238bceSAndroid Build Coastguard Worker protected:
211*35238bceSAndroid Build Coastguard Worker     AttribMap getCreateAttribs(void) const;
212*35238bceSAndroid Build Coastguard Worker     virtual void initTexture(const glw::Functions &gl) const = 0;
213*35238bceSAndroid Build Coastguard Worker     virtual GLenum getGLTarget(void) const                   = 0;
214*35238bceSAndroid Build Coastguard Worker 
215*35238bceSAndroid Build Coastguard Worker     const GLenum m_internalFormat;
216*35238bceSAndroid Build Coastguard Worker     const GLenum m_format;
217*35238bceSAndroid Build Coastguard Worker     const GLenum m_type;
218*35238bceSAndroid Build Coastguard Worker     const bool m_useTexLevel0;
219*35238bceSAndroid Build Coastguard Worker };
220*35238bceSAndroid Build Coastguard Worker 
isSizedFormat(GLenum format)221*35238bceSAndroid Build Coastguard Worker bool isSizedFormat(GLenum format)
222*35238bceSAndroid Build Coastguard Worker {
223*35238bceSAndroid Build Coastguard Worker     try
224*35238bceSAndroid Build Coastguard Worker     {
225*35238bceSAndroid Build Coastguard Worker         glu::mapGLInternalFormat(format);
226*35238bceSAndroid Build Coastguard Worker         return true;
227*35238bceSAndroid Build Coastguard Worker     }
228*35238bceSAndroid Build Coastguard Worker     catch (const tcu::InternalError &)
229*35238bceSAndroid Build Coastguard Worker     {
230*35238bceSAndroid Build Coastguard Worker         return false;
231*35238bceSAndroid Build Coastguard Worker     }
232*35238bceSAndroid Build Coastguard Worker }
233*35238bceSAndroid Build Coastguard Worker 
getEffectiveFormat(GLenum format,GLenum type)234*35238bceSAndroid Build Coastguard Worker GLenum getEffectiveFormat(GLenum format, GLenum type)
235*35238bceSAndroid Build Coastguard Worker {
236*35238bceSAndroid Build Coastguard Worker     return glu::getInternalFormat(glu::mapGLTransferFormat(format, type));
237*35238bceSAndroid Build Coastguard Worker }
238*35238bceSAndroid Build Coastguard Worker 
getEffectiveFormat(void) const239*35238bceSAndroid Build Coastguard Worker GLenum TextureImageSource::getEffectiveFormat(void) const
240*35238bceSAndroid Build Coastguard Worker {
241*35238bceSAndroid Build Coastguard Worker     if (isSizedFormat(m_internalFormat))
242*35238bceSAndroid Build Coastguard Worker         return m_internalFormat;
243*35238bceSAndroid Build Coastguard Worker     else
244*35238bceSAndroid Build Coastguard Worker         return deqp::egl::Image::getEffectiveFormat(m_format, m_type);
245*35238bceSAndroid Build Coastguard Worker }
246*35238bceSAndroid Build Coastguard Worker 
getCreateAttribs(void) const247*35238bceSAndroid Build Coastguard Worker AttribMap TextureImageSource::getCreateAttribs(void) const
248*35238bceSAndroid Build Coastguard Worker {
249*35238bceSAndroid Build Coastguard Worker     AttribMap ret;
250*35238bceSAndroid Build Coastguard Worker 
251*35238bceSAndroid Build Coastguard Worker     ret[EGL_GL_TEXTURE_LEVEL_KHR] = 0;
252*35238bceSAndroid Build Coastguard Worker 
253*35238bceSAndroid Build Coastguard Worker     return ret;
254*35238bceSAndroid Build Coastguard Worker }
255*35238bceSAndroid Build Coastguard Worker 
createBuffer(const eglw::Library & egl,const glw::Functions & gl,Texture2D * ref) const256*35238bceSAndroid Build Coastguard Worker MovePtr<ClientBuffer> TextureImageSource::createBuffer(const eglw::Library &egl, const glw::Functions &gl,
257*35238bceSAndroid Build Coastguard Worker                                                        Texture2D *ref) const
258*35238bceSAndroid Build Coastguard Worker {
259*35238bceSAndroid Build Coastguard Worker     DE_UNREF(egl);
260*35238bceSAndroid Build Coastguard Worker 
261*35238bceSAndroid Build Coastguard Worker     MovePtr<TextureClientBuffer> clientBuffer(new TextureClientBuffer(gl));
262*35238bceSAndroid Build Coastguard Worker     const GLuint texture = clientBuffer->getName();
263*35238bceSAndroid Build Coastguard Worker     const GLenum target  = getGLTarget();
264*35238bceSAndroid Build Coastguard Worker 
265*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(target, texture));
266*35238bceSAndroid Build Coastguard Worker     initTexture(gl);
267*35238bceSAndroid Build Coastguard Worker 
268*35238bceSAndroid Build Coastguard Worker     if (!m_useTexLevel0)
269*35238bceSAndroid Build Coastguard Worker     {
270*35238bceSAndroid Build Coastguard Worker         // Set minification filter to linear. This makes the texture complete.
271*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
272*35238bceSAndroid Build Coastguard Worker     }
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker     if (ref != DE_NULL)
275*35238bceSAndroid Build Coastguard Worker     {
276*35238bceSAndroid Build Coastguard Worker         GLenum imgTarget = eglu::getImageGLTarget(getSource());
277*35238bceSAndroid Build Coastguard Worker 
278*35238bceSAndroid Build Coastguard Worker         *ref = Texture2D(glu::mapGLTransferFormat(m_format, m_type), IMAGE_WIDTH, IMAGE_HEIGHT);
279*35238bceSAndroid Build Coastguard Worker         ref->allocLevel(0);
280*35238bceSAndroid Build Coastguard Worker         tcu::fillWithComponentGradients(ref->getLevel(0), tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f),
281*35238bceSAndroid Build Coastguard Worker                                         tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
282*35238bceSAndroid Build Coastguard Worker 
283*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
284*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, texParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
285*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, texParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
286*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, texParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
287*35238bceSAndroid Build Coastguard Worker 
288*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, texImage2D(imgTarget, 0, m_internalFormat, IMAGE_WIDTH, IMAGE_HEIGHT, 0, m_format,
289*35238bceSAndroid Build Coastguard Worker                                           m_type, ref->getLevel(0).getDataPtr()));
290*35238bceSAndroid Build Coastguard Worker     }
291*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, bindTexture(target, 0));
292*35238bceSAndroid Build Coastguard Worker     return MovePtr<ClientBuffer>(clientBuffer);
293*35238bceSAndroid Build Coastguard Worker }
294*35238bceSAndroid Build Coastguard Worker 
295*35238bceSAndroid Build Coastguard Worker class Texture2DImageSource : public TextureImageSource
296*35238bceSAndroid Build Coastguard Worker {
297*35238bceSAndroid Build Coastguard Worker public:
Texture2DImageSource(GLenum internalFormat,GLenum format,GLenum type,bool useTexLevel0)298*35238bceSAndroid Build Coastguard Worker     Texture2DImageSource(GLenum internalFormat, GLenum format, GLenum type, bool useTexLevel0)
299*35238bceSAndroid Build Coastguard Worker         : TextureImageSource(internalFormat, format, type, useTexLevel0)
300*35238bceSAndroid Build Coastguard Worker     {
301*35238bceSAndroid Build Coastguard Worker     }
getSource(void) const302*35238bceSAndroid Build Coastguard Worker     EGLenum getSource(void) const
303*35238bceSAndroid Build Coastguard Worker     {
304*35238bceSAndroid Build Coastguard Worker         return EGL_GL_TEXTURE_2D_KHR;
305*35238bceSAndroid Build Coastguard Worker     }
getRequiredExtension(void) const306*35238bceSAndroid Build Coastguard Worker     string getRequiredExtension(void) const
307*35238bceSAndroid Build Coastguard Worker     {
308*35238bceSAndroid Build Coastguard Worker         return "EGL_KHR_gl_texture_2D_image";
309*35238bceSAndroid Build Coastguard Worker     }
getGLTarget(void) const310*35238bceSAndroid Build Coastguard Worker     GLenum getGLTarget(void) const
311*35238bceSAndroid Build Coastguard Worker     {
312*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_2D;
313*35238bceSAndroid Build Coastguard Worker     }
314*35238bceSAndroid Build Coastguard Worker 
315*35238bceSAndroid Build Coastguard Worker protected:
316*35238bceSAndroid Build Coastguard Worker     void initTexture(const glw::Functions &gl) const;
317*35238bceSAndroid Build Coastguard Worker };
318*35238bceSAndroid Build Coastguard Worker 
initTexture(const glw::Functions & gl) const319*35238bceSAndroid Build Coastguard Worker void Texture2DImageSource::initTexture(const glw::Functions &gl) const
320*35238bceSAndroid Build Coastguard Worker {
321*35238bceSAndroid Build Coastguard Worker     // Specify mipmap level 0
322*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL_ERROR(
323*35238bceSAndroid Build Coastguard Worker         gl.texImage2D(GL_TEXTURE_2D, 0, m_internalFormat, IMAGE_WIDTH, IMAGE_HEIGHT, 0, m_format, m_type, DE_NULL),
324*35238bceSAndroid Build Coastguard Worker         gl.getError());
325*35238bceSAndroid Build Coastguard Worker }
326*35238bceSAndroid Build Coastguard Worker 
327*35238bceSAndroid Build Coastguard Worker class TextureCubeMapImageSource : public TextureImageSource
328*35238bceSAndroid Build Coastguard Worker {
329*35238bceSAndroid Build Coastguard Worker public:
TextureCubeMapImageSource(EGLenum source,GLenum internalFormat,GLenum format,GLenum type,bool useTexLevel0)330*35238bceSAndroid Build Coastguard Worker     TextureCubeMapImageSource(EGLenum source, GLenum internalFormat, GLenum format, GLenum type, bool useTexLevel0)
331*35238bceSAndroid Build Coastguard Worker         : TextureImageSource(internalFormat, format, type, useTexLevel0)
332*35238bceSAndroid Build Coastguard Worker         , m_source(source)
333*35238bceSAndroid Build Coastguard Worker     {
334*35238bceSAndroid Build Coastguard Worker     }
getSource(void) const335*35238bceSAndroid Build Coastguard Worker     EGLenum getSource(void) const
336*35238bceSAndroid Build Coastguard Worker     {
337*35238bceSAndroid Build Coastguard Worker         return m_source;
338*35238bceSAndroid Build Coastguard Worker     }
getRequiredExtension(void) const339*35238bceSAndroid Build Coastguard Worker     string getRequiredExtension(void) const
340*35238bceSAndroid Build Coastguard Worker     {
341*35238bceSAndroid Build Coastguard Worker         return "EGL_KHR_gl_texture_cubemap_image";
342*35238bceSAndroid Build Coastguard Worker     }
getGLTarget(void) const343*35238bceSAndroid Build Coastguard Worker     GLenum getGLTarget(void) const
344*35238bceSAndroid Build Coastguard Worker     {
345*35238bceSAndroid Build Coastguard Worker         return GL_TEXTURE_CUBE_MAP;
346*35238bceSAndroid Build Coastguard Worker     }
347*35238bceSAndroid Build Coastguard Worker 
348*35238bceSAndroid Build Coastguard Worker protected:
349*35238bceSAndroid Build Coastguard Worker     void initTexture(const glw::Functions &gl) const;
350*35238bceSAndroid Build Coastguard Worker 
351*35238bceSAndroid Build Coastguard Worker     EGLenum m_source;
352*35238bceSAndroid Build Coastguard Worker };
353*35238bceSAndroid Build Coastguard Worker 
initTexture(const glw::Functions & gl) const354*35238bceSAndroid Build Coastguard Worker void TextureCubeMapImageSource::initTexture(const glw::Functions &gl) const
355*35238bceSAndroid Build Coastguard Worker {
356*35238bceSAndroid Build Coastguard Worker     // Specify mipmap level 0 for all faces
357*35238bceSAndroid Build Coastguard Worker     static const GLenum faces[] = {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
358*35238bceSAndroid Build Coastguard Worker                                    GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
359*35238bceSAndroid Build Coastguard Worker                                    GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z};
360*35238bceSAndroid Build Coastguard Worker 
361*35238bceSAndroid Build Coastguard Worker     for (int faceNdx = 0; faceNdx < DE_LENGTH_OF_ARRAY(faces); faceNdx++)
362*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, texImage2D(faces[faceNdx], 0, m_internalFormat, IMAGE_WIDTH, IMAGE_HEIGHT, 0, m_format,
363*35238bceSAndroid Build Coastguard Worker                                           m_type, DE_NULL));
364*35238bceSAndroid Build Coastguard Worker }
365*35238bceSAndroid Build Coastguard Worker 
366*35238bceSAndroid Build Coastguard Worker class RenderbufferClientBuffer : public GLClientBuffer
367*35238bceSAndroid Build Coastguard Worker {
368*35238bceSAndroid Build Coastguard Worker public:
RenderbufferClientBuffer(const glw::Functions & gl)369*35238bceSAndroid Build Coastguard Worker     RenderbufferClientBuffer(const glw::Functions &gl) : m_rbo(gl)
370*35238bceSAndroid Build Coastguard Worker     {
371*35238bceSAndroid Build Coastguard Worker     }
getName(void) const372*35238bceSAndroid Build Coastguard Worker     GLuint getName(void) const
373*35238bceSAndroid Build Coastguard Worker     {
374*35238bceSAndroid Build Coastguard Worker         return *m_rbo;
375*35238bceSAndroid Build Coastguard Worker     }
376*35238bceSAndroid Build Coastguard Worker 
377*35238bceSAndroid Build Coastguard Worker private:
378*35238bceSAndroid Build Coastguard Worker     glu::Renderbuffer m_rbo;
379*35238bceSAndroid Build Coastguard Worker };
380*35238bceSAndroid Build Coastguard Worker 
381*35238bceSAndroid Build Coastguard Worker class RenderbufferImageSource : public GLImageSource
382*35238bceSAndroid Build Coastguard Worker {
383*35238bceSAndroid Build Coastguard Worker public:
RenderbufferImageSource(GLenum format)384*35238bceSAndroid Build Coastguard Worker     RenderbufferImageSource(GLenum format) : m_format(format)
385*35238bceSAndroid Build Coastguard Worker     {
386*35238bceSAndroid Build Coastguard Worker     }
387*35238bceSAndroid Build Coastguard Worker 
getRequiredExtension(void) const388*35238bceSAndroid Build Coastguard Worker     string getRequiredExtension(void) const
389*35238bceSAndroid Build Coastguard Worker     {
390*35238bceSAndroid Build Coastguard Worker         return "EGL_KHR_gl_renderbuffer_image";
391*35238bceSAndroid Build Coastguard Worker     }
392*35238bceSAndroid Build Coastguard Worker     MovePtr<ClientBuffer> createBuffer(const eglw::Library &egl, const glw::Functions &gl, Texture2D *reference) const;
getEffectiveFormat(void) const393*35238bceSAndroid Build Coastguard Worker     GLenum getEffectiveFormat(void) const
394*35238bceSAndroid Build Coastguard Worker     {
395*35238bceSAndroid Build Coastguard Worker         return m_format;
396*35238bceSAndroid Build Coastguard Worker     }
397*35238bceSAndroid Build Coastguard Worker 
398*35238bceSAndroid Build Coastguard Worker protected:
getSource(void) const399*35238bceSAndroid Build Coastguard Worker     EGLenum getSource(void) const
400*35238bceSAndroid Build Coastguard Worker     {
401*35238bceSAndroid Build Coastguard Worker         return EGL_GL_RENDERBUFFER_KHR;
402*35238bceSAndroid Build Coastguard Worker     }
getCreateAttribs(void) const403*35238bceSAndroid Build Coastguard Worker     AttribMap getCreateAttribs(void) const
404*35238bceSAndroid Build Coastguard Worker     {
405*35238bceSAndroid Build Coastguard Worker         return AttribMap();
406*35238bceSAndroid Build Coastguard Worker     }
407*35238bceSAndroid Build Coastguard Worker 
408*35238bceSAndroid Build Coastguard Worker     GLenum m_format;
409*35238bceSAndroid Build Coastguard Worker };
410*35238bceSAndroid Build Coastguard Worker 
initializeStencilRbo(const glw::Functions & gl,GLuint rbo,Texture2D & ref)411*35238bceSAndroid Build Coastguard Worker void initializeStencilRbo(const glw::Functions &gl, GLuint rbo, Texture2D &ref)
412*35238bceSAndroid Build Coastguard Worker {
413*35238bceSAndroid Build Coastguard Worker     static const uint32_t stencilValues[] = {
414*35238bceSAndroid Build Coastguard Worker         0xBF688C11u, 0xB43D2922u, 0x055D5FFBu, 0x9300655Eu, 0x63BE0DF2u,
415*35238bceSAndroid Build Coastguard Worker         0x0345C13Bu, 0x1C184832u, 0xD107040Fu, 0x9B91569Fu, 0x0F0CFDC7u,
416*35238bceSAndroid Build Coastguard Worker     };
417*35238bceSAndroid Build Coastguard Worker 
418*35238bceSAndroid Build Coastguard Worker     const uint32_t numStencilBits =
419*35238bceSAndroid Build Coastguard Worker         tcu::getTextureFormatBitDepth(
420*35238bceSAndroid Build Coastguard Worker             tcu::getEffectiveDepthStencilTextureFormat(ref.getLevel(0).getFormat(), tcu::Sampler::MODE_STENCIL))
421*35238bceSAndroid Build Coastguard Worker             .x();
422*35238bceSAndroid Build Coastguard Worker     const uint32_t stencilMask = deBitMask32(0, numStencilBits);
423*35238bceSAndroid Build Coastguard Worker 
424*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo));
425*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clearStencil(0));
426*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clear(GL_STENCIL_BUFFER_BIT));
427*35238bceSAndroid Build Coastguard Worker     tcu::clearStencil(ref.getLevel(0), 0);
428*35238bceSAndroid Build Coastguard Worker 
429*35238bceSAndroid Build Coastguard Worker     // create a pattern
430*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enable(GL_SCISSOR_TEST));
431*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stencilValues); ++ndx)
432*35238bceSAndroid Build Coastguard Worker     {
433*35238bceSAndroid Build Coastguard Worker         const uint32_t stencil = stencilValues[ndx] & stencilMask;
434*35238bceSAndroid Build Coastguard Worker         const tcu::IVec2 size =
435*35238bceSAndroid Build Coastguard Worker             tcu::IVec2((int)((float)(DE_LENGTH_OF_ARRAY(stencilValues) - ndx) *
436*35238bceSAndroid Build Coastguard Worker                              ((float)ref.getWidth() / float(DE_LENGTH_OF_ARRAY(stencilValues)))),
437*35238bceSAndroid Build Coastguard Worker                        (int)((float)(DE_LENGTH_OF_ARRAY(stencilValues) - ndx) *
438*35238bceSAndroid Build Coastguard Worker                              ((float)ref.getHeight() / float(DE_LENGTH_OF_ARRAY(stencilValues) + 4)))); // not symmetric
439*35238bceSAndroid Build Coastguard Worker 
440*35238bceSAndroid Build Coastguard Worker         if (size.x() == 0 || size.y() == 0)
441*35238bceSAndroid Build Coastguard Worker             break;
442*35238bceSAndroid Build Coastguard Worker 
443*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, scissor(0, 0, size.x(), size.y()));
444*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, clearStencil(stencil));
445*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, clear(GL_STENCIL_BUFFER_BIT));
446*35238bceSAndroid Build Coastguard Worker 
447*35238bceSAndroid Build Coastguard Worker         tcu::clearStencil(tcu::getSubregion(ref.getLevel(0), 0, 0, size.x(), size.y()), stencil);
448*35238bceSAndroid Build Coastguard Worker     }
449*35238bceSAndroid Build Coastguard Worker 
450*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disable(GL_SCISSOR_TEST));
451*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0));
452*35238bceSAndroid Build Coastguard Worker }
453*35238bceSAndroid Build Coastguard Worker 
initializeDepthRbo(const glw::Functions & gl,GLuint rbo,Texture2D & ref)454*35238bceSAndroid Build Coastguard Worker void initializeDepthRbo(const glw::Functions &gl, GLuint rbo, Texture2D &ref)
455*35238bceSAndroid Build Coastguard Worker {
456*35238bceSAndroid Build Coastguard Worker     const int NUM_STEPS = 13;
457*35238bceSAndroid Build Coastguard Worker 
458*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo));
459*35238bceSAndroid Build Coastguard Worker 
460*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clearDepthf(0.0f));
461*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clear(GL_DEPTH_BUFFER_BIT));
462*35238bceSAndroid Build Coastguard Worker     tcu::clearDepth(ref.getLevel(0), 0.0f);
463*35238bceSAndroid Build Coastguard Worker 
464*35238bceSAndroid Build Coastguard Worker     // create a pattern
465*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enable(GL_SCISSOR_TEST));
466*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < NUM_STEPS; ++ndx)
467*35238bceSAndroid Build Coastguard Worker     {
468*35238bceSAndroid Build Coastguard Worker         const float depth     = (float)ndx / float(NUM_STEPS);
469*35238bceSAndroid Build Coastguard Worker         const tcu::IVec2 size = tcu::IVec2(
470*35238bceSAndroid Build Coastguard Worker             (int)((float)(NUM_STEPS - ndx) * ((float)ref.getWidth() / float(NUM_STEPS))),
471*35238bceSAndroid Build Coastguard Worker             (int)((float)(NUM_STEPS - ndx) * ((float)ref.getHeight() / float(NUM_STEPS + 4)))); // not symmetric
472*35238bceSAndroid Build Coastguard Worker 
473*35238bceSAndroid Build Coastguard Worker         if (size.x() == 0 || size.y() == 0)
474*35238bceSAndroid Build Coastguard Worker             break;
475*35238bceSAndroid Build Coastguard Worker 
476*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, scissor(0, 0, size.x(), size.y()));
477*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, clearDepthf(depth));
478*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, clear(GL_DEPTH_BUFFER_BIT));
479*35238bceSAndroid Build Coastguard Worker 
480*35238bceSAndroid Build Coastguard Worker         tcu::clearDepth(tcu::getSubregion(ref.getLevel(0), 0, 0, size.x(), size.y()), depth);
481*35238bceSAndroid Build Coastguard Worker     }
482*35238bceSAndroid Build Coastguard Worker 
483*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disable(GL_SCISSOR_TEST));
484*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0));
485*35238bceSAndroid Build Coastguard Worker }
486*35238bceSAndroid Build Coastguard Worker 
initializeColorRbo(const glw::Functions & gl,GLuint rbo,Texture2D & ref)487*35238bceSAndroid Build Coastguard Worker void initializeColorRbo(const glw::Functions &gl, GLuint rbo, Texture2D &ref)
488*35238bceSAndroid Build Coastguard Worker {
489*35238bceSAndroid Build Coastguard Worker     static const tcu::Vec4 colorValues[] = {
490*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.9f, 0.5f, 0.65f, 1.0f), tcu::Vec4(0.5f, 0.7f, 0.65f, 1.0f), tcu::Vec4(0.2f, 0.5f, 0.65f, 1.0f),
491*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.3f, 0.1f, 0.5f, 1.0f),  tcu::Vec4(0.8f, 0.2f, 0.3f, 1.0f),  tcu::Vec4(0.9f, 0.4f, 0.8f, 1.0f),
492*35238bceSAndroid Build Coastguard Worker     };
493*35238bceSAndroid Build Coastguard Worker 
494*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo));
495*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clearColor(1.0f, 1.0f, 0.0f, 1.0f));
496*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, clear(GL_COLOR_BUFFER_BIT));
497*35238bceSAndroid Build Coastguard Worker     tcu::clear(ref.getLevel(0), Vec4(1.0f, 1.0f, 0.0f, 1.0f));
498*35238bceSAndroid Build Coastguard Worker 
499*35238bceSAndroid Build Coastguard Worker     // create a pattern
500*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, enable(GL_SCISSOR_TEST));
501*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(colorValues); ++ndx)
502*35238bceSAndroid Build Coastguard Worker     {
503*35238bceSAndroid Build Coastguard Worker         const tcu::IVec2 size =
504*35238bceSAndroid Build Coastguard Worker             tcu::IVec2((int)((float)(DE_LENGTH_OF_ARRAY(colorValues) - ndx) *
505*35238bceSAndroid Build Coastguard Worker                              ((float)ref.getWidth() / float(DE_LENGTH_OF_ARRAY(colorValues)))),
506*35238bceSAndroid Build Coastguard Worker                        (int)((float)(DE_LENGTH_OF_ARRAY(colorValues) - ndx) *
507*35238bceSAndroid Build Coastguard Worker                              ((float)ref.getHeight() / float(DE_LENGTH_OF_ARRAY(colorValues) + 4)))); // not symmetric
508*35238bceSAndroid Build Coastguard Worker 
509*35238bceSAndroid Build Coastguard Worker         if (size.x() == 0 || size.y() == 0)
510*35238bceSAndroid Build Coastguard Worker             break;
511*35238bceSAndroid Build Coastguard Worker 
512*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, scissor(0, 0, size.x(), size.y()));
513*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(
514*35238bceSAndroid Build Coastguard Worker             gl, clearColor(colorValues[ndx].x(), colorValues[ndx].y(), colorValues[ndx].z(), colorValues[ndx].w()));
515*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_GLW_CALL(gl, clear(GL_COLOR_BUFFER_BIT));
516*35238bceSAndroid Build Coastguard Worker 
517*35238bceSAndroid Build Coastguard Worker         tcu::clear(tcu::getSubregion(ref.getLevel(0), 0, 0, size.x(), size.y()), colorValues[ndx]);
518*35238bceSAndroid Build Coastguard Worker     }
519*35238bceSAndroid Build Coastguard Worker 
520*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, disable(GL_SCISSOR_TEST));
521*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_GLW_CALL(gl, framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0));
522*35238bceSAndroid Build Coastguard Worker }
523*35238bceSAndroid Build Coastguard Worker 
createBuffer(const eglw::Library & egl,const glw::Functions & gl,Texture2D * ref) const524*35238bceSAndroid Build Coastguard Worker MovePtr<ClientBuffer> RenderbufferImageSource::createBuffer(const eglw::Library &egl, const glw::Functions &gl,
525*35238bceSAndroid Build Coastguard Worker                                                             Texture2D *ref) const
526*35238bceSAndroid Build Coastguard Worker {
527*35238bceSAndroid Build Coastguard Worker     DE_UNREF(egl);
528*35238bceSAndroid Build Coastguard Worker 
529*35238bceSAndroid Build Coastguard Worker     MovePtr<RenderbufferClientBuffer> buffer(new RenderbufferClientBuffer(gl));
530*35238bceSAndroid Build Coastguard Worker     const GLuint rbo = buffer->getName();
531*35238bceSAndroid Build Coastguard Worker 
532*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL_ERROR(gl.bindRenderbuffer(GL_RENDERBUFFER, rbo), gl.getError());
533*35238bceSAndroid Build Coastguard Worker 
534*35238bceSAndroid Build Coastguard Worker     // Specify storage.
535*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL_ERROR(gl.renderbufferStorage(GL_RENDERBUFFER, m_format, 64, 64), gl.getError());
536*35238bceSAndroid Build Coastguard Worker 
537*35238bceSAndroid Build Coastguard Worker     if (ref != DE_NULL)
538*35238bceSAndroid Build Coastguard Worker     {
539*35238bceSAndroid Build Coastguard Worker         Framebuffer fbo(gl);
540*35238bceSAndroid Build Coastguard Worker         const TextureFormat texFormat = glu::mapGLInternalFormat(m_format);
541*35238bceSAndroid Build Coastguard Worker 
542*35238bceSAndroid Build Coastguard Worker         *ref = tcu::Texture2D(texFormat, 64, 64);
543*35238bceSAndroid Build Coastguard Worker         ref->allocLevel(0);
544*35238bceSAndroid Build Coastguard Worker 
545*35238bceSAndroid Build Coastguard Worker         gl.bindFramebuffer(GL_FRAMEBUFFER, *fbo);
546*35238bceSAndroid Build Coastguard Worker         switch (m_format)
547*35238bceSAndroid Build Coastguard Worker         {
548*35238bceSAndroid Build Coastguard Worker         case GL_STENCIL_INDEX8:
549*35238bceSAndroid Build Coastguard Worker             initializeStencilRbo(gl, rbo, *ref);
550*35238bceSAndroid Build Coastguard Worker             break;
551*35238bceSAndroid Build Coastguard Worker         case GL_DEPTH_COMPONENT16:
552*35238bceSAndroid Build Coastguard Worker             initializeDepthRbo(gl, rbo, *ref);
553*35238bceSAndroid Build Coastguard Worker             break;
554*35238bceSAndroid Build Coastguard Worker         case GL_RGBA4:
555*35238bceSAndroid Build Coastguard Worker             initializeColorRbo(gl, rbo, *ref);
556*35238bceSAndroid Build Coastguard Worker             break;
557*35238bceSAndroid Build Coastguard Worker         case GL_RGB5_A1:
558*35238bceSAndroid Build Coastguard Worker             initializeColorRbo(gl, rbo, *ref);
559*35238bceSAndroid Build Coastguard Worker             break;
560*35238bceSAndroid Build Coastguard Worker         case GL_RGB565:
561*35238bceSAndroid Build Coastguard Worker             initializeColorRbo(gl, rbo, *ref);
562*35238bceSAndroid Build Coastguard Worker             break;
563*35238bceSAndroid Build Coastguard Worker         default:
564*35238bceSAndroid Build Coastguard Worker             DE_FATAL("Impossible");
565*35238bceSAndroid Build Coastguard Worker         }
566*35238bceSAndroid Build Coastguard Worker 
567*35238bceSAndroid Build Coastguard Worker         gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
568*35238bceSAndroid Build Coastguard Worker     }
569*35238bceSAndroid Build Coastguard Worker 
570*35238bceSAndroid Build Coastguard Worker     return MovePtr<ClientBuffer>(buffer);
571*35238bceSAndroid Build Coastguard Worker }
572*35238bceSAndroid Build Coastguard Worker 
573*35238bceSAndroid Build Coastguard Worker class UnsupportedImageSource : public ImageSource
574*35238bceSAndroid Build Coastguard Worker {
575*35238bceSAndroid Build Coastguard Worker public:
UnsupportedImageSource(const string & message,GLenum format,bool isYUV)576*35238bceSAndroid Build Coastguard Worker     UnsupportedImageSource(const string &message, GLenum format, bool isYUV)
577*35238bceSAndroid Build Coastguard Worker         : m_message(message)
578*35238bceSAndroid Build Coastguard Worker         , m_format(format)
579*35238bceSAndroid Build Coastguard Worker         , m_isY8Cb8Cr8_420(isYUV)
580*35238bceSAndroid Build Coastguard Worker     {
581*35238bceSAndroid Build Coastguard Worker     }
getRequiredExtension(void) const582*35238bceSAndroid Build Coastguard Worker     string getRequiredExtension(void) const
583*35238bceSAndroid Build Coastguard Worker     {
584*35238bceSAndroid Build Coastguard Worker         fail();
585*35238bceSAndroid Build Coastguard Worker         return "";
586*35238bceSAndroid Build Coastguard Worker     }
createBuffer(const eglw::Library & egl,const glw::Functions &,tcu::Texture2D *) const587*35238bceSAndroid Build Coastguard Worker     MovePtr<ClientBuffer> createBuffer(const eglw::Library &egl, const glw::Functions &, tcu::Texture2D *) const
588*35238bceSAndroid Build Coastguard Worker     {
589*35238bceSAndroid Build Coastguard Worker         DE_UNREF(egl);
590*35238bceSAndroid Build Coastguard Worker         fail();
591*35238bceSAndroid Build Coastguard Worker         return de::MovePtr<ClientBuffer>();
592*35238bceSAndroid Build Coastguard Worker     }
593*35238bceSAndroid Build Coastguard Worker     EGLImageKHR createImage(const Library &egl, EGLDisplay dpy, EGLContext ctx, EGLClientBuffer clientBuffer) const;
getEffectiveFormat(void) const594*35238bceSAndroid Build Coastguard Worker     GLenum getEffectiveFormat(void) const
595*35238bceSAndroid Build Coastguard Worker     {
596*35238bceSAndroid Build Coastguard Worker         return m_format;
597*35238bceSAndroid Build Coastguard Worker     }
isYUVFormatImage(void) const598*35238bceSAndroid Build Coastguard Worker     bool isYUVFormatImage(void) const
599*35238bceSAndroid Build Coastguard Worker     {
600*35238bceSAndroid Build Coastguard Worker         return m_isY8Cb8Cr8_420;
601*35238bceSAndroid Build Coastguard Worker     };
602*35238bceSAndroid Build Coastguard Worker 
603*35238bceSAndroid Build Coastguard Worker private:
604*35238bceSAndroid Build Coastguard Worker     const string m_message;
605*35238bceSAndroid Build Coastguard Worker     GLenum m_format;
606*35238bceSAndroid Build Coastguard Worker     bool m_isY8Cb8Cr8_420;
fail(void) const607*35238bceSAndroid Build Coastguard Worker     void fail(void) const
608*35238bceSAndroid Build Coastguard Worker     {
609*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, m_message.c_str());
610*35238bceSAndroid Build Coastguard Worker     }
611*35238bceSAndroid Build Coastguard Worker };
612*35238bceSAndroid Build Coastguard Worker 
createImage(const Library &,EGLDisplay,EGLContext,EGLClientBuffer) const613*35238bceSAndroid Build Coastguard Worker EGLImageKHR UnsupportedImageSource::createImage(const Library &, EGLDisplay, EGLContext, EGLClientBuffer) const
614*35238bceSAndroid Build Coastguard Worker {
615*35238bceSAndroid Build Coastguard Worker     fail();
616*35238bceSAndroid Build Coastguard Worker     return EGL_NO_IMAGE_KHR;
617*35238bceSAndroid Build Coastguard Worker }
618*35238bceSAndroid Build Coastguard Worker 
createTextureImageSource(EGLenum source,GLenum internalFormat,GLenum format,GLenum type,bool useTexLevel0)619*35238bceSAndroid Build Coastguard Worker MovePtr<ImageSource> createTextureImageSource(EGLenum source, GLenum internalFormat, GLenum format, GLenum type,
620*35238bceSAndroid Build Coastguard Worker                                               bool useTexLevel0)
621*35238bceSAndroid Build Coastguard Worker {
622*35238bceSAndroid Build Coastguard Worker     if (source == EGL_GL_TEXTURE_2D_KHR)
623*35238bceSAndroid Build Coastguard Worker         return MovePtr<ImageSource>(new Texture2DImageSource(internalFormat, format, type, useTexLevel0));
624*35238bceSAndroid Build Coastguard Worker     else
625*35238bceSAndroid Build Coastguard Worker         return MovePtr<ImageSource>(new TextureCubeMapImageSource(source, internalFormat, format, type, useTexLevel0));
626*35238bceSAndroid Build Coastguard Worker }
627*35238bceSAndroid Build Coastguard Worker 
createRenderbufferImageSource(GLenum format)628*35238bceSAndroid Build Coastguard Worker MovePtr<ImageSource> createRenderbufferImageSource(GLenum format)
629*35238bceSAndroid Build Coastguard Worker {
630*35238bceSAndroid Build Coastguard Worker     return MovePtr<ImageSource>(new RenderbufferImageSource(format));
631*35238bceSAndroid Build Coastguard Worker }
632*35238bceSAndroid Build Coastguard Worker 
createUnsupportedImageSource(const string & message,GLenum format,bool isYUV)633*35238bceSAndroid Build Coastguard Worker MovePtr<ImageSource> createUnsupportedImageSource(const string &message, GLenum format, bool isYUV)
634*35238bceSAndroid Build Coastguard Worker {
635*35238bceSAndroid Build Coastguard Worker     return MovePtr<ImageSource>(new UnsupportedImageSource(message, format, isYUV));
636*35238bceSAndroid Build Coastguard Worker }
637*35238bceSAndroid Build Coastguard Worker 
638*35238bceSAndroid Build Coastguard Worker } // namespace Image
639*35238bceSAndroid Build Coastguard Worker } // namespace egl
640*35238bceSAndroid Build Coastguard Worker } // namespace deqp
641