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_RendererGraphicsEngineRenderBufferCache.cpp
20 * @brief Implementation of class for buffer caching
25 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineRenderBufferCache.h>
26 #include <renderer/graphics-engine/FUiEffects_RendererGraphicsEngineOpenGLImplementation.h>
28 namespace Tizen { namespace Ui { namespace Effects { namespace _Renderer { namespace GraphicsEngine
31 IBufferCache::IBufferCache(Render* pRender)
32 : RenderCache(pRender)
33 , _bufferId(static_cast<GLuint>(0))
34 , _dataType(static_cast<GLenum>(0))
38 IBufferCache::~IBufferCache() {}
41 IBufferCache::DropCache(void)
48 IBufferCache::DestroyCache(void)
52 glDeleteBuffers(1, &_bufferId);
59 IBufferCache::GetGlUsage(Tizen::Ui::Effects::_Renderer::EngineModel::SolidBufferStrategy::BufferUsage::Value usage)
63 case EngineModel::SolidBufferStrategy::BufferUsage::STREAM_DRAW:
64 return GL_STREAM_DRAW;
65 case EngineModel::SolidBufferStrategy::BufferUsage::STREAM_READ:
66 return GL_STREAM_DRAW;
67 case EngineModel::SolidBufferStrategy::BufferUsage::STREAM_COPY:
68 return GL_STREAM_DRAW;
69 case EngineModel::SolidBufferStrategy::BufferUsage::STATIC_DRAW:
70 return GL_STATIC_DRAW;
71 case EngineModel::SolidBufferStrategy::BufferUsage::STATIC_READ:
72 return GL_STATIC_DRAW;
73 case EngineModel::SolidBufferStrategy::BufferUsage::STATIC_COPY:
74 return GL_STATIC_DRAW;
75 case EngineModel::SolidBufferStrategy::BufferUsage::DYNAMIC_DRAW:
76 return GL_DYNAMIC_DRAW;
77 case EngineModel::SolidBufferStrategy::BufferUsage::DYNAMIC_READ:
78 return GL_DYNAMIC_DRAW;
79 case EngineModel::SolidBufferStrategy::BufferUsage::DYNAMIC_COPY:
80 return GL_DYNAMIC_DRAW;
82 return GL_STATIC_DRAW;
86 IBufferCache::GetGlDataType(Tizen::Ui::Effects::_Renderer::EngineModel::TypedBufferStrategy::DataType::Value dataType)
90 case EngineModel::TypedBufferStrategy::DataType::BYTE:
92 case EngineModel::TypedBufferStrategy::DataType::UNSIGNED_BYTE:
93 return GL_UNSIGNED_BYTE;
94 case EngineModel::TypedBufferStrategy::DataType::SHORT:
96 case EngineModel::TypedBufferStrategy::DataType::UNSIGNED_SHORT:
97 return GL_UNSIGNED_SHORT;
98 case EngineModel::TypedBufferStrategy::DataType::INT:
100 case EngineModel::TypedBufferStrategy::DataType::UNSIGNED_INT:
101 return GL_UNSIGNED_INT;
102 case EngineModel::TypedBufferStrategy::DataType::FLOAT:
104 case EngineModel::TypedBufferStrategy::DataType::DOUBLE:
105 ThrowJmp("GL_DOUBLE is not allowed as buffer data format undel GLES2");
112 IBufferCache::GetGlDataTypeSize(Tizen::Ui::Effects::_Renderer::EngineModel::TypedBufferStrategy::DataType::Value dataType)
116 case EngineModel::TypedBufferStrategy::DataType::BYTE:
117 case EngineModel::TypedBufferStrategy::DataType::UNSIGNED_BYTE:
119 case EngineModel::TypedBufferStrategy::DataType::SHORT:
120 case EngineModel::TypedBufferStrategy::DataType::UNSIGNED_SHORT:
122 case EngineModel::TypedBufferStrategy::DataType::DOUBLE:
124 case EngineModel::TypedBufferStrategy::DataType::INT:
125 case EngineModel::TypedBufferStrategy::DataType::UNSIGNED_INT:
126 case EngineModel::TypedBufferStrategy::DataType::FLOAT:
133 IndexBufferCache::GetGlPrimitiveType(Tizen::Ui::Effects::_Renderer::EngineModel::IndexBuffer::PrimitiveType::Value primitiveType)
135 switch (primitiveType)
137 case EngineModel::IndexBuffer::PrimitiveType::POINTS:
139 case EngineModel::IndexBuffer::PrimitiveType::LINE_STRIP:
140 return GL_LINE_STRIP;
141 case EngineModel::IndexBuffer::PrimitiveType::LINE_LOOP:
143 case EngineModel::IndexBuffer::PrimitiveType::LINES:
145 case EngineModel::IndexBuffer::PrimitiveType::TRIANGLE_STRIP:
146 return GL_TRIANGLE_STRIP;
147 case EngineModel::IndexBuffer::PrimitiveType::TRIANGLE_FAN:
148 return GL_TRIANGLE_FAN;
149 case EngineModel::IndexBuffer::PrimitiveType::TRIANGLES:
151 case EngineModel::IndexBuffer::PrimitiveType::QUAD_STRIP:
152 ThrowJmp("GL_QUAD_STRIP - is anasseptable as geometry type under GLES2");
154 case EngineModel::IndexBuffer::PrimitiveType::QUADS:
155 ThrowJmp("GL_QUADS - is anasseptable as geometry type under GLES2");
157 case EngineModel::IndexBuffer::PrimitiveType::POLYGON:
158 ThrowJmp("GL_POLYGON - is anasseptable as geometry type under GLES2");
164 IndexBufferCache::IndexBufferCache(Render* pRender, EngineModel::IndexBuffer* pBuffer)
165 : IBufferCache(pRender)
166 , __elementsCount(static_cast<GLsizei>(0))
167 , __primitiveType(static_cast<GLenum>(0))
172 IndexBufferCache::~IndexBufferCache()
176 IndexBufferCache::DestroyCache(void)
180 __pBuffer->SetCache(IndexBufferCachePtr());
184 IBufferCache::DestroyCache();
190 IndexBufferCache::Die(void)
198 IndexBufferCache::Validate(Render*)
204 _dataType = GetGlDataType(__pBuffer->GetDataType());
205 __elementsCount = static_cast<GLsizei>(__pBuffer->GetSize() / GetGlDataTypeSize(__pBuffer->GetDataType()));
206 __primitiveType = GetGlPrimitiveType(__pBuffer->GetPrimitiveType());
207 void* pData = __pBuffer->GetData();
210 ThrowJmp("IndexBufferCache::validate: data buffer is null");
214 glGenBuffers(1, &_bufferId);
216 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _bufferId);
217 glBufferData(GL_ELEMENT_ARRAY_BUFFER, __pBuffer->GetSize(), pData, GetGlUsage(__pBuffer->GetUsage()));
223 IndexBufferCache::DrawElements(Render* pRender)
229 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _bufferId);
230 glDrawElements(__primitiveType, __elementsCount, _dataType, 0);
234 SolidVertexBufferCache::SolidVertexBufferCache(Render *pRender, EngineModel::VertexBuffer* pBuffer)
235 : VertexBufferCache(pRender)
236 , __componentsPerElement(static_cast<GLint>(0))
241 SolidVertexBufferCache::~SolidVertexBufferCache()
245 SolidVertexBufferCache::DestroyCache(void)
249 __pBuffer->SetCache(SolidVertexBufferCachePtr());
253 IBufferCache::DestroyCache();
259 SolidVertexBufferCache::Die(void)
267 SolidVertexBufferCache::Validate(Render*)
273 __componentsPerElement = static_cast<GLint>(__pBuffer->GetComponentsPerElement());
274 _dataType = GetGlDataType(__pBuffer->GetDataType());
275 void* pData = __pBuffer->GetData();
278 ThrowJmp("SolidVertexBufferCache::validate: data buffer is null");
282 glGenBuffers(1, &_bufferId);
284 glBindBuffer(GL_ARRAY_BUFFER, _bufferId);
285 glBufferData(GL_ARRAY_BUFFER, __pBuffer->GetSize(), pData, GetGlUsage(__pBuffer->GetUsage()));
291 SolidVertexBufferCache::BindToAttrib(Render* pRender, GLuint index)
297 glBindBuffer(GL_ARRAY_BUFFER, _bufferId);
298 glVertexAttribPointer(index, __componentsPerElement, _dataType, GL_FALSE, 0, 0);
303 SolidVertexBufferCache::BindAsVertices(Render* pRender)
305 ThrowJmp("SolidVertexBufferCache::bindAsVertices is anasseptable under GLES2");
310 SolidVertexBufferCache::BindAsColor(Render* pRender)
312 ThrowJmp("SolidVertexBufferCache::bindAsColor is anasseptable under GLES2");
317 SolidVertexBufferCache::BindAsTexCoord(Render* pRender, GLuint stage)
319 ThrowJmp("SolidVertexBufferCache::bindAsTexCoord is anasseptable under GLES2");
323 PartVertexBufferCache::PartVertexBufferCache(Render *pRender, EngineModel::PartVertexBuffer* pBuffer)
324 : VertexBufferCache(pRender)
325 , __componentsPerElement(static_cast<GLint>(0))
326 , __stride(static_cast<GLsizei>(0))
332 PartVertexBufferCache::~PartVertexBufferCache() {}
335 PartVertexBufferCache::DestroyCache(void)
339 __pBuffer->SetCache(PartVertexBufferCachePtr());
343 IBufferCache::DestroyCache();
349 PartVertexBufferCache::Die(void)
357 PartVertexBufferCache::Validate(Render*)
363 EngineModel::CompositeVertexBufferPtr composite = __pBuffer->GetCompositeBuffer();
366 ThrowJmp("PartVertexBufferCache::validate: no composite buffer in part buffer");
368 __pOffset = reinterpret_cast<GLvoid*>(__pBuffer->GetOffset());
369 __stride = static_cast<GLsizei>(__pBuffer->GetStride());
370 __componentsPerElement = static_cast<GLint>(__pBuffer->GetComponentsPerElement());
371 _dataType = GetGlDataType(composite->GetDataType());
377 PartVertexBufferCache::BindToAttrib(Render* pRender, GLuint index)
383 glVertexAttribPointer(index, __componentsPerElement, _dataType, GL_FALSE, __stride, __pOffset);
388 PartVertexBufferCache::BindAsVertices(Render* pRender)
390 ThrowJmp("PartVertexBufferCache::bindAsVertices is anasseptable under GLES2");
395 PartVertexBufferCache::BindAsColor(Render* pRender)
397 ThrowJmp("PartVertexBufferCache::bindAsColor is anasseptable under GLES2");
402 PartVertexBufferCache::BindAsTexCoord(Render* pRender, GLuint stage)
404 ThrowJmp("PartVertexBufferCache::bindAsColor is anasseptable under GLES2");
408 CompositeVertexBufferCache::CompositeVertexBufferCache(Render* pRender, EngineModel::CompositeVertexBuffer* pBuffer):
409 IBufferCache(pRender), __pBuffer(pBuffer)
413 CompositeVertexBufferCache::~CompositeVertexBufferCache(void)
418 CompositeVertexBufferCache::DestroyCache(void)
422 __pBuffer->SetCache(CompositeVertexBufferCachePtr());
426 IBufferCache::DestroyCache();
432 CompositeVertexBufferCache::Die(void)
440 CompositeVertexBufferCache::Validate(Render*)
446 _dataType = GetGlDataType(__pBuffer->GetDataType());
447 void* pData = __pBuffer->GetData();
450 ThrowJmp("CompositeVertexBufferCache::validate: data buffer is null");
454 glGenBuffers(1, &_bufferId);
456 glBindBuffer(GL_ARRAY_BUFFER, _bufferId);
457 glBufferData(GL_ARRAY_BUFFER, __pBuffer->GetSize(), pData, GetGlUsage(__pBuffer->GetUsage()));
463 CompositeVertexBufferCache::Bind(Render* pRender)
469 glBindBuffer(GL_ARRAY_BUFFER, _bufferId);
473 }}}}} // Tizen::Ui::Effects::_Renderer::GraphicsEngine