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