2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://floralicense.org/license/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FUiEffects_RendererGraphicsEngineRenderShaderCache.cpp
20 * @brief Implementation of class for render shaders cache
26 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineRenderShaderCache.h>
27 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineRender.h>
28 #include <renderer/engine-model/FUiEffects_RendererEngineModelProgramProperty.h>
29 #include <renderer/engine-model/FUiEffects_RendererEngineModelShaderProperty.h>
31 namespace Tizen { namespace Ui { namespace Effects { namespace _Renderer { namespace GraphicsEngine
35 RenderShaderCache::GetShaderType(Tizen::Ui::Effects::_Renderer::EngineModel::ShaderProperty::ShaderType::Value shaderType)
39 case EngineModel::ShaderProperty::ShaderType::VERTEX:
40 return GL_VERTEX_SHADER;
41 case EngineModel::ShaderProperty::ShaderType::FRAGMENT:
42 return GL_FRAGMENT_SHADER;
44 return GL_VERTEX_SHADER;
48 RenderShaderCache::IsBinary(Tizen::Ui::Effects::_Renderer::EngineModel::ShaderProperty::DataType::Value dataType)
50 if (dataType == EngineModel::ShaderProperty::DataType::BINARY_DATA)
58 RenderShaderCache::RenderShaderCache(Render *pRender, EngineModel::ShaderProperty* pShader):
65 RenderShaderCache::~RenderShaderCache(void)
71 RenderShaderCache::DropCache(void)
78 RenderShaderCache::Die(void)
86 RenderShaderCache::DestroyCache(void)
90 _pShader->SetCache(RenderShaderCachePtr());
97 glDeleteShader(_shaderId);
104 RenderShaderCache::Validate(Render* pRender)
110 if (null == _pShader)
116 _shaderId = glCreateShader(GetShaderType(_pShader->GetShaderType()));
119 if (!IsBinary(_pShader->GetDataType()))
121 const char* pData = (reinterpret_cast<const char*>(_pShader->GetData()));
123 glShaderSource(_shaderId, 1, &pData, null);
124 glCompileShader(_shaderId);
126 GLint compiled = GL_FALSE;
127 glGetShaderiv(_shaderId, GL_COMPILE_STATUS, &compiled);
131 int infologLength = 0;
132 int charsWritten = 0;
134 glGetShaderiv(_shaderId, GL_INFO_LOG_LENGTH, &infologLength);
136 if (infologLength > 0)
138 std::string infoLog(infologLength, '\0');
140 glGetShaderInfoLog(_shaderId, infologLength, &charsWritten, &infoLog[0]);
141 SysLogException(NID_UI_EFFECT, E_SYSTEM, "Shader compilation error: %s in \"%s\"", infoLog.c_str(), pData);
146 SysLog(NID_UI_EFFECT, "Shader was compiled successfully");
154 RenderShaderCache::AttachToProgram(Render* pRender, GLuint programId)
161 glAttachShader(programId, _shaderId);
166 RenderProgramCache::RenderProgramCache(Render* pRender, EngineModel::ProgramProperty* pProgram)
167 : RenderCache(pRender)
171 , _pVertexShader(null)
172 , _pFragmentShader(null)
173 , _pProgram(pProgram)
177 RenderProgramCache::~RenderProgramCache(void)
183 RenderProgramCache::DropCache(void)
190 RenderProgramCache::Die(void)
198 RenderProgramCache::DestroyCache(void)
202 _pProgram->SetCache(RenderProgramCachePtr());
209 glDeleteProgram(_programId);
216 RenderProgramCache::Validate(Render* pRender)
227 EngineModel::ShaderPropertyPtr vertexShaderProperty = _pProgram->GetShader(Tizen::Ui::Effects::_Renderer::EngineModel::ShaderProperty::ShaderType::VERTEX);
228 if (!vertexShaderProperty)
233 _pVertexShader = static_cast<RenderShaderCache*>(System::GetImpl(vertexShaderProperty->GetCache()));
236 pRender->BuildCache(*System::GetImpl(vertexShaderProperty));
237 _pVertexShader = static_cast<RenderShaderCache*>(System::GetImpl(vertexShaderProperty->GetCache()));
240 EngineModel::ShaderPropertyPtr fragmentShaderProperty = _pProgram->GetShader(Tizen::Ui::Effects::_Renderer::EngineModel::ShaderProperty::ShaderType::FRAGMENT);
241 if (!fragmentShaderProperty)
245 _pFragmentShader = static_cast<RenderShaderCache*>(System::GetImpl(fragmentShaderProperty->GetCache()));
246 if (!_pFragmentShader)
248 pRender->BuildCache(*System::GetImpl(fragmentShaderProperty));
249 _pFragmentShader = static_cast<RenderShaderCache*>(System::GetImpl(fragmentShaderProperty->GetCache()));
254 glDeleteProgram(_programId);
257 _programId = glCreateProgram();
259 _pVertexShader->AttachToProgram(pRender, _programId);
260 _pFragmentShader->AttachToProgram(pRender, _programId);
261 glLinkProgram(_programId);
263 int isLinked = GL_FALSE;
264 glGetProgramiv(_programId, GL_LINK_STATUS, (int *)&isLinked);
266 if (isLinked == GL_FALSE)
268 int infologLength = 0;
269 int charsWritten = 0;
271 glGetProgramiv(_programId, GL_INFO_LOG_LENGTH, &infologLength);
273 if (infologLength > 0)
275 std::string infoLog(infologLength, '\0');
277 glGetProgramInfoLog(_programId, infologLength, &charsWritten, &infoLog[0]);
278 SysLogException(NID_UI_EFFECT, E_SYSTEM, "Shader program linkage error: %s", infoLog.c_str());
283 SysLog(NID_UI_EFFECT, "Compiled shader was linked successfully");
289 char nameBuffer[256];
290 GLint nameLength = 0;
294 GLint numAttributes = 0;
295 glGetProgramiv(_programId, GL_ACTIVE_ATTRIBUTES, &numAttributes);
296 _attributes.resize(numAttributes);
297 for (GLint i = 0; numAttributes > i; ++i)
299 glGetActiveAttrib(_programId, i, 250, &nameLength, &size, &type, nameBuffer);
300 nameBuffer[nameLength] = 0;
301 _attributes[i].first.type = type;
302 _attributes[i].first.size = size;
303 _attributes[i].first.location = glGetAttribLocation(_programId, nameBuffer);
304 _attributes[i].second = nameBuffer;
307 GLint numUniforms = 0;
308 glGetProgramiv(_programId, GL_ACTIVE_UNIFORMS, &numUniforms);
309 _uniforms.resize(numUniforms);
311 for (GLint i = 0; numUniforms > i; ++i)
313 glGetActiveUniform(_programId, i, 250, &nameLength, &size, &type, nameBuffer);
314 nameBuffer[nameLength] = 0;
315 _uniforms[i].first.type = type;
316 _uniforms[i].first.size = size;
317 _uniforms[i].first.location = glGetUniformLocation(_programId, nameBuffer);
318 _uniforms[i].second = nameBuffer;
326 RenderProgramCache::UseProgram(Render* pRender)
333 glUseProgram(_programId);
339 RenderProgramCache::EnableAttributes(Render*)
341 const AttribuleListSizeType len = _attributes.size();
342 for (AttribuleListSizeType i = 0; len > i; ++i)
344 glEnableVertexAttribArray(_attributes[i].first.location);
350 RenderProgramCache::DisableAttributes(Render*)
352 const AttribuleListSizeType len = _attributes.size();
353 for (AttribuleListSizeType i = 0; len > i; ++i)
355 glDisableVertexAttribArray(_attributes[i].first.location);
360 const RenderProgramCache::AttribuleListValueType&
361 RenderProgramCache::GetAttribute(AttribuleListSizeType aIndex)
363 return _attributes[aIndex];
366 RenderProgramCache::AttribuleListSizeType
367 RenderProgramCache::GetNumAttributes(void)
369 return _attributes.size();
372 const RenderProgramCache::UniformListValueType&
373 RenderProgramCache::GetUniform(UniformListSizeType aIndex)
375 return _uniforms[aIndex];
378 RenderProgramCache::UniformListSizeType
379 RenderProgramCache::GetNumUniforms(void)
381 return _uniforms.size();
385 }}}}} // Tizen::Ui::Effects::_Renderer::GraphicsEngine