1 #ifndef _GLUDRAWUTIL_HPP 2 #define _GLUDRAWUTIL_HPP 3 /*------------------------------------------------------------------------- 4 * drawElements Quality Program OpenGL Utilities 5 * --------------------------------------------- 6 * 7 * Copyright 2014 The Android Open Source Project 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief Draw call utilities. 24 * 25 * Draw call utilities provide an abstraction for commonly used draw calls. 26 * The objective of that abstraction is to allow moving data to buffers 27 * and state to VAOs automatically if target context doesn't support 28 * user pointers or default VAOs. 29 *//*--------------------------------------------------------------------*/ 30 31 #include "gluDefs.hpp" 32 33 #include <string> 34 35 namespace glu 36 { 37 38 class RenderContext; 39 40 enum VertexComponentType 41 { 42 // Standard types: all conversion types apply. 43 VTX_COMP_UNSIGNED_INT8 = 0, 44 VTX_COMP_UNSIGNED_INT16, 45 VTX_COMP_UNSIGNED_INT32, 46 VTX_COMP_SIGNED_INT8, 47 VTX_COMP_SIGNED_INT16, 48 VTX_COMP_SIGNED_INT32, 49 50 // Special types: only CONVERT_NONE is allowed. 51 VTX_COMP_FIXED, 52 VTX_COMP_HALF_FLOAT, 53 VTX_COMP_FLOAT, 54 55 VTX_COMP_TYPE_LAST 56 }; 57 58 enum VertexComponentConversion 59 { 60 VTX_COMP_CONVERT_NONE = 0, //!< No conversion: integer types, or floating-point values. 61 VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT, //!< Normalize integers to range [0,1] or [-1,1] depending on type. 62 VTX_COMP_CONVERT_CAST_TO_FLOAT, //!< Convert to floating-point directly. 63 64 VTX_COMP_CONVERT_LAST 65 }; 66 67 enum IndexType 68 { 69 INDEXTYPE_UINT8, 70 INDEXTYPE_UINT16, 71 INDEXTYPE_UINT32, 72 73 INDEXTYPE_LAST 74 }; 75 76 enum PrimitiveType 77 { 78 PRIMITIVETYPE_TRIANGLES = 0, 79 PRIMITIVETYPE_TRIANGLE_STRIP, 80 PRIMITIVETYPE_TRIANGLE_FAN, 81 82 PRIMITIVETYPE_LINES, 83 PRIMITIVETYPE_LINE_STRIP, 84 PRIMITIVETYPE_LINE_LOOP, 85 86 PRIMITIVETYPE_POINTS, 87 88 PRIMITIVETYPE_PATCHES, 89 90 PRIMITIVETYPE_LAST 91 }; 92 93 struct BindingPoint 94 { 95 enum Type 96 { 97 TYPE_LOCATION = 0, //!< Binding by numeric location. 98 TYPE_NAME, //!< Binding by input name. 99 100 TYPE_LAST 101 }; 102 103 Type type; //!< Binding type (name or location). 104 std::string name; //!< Input name, or empty if is not binding by name. 105 int location; //!< Input location, or offset to named location if binding by name. 106 107 BindingPoint (void) : type(TYPE_LAST), location (0) {} 108 explicit BindingPoint (int location_) : type(TYPE_LOCATION), location(location_) {} 109 explicit BindingPoint (const std::string& name_, int location_ = 0) : type(TYPE_NAME), name(name_), location(location_) {} 110 }; 111 112 struct VertexArrayPointer 113 { 114 VertexComponentType componentType; //!< Component type. 115 VertexComponentConversion convert; //!< Component conversion type. 116 int numComponents; //!< Number of components per element. 117 int numElements; //!< Number of elements in total. 118 int stride; //!< Element stride. 119 120 const void* data; //!< Data pointer. 121 122 VertexArrayPointer (VertexComponentType componentType_, VertexComponentConversion convert_, int numComponents_, int numElements_, int stride_, const void* data_) 123 : componentType (componentType_) 124 , convert (convert_) 125 , numComponents (numComponents_) 126 , numElements (numElements_) 127 , stride (stride_) 128 , data (data_) 129 { 130 } 131 132 VertexArrayPointer (void) 133 : componentType (VTX_COMP_TYPE_LAST) 134 , convert (VTX_COMP_CONVERT_LAST) 135 , numComponents (0) 136 , numElements (0) 137 , stride (0) 138 , data (0) 139 { 140 } 141 } DE_WARN_UNUSED_TYPE; 142 143 struct VertexArrayBinding 144 { 145 BindingPoint binding; 146 VertexArrayPointer pointer; 147 148 VertexArrayBinding (const BindingPoint& binding_, const VertexArrayPointer& pointer_) 149 : binding (binding_) 150 , pointer (pointer_) 151 { 152 } 153 154 VertexArrayBinding (void) 155 { 156 } 157 } DE_WARN_UNUSED_TYPE; 158 159 struct PrimitiveList 160 { 161 PrimitiveType type; //!< Primitive type. 162 int numElements; //!< Number of elements to be drawn. 163 IndexType indexType; //!< Index type or INDEXTYPE_LAST if not used 164 const void* indices; //!< Index list or DE_NULL if not used. 165 166 PrimitiveList (PrimitiveType type_, int numElements_) 167 : type (type_) 168 , numElements (numElements_) 169 , indexType (INDEXTYPE_LAST) 170 , indices (0) 171 { 172 } 173 174 PrimitiveList (PrimitiveType type_, int numElements_, IndexType indexType_, const void* indices_) 175 : type (type_) 176 , numElements (numElements_) 177 , indexType (indexType_) 178 , indices (indices_) 179 { 180 } 181 182 PrimitiveList (void) 183 : type (PRIMITIVETYPE_LAST) 184 , numElements (0) 185 , indexType (INDEXTYPE_LAST) 186 , indices (0) 187 { 188 } 189 } DE_WARN_UNUSED_TYPE; 190 191 class DrawUtilCallback 192 { 193 public: 194 virtual void beforeDrawCall (void) { } 195 virtual void afterDrawCall (void) { } 196 }; 197 198 void draw (const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL); 199 200 void drawFromUserPointers (const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL); 201 void drawFromBuffers (const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL); 202 void drawFromVAOBuffers (const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL); 203 204 // Shorthands for PrimitiveList 205 namespace pr 206 { 207 208 #define DECLARE_PR_CTOR(NAME, TYPE) \ 209 inline PrimitiveList NAME (int numElements) \ 210 { \ 211 return PrimitiveList(TYPE, numElements); \ 212 } \ 213 inline PrimitiveList NAME (int numElements, const deUint8* indices) \ 214 { \ 215 return PrimitiveList(TYPE, numElements, INDEXTYPE_UINT8, indices); \ 216 } \ 217 inline PrimitiveList NAME (int numElements, const deUint16* indices) \ 218 { \ 219 return PrimitiveList(TYPE, numElements, INDEXTYPE_UINT16, indices); \ 220 } \ 221 inline PrimitiveList NAME (int numElements, const deUint32* indices) \ 222 { \ 223 return PrimitiveList(TYPE, numElements, INDEXTYPE_UINT32, indices); \ 224 } \ 225 struct DeclarePRCtor##NAME##Unused_s { int unused; } 226 227 DECLARE_PR_CTOR(Triangles, PRIMITIVETYPE_TRIANGLES); 228 DECLARE_PR_CTOR(TriangleStrip, PRIMITIVETYPE_TRIANGLE_STRIP); 229 DECLARE_PR_CTOR(TriangleFan, PRIMITIVETYPE_TRIANGLE_FAN); 230 231 DECLARE_PR_CTOR(Lines, PRIMITIVETYPE_LINES); 232 DECLARE_PR_CTOR(LineStrip, PRIMITIVETYPE_LINE_STRIP); 233 DECLARE_PR_CTOR(LineLineLoop, PRIMITIVETYPE_LINE_LOOP); 234 235 DECLARE_PR_CTOR(Points, PRIMITIVETYPE_POINTS); 236 237 DECLARE_PR_CTOR(Patches, PRIMITIVETYPE_PATCHES); 238 239 } // pr 240 241 // Shorthands for VertexArrayBinding 242 namespace va 243 { 244 245 #define DECLARE_VA_CTOR(NAME, DATATYPE, TYPE, CONVERT) \ 246 inline VertexArrayBinding NAME (const std::string& name, int offset, int numComponents, int numElements, int stride, const DATATYPE* data) \ 247 { \ 248 return VertexArrayBinding(BindingPoint(name, offset), VertexArrayPointer(TYPE, CONVERT, numComponents, numElements, stride, data)); \ 249 } \ 250 inline VertexArrayBinding NAME (const std::string& name, int numComponents, int numElements, int stride, const DATATYPE* data) \ 251 { \ 252 return NAME(name, 0, numComponents, numElements, stride, data); \ 253 } \ 254 inline VertexArrayBinding NAME (int location, int numComponents, int numElements, int stride, const DATATYPE* data) \ 255 { \ 256 return VertexArrayBinding(BindingPoint(location), VertexArrayPointer(TYPE, CONVERT, numComponents, numElements, stride, data)); \ 257 } \ 258 struct DeclareVACtor##NAME##Unused_s { int unused; } 259 260 // Integer types 261 DECLARE_VA_CTOR(Uint8, deUint8, VTX_COMP_UNSIGNED_INT8, VTX_COMP_CONVERT_NONE); 262 DECLARE_VA_CTOR(Uint16, deUint16, VTX_COMP_UNSIGNED_INT16, VTX_COMP_CONVERT_NONE); 263 DECLARE_VA_CTOR(Uint32, deUint32, VTX_COMP_UNSIGNED_INT32, VTX_COMP_CONVERT_NONE); 264 DECLARE_VA_CTOR(Int8, deInt8, VTX_COMP_SIGNED_INT8, VTX_COMP_CONVERT_NONE); 265 DECLARE_VA_CTOR(Int16, deInt16, VTX_COMP_SIGNED_INT16, VTX_COMP_CONVERT_NONE); 266 DECLARE_VA_CTOR(Int32, deInt32, VTX_COMP_SIGNED_INT32, VTX_COMP_CONVERT_NONE); 267 268 // Normalized integers. 269 DECLARE_VA_CTOR(Unorm8, deUint8, VTX_COMP_UNSIGNED_INT8, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); 270 DECLARE_VA_CTOR(Unorm16, deUint16, VTX_COMP_UNSIGNED_INT16, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); 271 DECLARE_VA_CTOR(Unorm32, deUint32, VTX_COMP_UNSIGNED_INT32, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); 272 DECLARE_VA_CTOR(Snorm8, deInt8, VTX_COMP_SIGNED_INT8, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); 273 DECLARE_VA_CTOR(Snorm16, deInt16, VTX_COMP_SIGNED_INT16, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); 274 DECLARE_VA_CTOR(Snorm32, deInt32, VTX_COMP_SIGNED_INT32, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); 275 276 // Integers converted to float. 277 DECLARE_VA_CTOR(Uint8Float, deUint8, VTX_COMP_UNSIGNED_INT8, VTX_COMP_CONVERT_CAST_TO_FLOAT); 278 DECLARE_VA_CTOR(Uint16Float, deUint16, VTX_COMP_UNSIGNED_INT16, VTX_COMP_CONVERT_CAST_TO_FLOAT); 279 DECLARE_VA_CTOR(Uint32Float, deUint32, VTX_COMP_UNSIGNED_INT32, VTX_COMP_CONVERT_CAST_TO_FLOAT); 280 DECLARE_VA_CTOR(Int8Float, deInt8, VTX_COMP_SIGNED_INT8, VTX_COMP_CONVERT_CAST_TO_FLOAT); 281 DECLARE_VA_CTOR(Int16Float, deInt16, VTX_COMP_SIGNED_INT16, VTX_COMP_CONVERT_CAST_TO_FLOAT); 282 DECLARE_VA_CTOR(Int32Float, deInt32, VTX_COMP_SIGNED_INT32, VTX_COMP_CONVERT_CAST_TO_FLOAT); 283 284 // Special types. 285 DECLARE_VA_CTOR(Fixed, void, VTX_COMP_FIXED, VTX_COMP_CONVERT_NONE); 286 DECLARE_VA_CTOR(Half, void, VTX_COMP_HALF_FLOAT, VTX_COMP_CONVERT_NONE); 287 DECLARE_VA_CTOR(Float, float, VTX_COMP_FLOAT, VTX_COMP_CONVERT_NONE); 288 289 #undef DECLARE_VA_CTOR 290 291 } // va 292 293 } // glu 294 295 #endif // _GLUDRAWUTIL_HPP 296