ed1e0b21c6547a801847fe596ff22c21017a3218
[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) 2016 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/public-api/actors/sampling.h>
20 #include <dali/public-api/common/vector-wrapper.h>
21 #include <dali/public-api/rendering/sampler.h>
22 #include <dali/internal/common/owner-pointer.h>
23 #include <dali/internal/render/renderers/render-sampler.h>
24 #include <dali/internal/render/gl-resources/gpu-buffer.h>
25
26 namespace Dali
27 {
28 namespace Internal
29 {
30 namespace Render
31 {
32
33 class PropertyBuffer
34 {
35 public:
36
37   struct Component
38   {
39     std::string     name;
40     unsigned int    offset;
41     unsigned int    size;
42     Property::Type  type;
43   };
44
45   /**
46    * Structure that holds the meta-data of the format of PropertyBuffer.
47    */
48   struct Format
49   {
50     std::vector<Component> components;
51     unsigned int           size;
52   };
53
54   /**
55    * @brief Default constructor
56    */
57   PropertyBuffer();
58
59   /**
60    * @brief Destructor
61    */
62   ~PropertyBuffer();
63
64   /**
65    * @brief Set the format of the buffer
66    *
67    * This function takes ownership of the pointer
68    *
69    * @param[in] format The format for the PropertyBuffer
70    */
71   void SetFormat( PropertyBuffer::Format* format );
72
73   /**
74    * @brief Set the data of the PropertyBuffer
75    *
76    * This function takes ownership of the pointer
77    * @param[in] data The new data of the PropertyBuffer
78    * @param[in] size The new size of the buffer
79    */
80   void SetData( Dali::Vector<char>* data, size_t size );
81
82   /**
83    * @brief Set the number of elements
84    * @param[in] size The number of elements
85    */
86   void SetSize( unsigned int size );
87
88   /**
89    * @brief Bind the property buffer
90    * @param[in] target The binding point
91    */
92   void BindBuffer(GpuBuffer::Target target);
93
94   /**
95    * Perform the upload of the buffer only when requiered
96    * @param[in] context The GL context
97    */
98   bool Update( Context& context );
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 } // namespace Internal
172
173 } // namespace Dali
174
175
176 #endif //  DALI_INTERNAL_RENDER_PROPERTY_BUFFER_H