2 * Copyright (c) 2014 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>
26 #include <dali/public-api/common/constants.h>
27 #include <dali/public-api/common/compile-time-assert.h>
28 #include <dali/integration-api/platform-abstraction.h>
29 #include <dali/integration-api/debug.h>
30 #include <dali/internal/render/common/render-manager.h>
31 #include <dali/devel-api/rendering/material.h>
39 namespace // unnamed namespace
42 DALI_COMPILE_TIME_ASSERT( TEXTURE_UNIT_LAST <= 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 : mGlAbstraction(glAbstraction),
69 mGlContextCreated(false),
73 mDepthBufferEnabled(false),
74 mDepthMaskEnabled(false),
75 mDitherEnabled(true), // This the only GL capability which defaults to true
76 mPolygonOffsetFillEnabled(false),
77 mSampleAlphaToCoverageEnabled(false),
78 mSampleCoverageEnabled(false),
79 mScissorTestEnabled(false),
80 mStencilBufferEnabled(false),
81 mClearColorSet(false),
82 mUsingDefaultBlendColor(true),
83 mBoundArrayBufferId(0),
84 mBoundElementArrayBufferId(0),
85 mBoundTransformFeedbackBufferId(0),
86 mActiveTextureUnit( TEXTURE_UNIT_LAST ),
87 mBlendColor(Color::TRANSPARENT),
88 mBlendFuncSeparateSrcRGB(GL_ONE),
89 mBlendFuncSeparateDstRGB(GL_ZERO),
90 mBlendFuncSeparateSrcAlpha(GL_ONE),
91 mBlendFuncSeparateDstAlpha(GL_ZERO),
92 mBlendEquationSeparateModeRGB( GL_FUNC_ADD ),
93 mBlendEquationSeparateModeAlpha( GL_FUNC_ADD ),
95 mClearColor(Color::WHITE), // initial color, never used until it's been set by the user
96 mCullFaceMode( Dali::Renderer::NONE ),
97 mViewPort( 0, 0, 0, 0 )
105 void Context::GlContextCreated()
107 DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::GlContextCreated()\n");
109 DALI_ASSERT_DEBUG(!mGlContextCreated);
111 mGlContextCreated = true;
113 // Set the initial GL state, and check it.
121 void Context::GlContextDestroyed()
123 DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::GlContextDestroyed()\n");
124 mGlContextCreated = false;
127 const char* Context::ErrorToString( GLenum errorCode )
129 for( unsigned int i = 0; i < sizeof(errors) / sizeof(errors[0]); ++i)
131 if (errorCode == errors[i].errorCode)
133 return errors[i].errorString;
136 return "Unknown Open GLES error";
139 const Rect< int >& Context::GetViewport()
144 void Context::FlushVertexAttributeLocations()
146 for( unsigned int i = 0; i < MAX_ATTRIBUTE_CACHE_SIZE; ++i )
148 // see if our cached state is different to the actual state
149 if (mVertexAttributeCurrentState[ i ] != mVertexAttributeCachedState[ i ] )
151 // it's different so make the change to the driver
152 // and update the cached state
153 mVertexAttributeCurrentState[ i ] = mVertexAttributeCachedState[ i ];
155 if (mVertexAttributeCurrentState[ i ] )
157 LOG_GL("EnableVertexAttribArray %d\n", i);
158 CHECK_GL( mGlAbstraction, mGlAbstraction.EnableVertexAttribArray( i ) );
162 LOG_GL("DisableVertexAttribArray %d\n", i);
163 CHECK_GL( mGlAbstraction, mGlAbstraction.DisableVertexAttribArray( i ) );
170 void Context::SetVertexAttributeLocation(unsigned int location, bool state)
173 if( location >= MAX_ATTRIBUTE_CACHE_SIZE )
175 // not cached, make the gl call through context
178 LOG_GL("EnableVertexAttribArray %d\n", location);
179 CHECK_GL( mGlAbstraction, mGlAbstraction.EnableVertexAttribArray( location ) );
183 LOG_GL("DisableVertexAttribArray %d\n", location);
184 CHECK_GL( mGlAbstraction, mGlAbstraction.DisableVertexAttribArray( location ) );
189 // set the cached state, it will be set at the next draw call
190 // if it's different from the current driver state
191 mVertexAttributeCachedState[ location ] = state;
195 void Context::InitializeGlState()
197 DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::InitializeGlState()\n");
198 DALI_ASSERT_DEBUG(mGlContextCreated);
200 mClearColorSet = false;
203 mBlendEnabled = false;
204 mDepthBufferEnabled = false;
205 mDepthMaskEnabled = false;
206 mPolygonOffsetFillEnabled = false;
207 mSampleAlphaToCoverageEnabled = false;
208 mSampleCoverageEnabled = false;
209 mScissorTestEnabled = false;
210 mStencilBufferEnabled = false;
211 mDitherEnabled = false; // This and GL_MULTISAMPLE are the only GL capability which defaults to true
212 mGlAbstraction.Disable(GL_DITHER);
214 mBoundArrayBufferId = 0;
215 mBoundElementArrayBufferId = 0;
216 mBoundTransformFeedbackBufferId = 0;
217 mActiveTextureUnit = TEXTURE_UNIT_IMAGE;
219 mUsingDefaultBlendColor = true; //Default blend color is (0,0,0,0)
221 mBlendFuncSeparateSrcRGB = GL_ONE;
222 mBlendFuncSeparateDstRGB = GL_ZERO;
223 mBlendFuncSeparateSrcAlpha = GL_ONE;
224 mBlendFuncSeparateDstAlpha = GL_ZERO;
226 // initial state is GL_FUNC_ADD for both RGB and Alpha blend modes
227 mBlendEquationSeparateModeRGB = GL_FUNC_ADD;
228 mBlendEquationSeparateModeAlpha = GL_FUNC_ADD;
230 mCullFaceMode = Dali::Renderer::NONE; //By default cullface is disabled, front face is set to CCW and cull face is set to back
232 // get maximum texture size
233 mGlAbstraction.GetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
235 // reset viewport, this will be set to something useful when rendering
236 mViewPort.x = mViewPort.y = mViewPort.width = mViewPort.height = 0;
238 //Initialze vertex attribute cache
239 memset( &mVertexAttributeCachedState, 0, sizeof(mVertexAttributeCachedState) );
240 memset( &mVertexAttributeCurrentState, 0, sizeof(mVertexAttributeCurrentState) );
242 //Initialize bound 2d texture cache
243 memset( &mBound2dTextureId, 0, sizeof(mBound2dTextureId) );
245 mFrameBufferStateCache.Reset();
250 void Context::PrintCurrentState()
252 const char* cullFaceModes[] = { "CullNone", "CullFront", "CullBack", "CullFrontAndBack" };
253 DALI_LOG_INFO( gContextLogFilter, Debug::General,
254 "\n----------------- Context State BEGIN -----------------\n"
260 "Polygon Offset Fill = %s\n"
261 "Sample Alpha To Coverage = %s\n"
262 "Sample Coverage = %s\n"
263 "Scissor Test = %s\n"
264 "Stencil Test = %s\n"
265 "----------------- Context State END -----------------\n",
266 mBlendEnabled ? "Enabled" : "Disabled",
267 cullFaceModes[ mCullFaceMode ],
268 mDepthBufferEnabled ? "Enabled" : "Disabled",
269 mDepthMaskEnabled ? "Enabled" : "Disabled",
270 mDitherEnabled ? "Enabled" : "Disabled",
271 mPolygonOffsetFillEnabled ? "Enabled" : "Disabled",
272 mSampleAlphaToCoverageEnabled ? "Enabled" : "Disabled",
273 mSampleCoverageEnabled ? "Enabled" : "Disabled",
274 mScissorTestEnabled ? "Enabled" : "Disabled",
275 mStencilBufferEnabled ? "Enabled" : "Disabled");
278 #endif // DALI_CONTEXT_LOGGING
280 } // namespace Internal