2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/render/gl-resources/context.h>
24 #include <type_traits>
27 #include <dali/public-api/common/constants.h>
28 #include <dali/public-api/rendering/texture-set.h>
29 #include <dali/integration-api/platform-abstraction.h>
30 #include <dali/integration-api/debug.h>
31 #include <dali/internal/render/common/render-manager.h>
39 namespace // unnamed namespace
42 static_assert( TEXTURE_UNIT_LAST <= Context::MAX_TEXTURE_UNITS, "TEXTURE_UNIT_LAST is greater than Context::MAX_TEXTURE_UNITS" );
49 const GLenum errorCode;
50 const char* errorString;
52 errorStrings errors[] =
54 { GL_NO_ERROR, "GL_NO_ERROR" },
55 { GL_INVALID_ENUM, "GL_INVALID_ENUM" },
56 { GL_INVALID_VALUE, "GL_INVALID_VALUE" },
57 { GL_INVALID_OPERATION, "GL_INVALID_OPERATION" },
58 { GL_OUT_OF_MEMORY, "GL_OUT_OF_MEMORY" }
61 } // unnamed namespace
64 Debug::Filter* gContextLogFilter = Debug::Filter::New(Debug::Concise, false, "LOG_CONTEXT_STATE");
67 Context::Context( Integration::GlAbstraction& glAbstraction )
68 : Context( glAbstraction, nullptr )
72 Context::Context( Integration::GlAbstraction& glAbstraction, std::vector< Context* >* contexts )
73 : mGlAbstraction(glAbstraction),
74 mGlContextCreated(false),
78 mDepthBufferEnabled(false),
79 mDepthMaskEnabled(false),
80 mDitherEnabled(true), // This the only GL capability which defaults to true
81 mPolygonOffsetFillEnabled(false),
82 mSampleAlphaToCoverageEnabled(false),
83 mSampleCoverageEnabled(false),
84 mScissorTestEnabled(false),
85 mStencilBufferEnabled(false),
86 mClearColorSet(false),
87 mUsingDefaultBlendColor(true),
88 mBoundArrayBufferId(0),
89 mBoundElementArrayBufferId(0),
90 mBoundTransformFeedbackBufferId(0),
91 mActiveTextureUnit( TEXTURE_UNIT_LAST ),
92 mBlendColor(Color::TRANSPARENT),
93 mBlendFuncSeparateSrcRGB(GL_ONE),
94 mBlendFuncSeparateDstRGB(GL_ZERO),
95 mBlendFuncSeparateSrcAlpha(GL_ONE),
96 mBlendFuncSeparateDstAlpha(GL_ZERO),
97 mBlendEquationSeparateModeRGB( GL_FUNC_ADD ),
98 mBlendEquationSeparateModeAlpha( GL_FUNC_ADD ),
99 mStencilFunc( GL_ALWAYS ),
100 mStencilFuncRef( 0 ),
101 mStencilFuncMask( 0xFFFFFFFF ),
102 mStencilOpFail( GL_KEEP ),
103 mStencilOpDepthFail( GL_KEEP ),
104 mStencilOpDepthPass( GL_KEEP ),
105 mDepthFunction( GL_LESS ),
107 mClearColor(Color::WHITE), // initial color, never used until it's been set by the user
108 mCullFaceMode( FaceCullingMode::NONE ),
109 mViewPort( 0, 0, 0, 0 ),
110 mSceneContexts( contexts )
118 void Context::GlContextCreated()
120 DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::GlContextCreated()\n");
122 DALI_ASSERT_DEBUG(!mGlContextCreated);
124 mGlContextCreated = true;
126 // Set the initial GL state, and check it.
134 void Context::GlContextDestroyed()
136 DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::GlContextDestroyed()\n");
137 mGlContextCreated = false;
140 const char* Context::ErrorToString( GLenum errorCode )
142 for( unsigned int i = 0; i < sizeof(errors) / sizeof(errors[0]); ++i)
144 if (errorCode == errors[i].errorCode)
146 return errors[i].errorString;
149 return "Unknown Open GLES error";
152 const Rect< int >& Context::GetViewport()
157 void Context::FlushVertexAttributeLocations()
159 for( unsigned int i = 0; i < MAX_ATTRIBUTE_CACHE_SIZE; ++i )
161 // see if our cached state is different to the actual state
162 if (mVertexAttributeCurrentState[ i ] != mVertexAttributeCachedState[ i ] )
164 // it's different so make the change to the driver
165 // and update the cached state
166 mVertexAttributeCurrentState[ i ] = mVertexAttributeCachedState[ i ];
168 if (mVertexAttributeCurrentState[ i ] )
170 LOG_GL("EnableVertexAttribArray %d\n", i);
171 CHECK_GL( mGlAbstraction, mGlAbstraction.EnableVertexAttribArray( i ) );
175 LOG_GL("DisableVertexAttribArray %d\n", i);
176 CHECK_GL( mGlAbstraction, mGlAbstraction.DisableVertexAttribArray( i ) );
183 void Context::SetVertexAttributeLocation(unsigned int location, bool state)
186 if( location >= MAX_ATTRIBUTE_CACHE_SIZE )
188 // not cached, make the gl call through context
191 LOG_GL("EnableVertexAttribArray %d\n", location);
192 CHECK_GL( mGlAbstraction, mGlAbstraction.EnableVertexAttribArray( location ) );
196 LOG_GL("DisableVertexAttribArray %d\n", location);
197 CHECK_GL( mGlAbstraction, mGlAbstraction.DisableVertexAttribArray( location ) );
202 // set the cached state, it will be set at the next draw call
203 // if it's different from the current driver state
204 mVertexAttributeCachedState[ location ] = state;
208 void Context::InitializeGlState()
210 DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::InitializeGlState()\n");
211 DALI_ASSERT_DEBUG(mGlContextCreated);
213 mClearColorSet = false;
216 mBlendEnabled = false;
217 mDepthBufferEnabled = false;
218 mDepthMaskEnabled = false;
219 mPolygonOffsetFillEnabled = false;
220 mSampleAlphaToCoverageEnabled = false;
221 mSampleCoverageEnabled = false;
222 mScissorTestEnabled = false;
223 mStencilBufferEnabled = false;
224 mDitherEnabled = false; // This and GL_MULTISAMPLE are the only GL capability which defaults to true
225 mGlAbstraction.Disable(GL_DITHER);
227 mBoundArrayBufferId = 0;
228 mBoundElementArrayBufferId = 0;
229 mBoundTransformFeedbackBufferId = 0;
230 mActiveTextureUnit = TEXTURE_UNIT_IMAGE;
232 mUsingDefaultBlendColor = true; //Default blend color is (0,0,0,0)
234 mBlendFuncSeparateSrcRGB = GL_ONE;
235 mBlendFuncSeparateDstRGB = GL_ZERO;
236 mBlendFuncSeparateSrcAlpha = GL_ONE;
237 mBlendFuncSeparateDstAlpha = GL_ZERO;
239 // initial state is GL_FUNC_ADD for both RGB and Alpha blend modes
240 mBlendEquationSeparateModeRGB = GL_FUNC_ADD;
241 mBlendEquationSeparateModeAlpha = GL_FUNC_ADD;
243 mCullFaceMode = FaceCullingMode::NONE; //By default cullface is disabled, front face is set to CCW and cull face is set to back
245 // get maximum texture size
246 mGlAbstraction.GetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
248 // reset viewport, this will be set to something useful when rendering
249 mViewPort.x = mViewPort.y = mViewPort.width = mViewPort.height = 0;
251 //Initialze vertex attribute cache
252 memset( &mVertexAttributeCachedState, 0, sizeof(mVertexAttributeCachedState) );
253 memset( &mVertexAttributeCurrentState, 0, sizeof(mVertexAttributeCurrentState) );
255 //Initialize bound 2d texture cache
256 memset( &mBoundTextureId, 0, sizeof(mBoundTextureId) );
258 mFrameBufferStateCache.Reset();
263 void Context::PrintCurrentState()
265 const char* cullFaceModes[] = { "CullNone", "CullFront", "CullBack", "CullFrontAndBack" };
266 DALI_LOG_INFO( gContextLogFilter, Debug::General,
267 "\n----------------- Context State BEGIN -----------------\n"
273 "Polygon Offset Fill = %s\n"
274 "Sample Alpha To Coverage = %s\n"
275 "Sample Coverage = %s\n"
276 "Scissor Test = %s\n"
277 "Stencil Test = %s\n"
278 "----------------- Context State END -----------------\n",
279 mBlendEnabled ? "Enabled" : "Disabled",
280 cullFaceModes[ mCullFaceMode ],
281 mDepthBufferEnabled ? "Enabled" : "Disabled",
282 mDepthMaskEnabled ? "Enabled" : "Disabled",
283 mDitherEnabled ? "Enabled" : "Disabled",
284 mPolygonOffsetFillEnabled ? "Enabled" : "Disabled",
285 mSampleAlphaToCoverageEnabled ? "Enabled" : "Disabled",
286 mSampleCoverageEnabled ? "Enabled" : "Disabled",
287 mScissorTestEnabled ? "Enabled" : "Disabled",
288 mStencilBufferEnabled ? "Enabled" : "Disabled");
291 #endif // DALI_CONTEXT_LOGGING
293 } // namespace Internal