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