Merge branch 'devel/master' (1.1.28) into tizen
[platform/core/uifw/dali-core.git] / dali / internal / render / renderers / render-property-buffer.h
1 #ifndef DALI_INTERNAL_RENDER_PROPERTY_BUFFER_H
2 #define DALI_INTERNAL_RENDER_PROPERTY_BUFFER_H
3
4 /*
5  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 #include <dali/internal/common/owner-pointer.h>
20 #include <dali/public-api/actors/sampling.h>
21 #include <dali/devel-api/rendering/sampler.h>
22 #include <dali/internal/render/renderers/render-sampler.h>
23 #include <dali/internal/render/gl-resources/gpu-buffer.h>
24
25 namespace Dali
26 {
27 namespace Internal
28 {
29 namespace Render
30 {
31
32 class PropertyBuffer
33 {
34 public:
35
36   struct Component
37   {
38     std::string     name;
39     unsigned int    offset;
40     unsigned int    size;
41     Property::Type  type;
42   };
43
44   /**
45    * Structure that holds the meta-data of the format of PropertyBuffer.
46    */
47   struct Format
48   {
49     std::vector<Component> components;
50     unsigned int           size;
51   };
52
53   /**
54    * @brief Default constructor
55    */
56   PropertyBuffer();
57
58   /**
59    * @brief Destructor
60    */
61   ~PropertyBuffer();
62
63   /**
64    * @brief Set the format of the buffer
65    *
66    * This function takes ownership of the pointer
67    *
68    * @param[in] format The format for the PropertyBuffer
69    */
70   void SetFormat( PropertyBuffer::Format* format );
71
72   /**
73    * @brief Set the data of the PropertyBuffer
74    *
75    * This function takes ownership of the pointer
76    * @param[in] data The new data of the PropertyBuffer
77    * @param[in] size The new size of the buffer
78    */
79   void SetData( Dali::Vector<char>* data, size_t size );
80
81   /**
82    * @brief Set the number of elements
83    * @param[in] size The number of elements
84    */
85   void SetSize( unsigned int size );
86
87   /**
88    * @brief Bind the property buffer
89    * @param[in] target The binding point
90    */
91   void BindBuffer(GpuBuffer::Target target);
92
93   /**
94    * Perform the upload of the buffer only when requiered
95    * @param[in] context The GL context
96    * @param[in] isIndexBuffer True if the buffer is used as an index buffer
97    */
98   bool Update( Context& context, bool isIndexBuffer );
99
100   /**
101    * Enable the vertex attributes for each vertex buffer from the corresponding
102    * shader program.
103    * @param[in] context The GL context
104    * @param[in] vAttributeLocation Vector containing attributes location for current program
105    * @param[in] locationBase Index in vAttributeLocation corresponding to the first attribute defined by this buffer
106    */
107   unsigned int EnableVertexAttributes( Context& context, Vector<GLint>& vAttributeLocation, unsigned int locationBase );
108
109   /**
110    * Get the number of attributes present in the buffer
111    * @return The number of attributes stored in this buffer
112    */
113   inline unsigned int GetAttributeCount() const
114   {
115     DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
116     return mFormat->components.size();
117   }
118
119   /**
120    * Retrieve the i-essim attribute name
121    * @param[in] index The index of the attribute
122    * @return The name of the attribute
123    */
124   inline const std::string& GetAttributeName(unsigned int index ) const
125   {
126     DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
127     return mFormat->components[index].name;
128   }
129
130   /**
131    * Retrieve the size of the buffer in bytes
132    * @return The total size of the buffer
133    */
134   inline std::size_t GetDataSize() const
135   {
136     DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
137     return mFormat->size * mSize;
138   }
139
140   /**
141    * Retrieve the size of one element of the buffer
142    * @return The size of one element
143    */
144   inline std::size_t GetElementSize() const
145   {
146     DALI_ASSERT_DEBUG( mFormat && "Format should be set ");
147     return mFormat->size;
148   }
149
150   /**
151    * Retrieve the number of elements in the buffer
152    * @return The total number of elements
153    */
154   inline unsigned int GetElementCount() const
155   {
156     return mSize;
157   }
158
159 private:
160   OwnerPointer< PropertyBuffer::Format >  mFormat;  ///< Format of the buffer
161   OwnerPointer< Dali::Vector< char > >    mData;    ///< Data
162   OwnerPointer<GpuBuffer> mGpuBuffer;               ///< Pointer to the GpuBuffer associated with this RenderPropertyBuffer
163
164   size_t  mSize;      ///< Number of Elements in the buffer
165   bool mDataChanged;  ///< Flag to know if data has changed in a frame
166
167 };
168
169 } // namespace Render
170
171
172
173 } // namespace Internal
174 } // namespace Dali
175
176
177 #endif //  DALI_INTERNAL_RENDER_PROPERTY_BUFFER_H