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_RendererGraphicsEngineRenderDrawableCache.cpp
20 * @brief Implementation of class for drawable objects cache
25 #include <renderer/engine-model/FUiEffects_RendererEngineModelBuffer.h>
26 #include <renderer/engine-model/FUiEffects_RendererEngineModelGeometry.h>
27 #include <renderer/engine-model/FUiEffects_RendererEngineModelDrawable.h>
28 #include <renderer/engine-model/FUiEffects_RendererEngineModelMaterial.h>
29 #include <renderer/engine-model/FUiEffects_RendererEngineModelShaderProperty.h>
30 #include <renderer/engine-model/FUiEffects_RendererEngineModelProgramProperty.h>
31 #include <renderer/engine-model/FUiEffects_RendererEngineModelTexture2DProperty.h>
32 #include <renderer/engine-model/FUiEffects_RendererEngineModelMatrix4fProperty.h>
33 #include <renderer/engine-model/FUiEffects_RendererEngineModelIntProperty.h>
34 #include <renderer/engine-model/FUiEffects_RendererEngineModelFloatProperty.h>
35 #include <renderer/engine-model/FUiEffects_RendererEngineModelVector2fProperty.h>
36 #include <renderer/engine-model/FUiEffects_RendererEngineModelVector3fProperty.h>
37 #include <renderer/engine-model/FUiEffects_RendererEngineModelVector4fProperty.h>
38 #include <renderer/engine-model/FUiEffects_RendererEngineModelFloatArrayProperty.h>
40 #include <renderer/math/FUiEffects_RendererMathVector.h>
42 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineOpenGLImplementation.h>
43 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineRenderDrawableCache.h>
44 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineRenderBufferCache.h>
45 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineRenderTextureCache.h>
46 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineRenderShaderCache.h>
47 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineRender.h>
49 namespace Tizen { namespace Ui { namespace Effects { namespace _Renderer { namespace GraphicsEngine
52 UseProgram::UseProgram(RenderProgramCache* pProgram):
58 UseProgram::Apply(Render* pRender)
60 __pProgram->UseProgram(pRender); __pProgram->EnableAttributes(pRender);
65 DisableProgramAttributers::DisableProgramAttributers(RenderProgramCache* pProgram):
71 DisableProgramAttributers::Apply(Render* pRender)
73 __pProgram->DisableAttributes(pRender);
77 Sampler2dUniform::Sampler2dUniform(RenderTexture2dCache* pTexture, GLuint stage):
84 Sampler2dUniform::Apply(Render* pRender)
86 __pTexture->Bind(pRender, __stage);
91 Sampler2dAttachmentUniform::Apply(Render* pRender)
93 __pTexture->Bind(pRender, __stage);
97 Sampler2dAttachmentUniform::Sampler2dAttachmentUniform(Texture2dAttachmentCache* pTexture, GLuint stage):
103 Matrix4fUniform::Matrix4fUniform(Tizen::Ui::Effects::_Renderer::EngineModel::Matrix4fProperty* pUniform, GLuint location):
104 __pUniform(pUniform),
110 Matrix4fUniform::Apply(Render*)
112 glUniformMatrix4fv(__location, 1, GL_FALSE, __pUniform->Get().data[0].data);
116 IntUniform::IntUniform(Tizen::Ui::Effects::_Renderer::EngineModel::IntProperty* pUniform, GLuint location):
117 __pUniform(pUniform),
123 IntUniform::Apply(Render*)
125 glUniform1i(__location, __pUniform->Get());
129 FloatUniform::FloatUniform(Tizen::Ui::Effects::_Renderer::EngineModel::FloatProperty* pUniform, GLuint location):
130 __pUniform(pUniform),
136 FloatUniform::Apply(Render*)
138 glUniform1f(__location, __pUniform->Get());
142 FloatArrayUniform::FloatArrayUniform(Tizen::Ui::Effects::_Renderer::EngineModel::FloatArrayProperty* pUniform, GLuint location):
143 __pUniform(pUniform),
149 FloatArrayUniform::Apply(Render* pRender)
151 glUniform1fv(__location, __pUniform->GetNumElements(), __pUniform->GetData());
155 Vector2fUniform::Vector2fUniform(Tizen::Ui::Effects::_Renderer::EngineModel::Vector2fProperty* pUniform, GLuint location):
156 __pUniform(pUniform),
162 Vector2fUniform::Apply(Render*)
164 glUniform2fv(__location, 1, __pUniform->Get().data);
168 Vector3fUniform::Vector3fUniform(Tizen::Ui::Effects::_Renderer::EngineModel::Vector3fProperty* pUniform, GLuint location):
169 __pUniform(pUniform),
175 Vector3fUniform::Apply(Render*)
177 glUniform3fv(__location, 1, __pUniform->Get().data);
181 Vector4fUniform::Vector4fUniform(Tizen::Ui::Effects::_Renderer::EngineModel::Vector4fProperty* pUniform, GLuint location):
188 Vector4fUniform::Apply(Render*)
190 glUniform4fv(__location, 1, _pUniform->Get().data);
194 ProgramAttribute::ProgramAttribute(VertexBufferCache* pAttribute, GLuint location):
195 __pAttribute(pAttribute),
201 ProgramAttribute::Apply(Render* pRender)
203 __pAttribute->BindToAttrib(pRender, __location);
207 BindBuffer::BindBuffer(CompositeVertexBufferCache* pBuffer):
213 BindBuffer::Apply(Render* pRender)
215 __pBuffer->Bind(pRender);
219 DrawIndexed::DrawIndexed(IndexBufferCache* pBuffer):
225 DrawIndexed::Apply(Render* pRender)
227 __pBuffer->DrawElements(pRender);
231 SetState::SetState(RenderStateCache* pState):
237 SetState::Apply(Render* pRender)
239 __pState->Set(pRender);
243 RenderDrawableCache::RenderDrawableCache(Render* pRender, EngineModel::Drawable* pDrawable) :
244 RenderCache(pRender),
245 __pDrawable(pDrawable),
250 RenderDrawableCache::~RenderDrawableCache(void)
255 RenderDrawableCache::ExternalTexturesListSizeType
256 RenderDrawableCache::NumExternalTextures(void)
258 return __externalTextures.size();
261 EngineModel::TextureAttachment*
262 RenderDrawableCache::GetExternalTexture(ExternalTexturesListSizeType index)
264 if (index < __externalTextures.size())
266 return __externalTextures[index];
271 const Math::Matrix4f&
272 RenderDrawableCache::GetWorld(void)
274 return __pDrawable->GetWorld();
278 RenderDrawableCache::DropCache(void)
280 __ownCommands.clear();
282 __externalTextures.clear();
287 RenderDrawableCache::Die(void)
295 RenderDrawableCache::DestroyCache(void)
299 __pDrawable->SetCache(RenderDrawableCachePtr());
308 struct ProgramFinder: EngineModel::PropertyVisitor
310 RenderProgramCache* programCache;
311 RenderAlphaBlendCache* alphaBlend;
314 ProgramFinder(Tizen::Ui::Effects::_Renderer::EngineModel::MaterialPtr& material, Render* pRender):
319 const size_t len = material->GetNumProperties();
320 for (size_t i = 0; len > i; ++i)
322 material->GetProperty(i)->Visit(*this);
327 OnProgramProperty(Tizen::Ui::Effects::_Renderer::EngineModel::ProgramProperty& prop)
329 programCache = static_cast<RenderProgramCache*>(System::GetImpl(prop.GetCache()));
332 render->BuildCache(prop);
333 programCache = static_cast<RenderProgramCache*>(System::GetImpl(prop.GetCache()));
340 OnAlphaBlendProperty(Tizen::Ui::Effects::_Renderer::EngineModel::AlphaBlendProperty& prop)
342 alphaBlend = static_cast<RenderAlphaBlendCache*>(System::GetImpl(prop.GetCache()));
345 render->BuildCache(prop);
346 alphaBlend = static_cast<RenderAlphaBlendCache*>(System::GetImpl(prop.GetCache()));
353 struct UniformFinder: EngineModel::PropertyVisitor
355 RenderProgramCache* program;
356 EngineModel::MaterialPtr& material;
357 RenderDrawableCache::RenderCommandsListType& commands;
358 RenderDrawableCache::RenderCommandsListType& ownCommands;
359 std::vector<Tizen::Ui::Effects::_Renderer::EngineModel::TextureAttachment*>& externalTextures;
362 const RenderProgramCache::UniformListValueType* currentUniformInfo;
363 GLuint currentTextureStage;
365 UniformFinder(RenderProgramCache* pProgram, EngineModel::MaterialPtr& materialArg, Render* pRenderArg,
366 RenderDrawableCache::RenderCommandsListType& commandsArg, RenderDrawableCache::RenderCommandsListType& ownCommandsArg,
367 std::vector<Tizen::Ui::Effects::_Renderer::EngineModel::TextureAttachment*>& externalTexturesArg):
369 material(materialArg),
370 commands(commandsArg),
371 ownCommands(ownCommandsArg),
372 externalTextures(externalTexturesArg),
374 currentUniformInfo(null),
375 currentTextureStage(0)
377 const RenderProgramCache::UniformListSizeType numUniforms = program->GetNumUniforms();
378 for (RenderProgramCache::UniformListSizeType i = 0; numUniforms > i; ++i)
380 const RenderProgramCache::UniformListValueType& uniformInfo = program->GetUniform(i);
381 currentUniformInfo = &uniformInfo;
382 EngineModel::PropertyPtr property = material->GetProperty(uniformInfo.second);
385 RenderCommandPtr renderCommandPtr = pRenderArg->GetDefaultRenderCommand(currentUniformInfo);
386 if (System::GetImpl(renderCommandPtr) != null)
388 commands.push_back(renderCommandPtr);
389 ownCommands.push_back(renderCommandPtr);
393 property->Visit(*this);
398 OnTexture2DProperty(Tizen::Ui::Effects::_Renderer::EngineModel::Texture2dProperty& prop)
400 glUniform1i(currentUniformInfo->first.location, currentTextureStage);
402 RenderTexture2dCache* cache = static_cast<RenderTexture2dCache*>(System::GetImpl(prop.GetCache()));
405 pRender->BuildCache(prop, currentTextureStage);
406 cache = static_cast<RenderTexture2dCache*>(System::GetImpl(prop.GetCache()));
409 RenderCommandPtr renderCommandPtr(new (std::nothrow) Sampler2dUniform(cache, currentTextureStage));
410 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "Sampler2dUniform = null");
412 commands.push_back(renderCommandPtr);
413 ownCommands.push_back(renderCommandPtr);
414 ++currentTextureStage;
419 OnTexture2DAttachmentProperty(Tizen::Ui::Effects::_Renderer::EngineModel::Texture2dAttachmentProperty& prop)
421 glUniform1i(currentUniformInfo->first.location, currentTextureStage);
423 Texture2dAttachmentCache* cache = static_cast<Texture2dAttachmentCache*>(System::GetImpl(prop.GetCache()));
426 pRender->BuildCache(prop, currentTextureStage);
427 cache = static_cast<Texture2dAttachmentCache*>(System::GetImpl(prop.GetCache()));
429 externalTextures.push_back(&prop);
430 RenderCommandPtr renderCommandPtr(new (std::nothrow) Sampler2dAttachmentUniform(cache, currentTextureStage));
431 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "Sampler2dAttachmentUniform = null");
433 commands.push_back(renderCommandPtr);
434 ownCommands.push_back(renderCommandPtr);
435 ++currentTextureStage;
440 OnMatrix4fProperty(Tizen::Ui::Effects::_Renderer::EngineModel::Matrix4fProperty& prop)
442 RenderCommandPtr renderCommandPtr(new (std::nothrow) Matrix4fUniform(&prop, currentUniformInfo->first.location));
443 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "Matrix4fUniform = null");
445 commands.push_back(renderCommandPtr);
446 ownCommands.push_back(renderCommandPtr);
451 OnVector2fProperty(Tizen::Ui::Effects::_Renderer::EngineModel::Vector2fProperty& prop)
453 RenderCommandPtr renderCommandPtr(new (std::nothrow) Vector2fUniform(&prop, currentUniformInfo->first.location));
454 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "Vector2fUniform = null");
456 commands.push_back(renderCommandPtr);
457 ownCommands.push_back(renderCommandPtr);
462 OnVector3fProperty(Tizen::Ui::Effects::_Renderer::EngineModel::Vector3fProperty& prop)
464 RenderCommandPtr renderCommandPtr(new (std::nothrow) Vector3fUniform(&prop, currentUniformInfo->first.location));
465 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "Vector3fUniform = null");
467 commands.push_back(renderCommandPtr);
468 ownCommands.push_back(renderCommandPtr);
473 OnVector4fProperty(Tizen::Ui::Effects::_Renderer::EngineModel::Vector4fProperty& prop)
475 RenderCommandPtr renderCommandPtr(new (std::nothrow) Vector4fUniform(&prop, currentUniformInfo->first.location));
476 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "Vector4fUniform = null");
478 commands.push_back(renderCommandPtr);
479 ownCommands.push_back(renderCommandPtr);
484 OnIntProperty(Tizen::Ui::Effects::_Renderer::EngineModel::IntProperty& prop)
486 RenderCommandPtr renderCommandPtr(new (std::nothrow) IntUniform(&prop, currentUniformInfo->first.location));
487 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "IntUniform = null");
489 commands.push_back(renderCommandPtr);
490 ownCommands.push_back(renderCommandPtr);
495 OnFloatProperty(Tizen::Ui::Effects::_Renderer::EngineModel::FloatProperty& prop)
497 RenderCommandPtr renderCommandPtr(new (std::nothrow) FloatUniform(&prop, currentUniformInfo->first.location));
498 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "FloatUniform = null");
500 commands.push_back(renderCommandPtr);
501 ownCommands.push_back(renderCommandPtr);
506 OnFloatArrayProperty(Tizen::Ui::Effects::_Renderer::EngineModel::FloatArrayProperty& prop)
508 RenderCommandPtr renderCommandPtr(new (std::nothrow) FloatArrayUniform(&prop, currentUniformInfo->first.location));
509 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "FloatArrayUniform = null");
511 commands.push_back(renderCommandPtr);
512 ownCommands.push_back(renderCommandPtr);
518 struct GeometryFinder: EngineModel::BufferVisitor
520 RenderProgramCache* pProgram;
521 EngineModel::GeometryPtr& geometry;
522 RenderDrawableCache::RenderCommandsListType& commands;
523 RenderDrawableCache::RenderCommandsListType& ownCommands;
526 const RenderProgramCache::AttribuleListValueType* pCurrentAttributeInfo;
528 GeometryFinder(RenderProgramCache* pProgramArg, EngineModel::GeometryPtr& geometryArg, Render* pRenderArg,
529 RenderDrawableCache::RenderCommandsListType& commandsArg, RenderDrawableCache::RenderCommandsListType& ownCommandsArg):
530 pProgram(pProgramArg),
531 geometry(geometryArg),
532 commands(commandsArg),
533 ownCommands(ownCommandsArg),
535 pCurrentAttributeInfo(null)
537 const RenderProgramCache::AttribuleListSizeType numAttributes = pProgram->GetNumAttributes();
538 for (RenderProgramCache::AttribuleListSizeType i = 0; numAttributes > i; ++i)
540 const RenderProgramCache::AttribuleListValueType& attributeInfo = pProgram->GetAttribute(i);
541 pCurrentAttributeInfo = &attributeInfo;
542 EngineModel::BufferPtr buffer = geometry->GetBuffer(attributeInfo.second);
547 buffer->Visit(*this);
550 EngineModel::BufferPtr buffer = geometry->GetIndexBuffer();
555 buffer->Visit(*this);
560 OnVertexBuffer(Tizen::Ui::Effects::_Renderer::EngineModel::VertexBuffer& prop)
562 VertexBufferCache* cache = static_cast<VertexBufferCache*>(System::GetImpl(prop.GetCache()));
565 pRender->BuildCache(prop);
568 RenderCommandPtr renderCommandPtr(new (std::nothrow) ProgramAttribute(static_cast<VertexBufferCache*>(System::GetImpl(prop.GetCache())), pCurrentAttributeInfo->first.location));
569 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "ProgramAttribute = null");
571 commands.push_back(renderCommandPtr);
572 ownCommands.push_back(renderCommandPtr);
577 OnCompositeVertexBuffer(Tizen::Ui::Effects::_Renderer::EngineModel::CompositeVertexBuffer& prop)
579 CompositeVertexBufferCache* cache = static_cast<CompositeVertexBufferCache*>(System::GetImpl(prop.GetCache()));
582 pRender->BuildCache(prop);
585 RenderCommandPtr renderCommandPtr(new (std::nothrow) BindBuffer(static_cast<CompositeVertexBufferCache*>(System::GetImpl(prop.GetCache()))));
586 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "BindBuffer = null");
588 commands.push_back(renderCommandPtr);
589 ownCommands.push_back(renderCommandPtr);
594 OnPartVertexBuffer(Tizen::Ui::Effects::_Renderer::EngineModel::PartVertexBuffer& prop)
596 prop.GetCompositeBuffer()->Visit(*this);
598 VertexBufferCache* cache = static_cast<VertexBufferCache*>(System::GetImpl(prop.GetCache()));
601 pRender->BuildCache(prop);
604 RenderCommandPtr renderCommandPtr(new (std::nothrow) ProgramAttribute(static_cast<VertexBufferCache*>(System::GetImpl(prop.GetCache())), pCurrentAttributeInfo->first.location));
605 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "ProgramAttribute = null");
607 commands.push_back(renderCommandPtr);
608 ownCommands.push_back(renderCommandPtr);
613 OnIndexBuffer(Tizen::Ui::Effects::_Renderer::EngineModel::IndexBuffer& prop)
615 IndexBufferCache* cache = static_cast<IndexBufferCache*>(System::GetImpl(prop.GetCache()));
618 pRender->BuildCache(prop);
621 RenderCommandPtr renderCommandPtr(new (std::nothrow) DrawIndexed(static_cast<IndexBufferCache*>(System::GetImpl(prop.GetCache()))));
622 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "DrawIndexed = null");
624 commands.push_back(renderCommandPtr);
625 ownCommands.push_back(renderCommandPtr);
632 RenderDrawableCache::Validate(Render* pRender)
634 RenderCommandPtr renderCommandPtr;
645 __ownCommands.clear();
647 __externalTextures.clear();
649 EngineModel::MaterialPtr material = __pDrawable->GetMaterial();
655 EngineModel::GeometryPtr geometry = __pDrawable->GetGeometry();
662 ProgramFinder programFinder(material, pRender);
663 RenderProgramCache* pProgram = programFinder.programCache;
664 if (null == pProgram)
669 renderCommandPtr = RenderCommandPtr(new (std::nothrow) UseProgram(pProgram));
670 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "UseProgram = null");
672 __commands.push_back(renderCommandPtr);
673 __ownCommands.push_back(renderCommandPtr);
676 if (programFinder.alphaBlend)
678 __pAlphaBlend = programFinder.alphaBlend;
679 renderCommandPtr = RenderCommandPtr(new (std::nothrow) SetState(__pAlphaBlend));
680 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "SetState = null");
682 __commands.push_back(renderCommandPtr);
683 __ownCommands.push_back(renderCommandPtr);
687 pProgram->UseProgram(pRender);
688 UniformFinder uniformFinder(pProgram, material, pRender, __commands, __ownCommands, __externalTextures);
692 GeometryFinder geometryFinder(pProgram, geometry, pRender, __commands, __ownCommands);
695 renderCommandPtr = RenderCommandPtr(new (std::nothrow) DisableProgramAttributers(pProgram));
696 _TryJmp(System::GetImpl(renderCommandPtr) != null, E_OUT_OF_MEMORY, "DisableProgramAttributers = null");
698 __commands.push_back(renderCommandPtr);
699 __ownCommands.push_back(renderCommandPtr);
706 RenderDrawableCache::Draw(Render* pRender)
713 const size_t len = __commands.size();
714 for (size_t i = 0; len > i; ++i)
716 __commands[i]->Apply(pRender);
723 RenderDrawableCache::HasAlphaBlend(Render* pRender)
729 return __pAlphaBlend->IsEnable(pRender);
732 }}}}} // Tizen::Ui::Effects::_Renderer::GraphicsEngine