1 #ifndef _TCUIOSPLATFORM_HPP
2 #define _TCUIOSPLATFORM_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Tester Core
5  * ----------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief iOS Platform implementation.
24  *//*--------------------------------------------------------------------*/
25 
26 #include "tcuDefs.hpp"
27 #include "tcuPlatform.hpp"
28 #include "gluPlatform.hpp"
29 #include "gluRenderContext.hpp"
30 #include "gluContextFactory.hpp"
31 #include "gluObjectWrapper.hpp"
32 #include "tcuRenderTarget.hpp"
33 #include "glwFunctions.hpp"
34 #include "deMutex.hpp"
35 
36 #import "tcuEAGLView.h"
37 
38 #import <OpenGLES/EAGL.h>
39 
40 namespace tcu
41 {
42 namespace ios
43 {
44 
45 class ScreenManager
46 {
47 public:
48 									ScreenManager			(tcuEAGLView* view);
49 									~ScreenManager			(void);
50 
51 	CAEAGLLayer*					acquireScreen			(void);
52 	void							releaseScreen			(CAEAGLLayer* layer);
53 
54 private:
55 									ScreenManager			(const ScreenManager&);
56 	ScreenManager&					operator=				(const ScreenManager&);
57 
58 	tcuEAGLView*					m_view;
59 	de::Mutex						m_viewLock;
60 };
61 
62 class ContextFactory : public glu::ContextFactory
63 {
64 public:
65 									ContextFactory			(ScreenManager* screenManager);
66 									~ContextFactory			(void);
67 
68 	glu::RenderContext*				createContext			(const glu::RenderConfig& config, const tcu::CommandLine& cmdLine) const;
69 
70 private:
71 	ScreenManager* const			m_screenManager;
72 };
73 
74 class Platform : public tcu::Platform, private glu::Platform
75 {
76 public:
77 									Platform				(ScreenManager* screenManager);
78 	virtual							~Platform				(void);
79 
getGLPlatform(void) const80 	const glu::Platform&			getGLPlatform			(void) const { return static_cast<const glu::Platform&>(*this); }
81 };
82 
83 //! EAGLContext-backed rendering context. Doesn't have default framebuffer.
84 class RawContext : public glu::RenderContext
85 {
86 public:
87 									RawContext				(glu::ContextType type);
88 	virtual							~RawContext				(void);
89 
getType(void) const90 	virtual glu::ContextType		getType					(void) const { return m_type;							}
getFunctions(void) const91 	virtual const glw::Functions&	getFunctions			(void) const { return m_functions;						}
getRenderTarget(void) const92 	virtual const RenderTarget&		getRenderTarget			(void) const { return m_emptyTarget;					}
getDefaultFramebuffer(void) const93 	virtual deUint32				getDefaultFramebuffer	(void) const { DE_FATAL("No framebuffer"); return 0;	}
94 	virtual void					postIterate				(void);
95 
96 protected:
getEAGLContext(void) const97 	EAGLContext*					getEAGLContext			(void) const { return m_context; }
98 
99 private:
100 	glu::ContextType				m_type;
101 	EAGLContext*					m_context;
102 	glw::Functions					m_functions;
103 	tcu::RenderTarget				m_emptyTarget;
104 };
105 
106 class ScreenContext : public RawContext
107 {
108 public:
109 									ScreenContext			(ScreenManager* screenManager, const glu::RenderConfig& config);
110 									~ScreenContext			(void);
111 
getRenderTarget(void) const112 	virtual const RenderTarget&		getRenderTarget			(void) const { return m_renderTarget;	}
getDefaultFramebuffer(void) const113 	virtual deUint32				getDefaultFramebuffer	(void) const { return *m_framebuffer;	}
114 	virtual void					postIterate				(void);
115 
116 private:
117 	void							createFramebuffer		(const glu::RenderConfig& config);
118 
119 	ScreenManager*					m_screenManager;
120 	CAEAGLLayer*					m_layer;
121 
122 	glu::Framebuffer				m_framebuffer;
123 	glu::Renderbuffer				m_colorBuffer;
124 	glu::Renderbuffer				m_depthStencilBuffer;
125 	tcu::RenderTarget				m_renderTarget;
126 };
127 
128 } // ios
129 } // tcu
130 
131 #endif // _TCUIOSPLATFORM_H
132