| #ifndef _GLUDRAWUTIL_HPP |
| #define _GLUDRAWUTIL_HPP |
| /*------------------------------------------------------------------------- |
| * drawElements Quality Program OpenGL Utilities |
| * --------------------------------------------- |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| *//*! |
| * \file |
| * \brief Draw call utilities. |
| * |
| * Draw call utilities provide an abstraction for commonly used draw calls. |
| * The objective of that abstraction is to allow moving data to buffers |
| * and state to VAOs automatically if target context doesn't support |
| * user pointers or default VAOs. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "gluDefs.hpp" |
| |
| #include <string> |
| |
| namespace glu |
| { |
| |
| class RenderContext; |
| |
| enum VertexComponentType |
| { |
| // Standard types: all conversion types apply. |
| VTX_COMP_UNSIGNED_INT8 = 0, |
| VTX_COMP_UNSIGNED_INT16, |
| VTX_COMP_UNSIGNED_INT32, |
| VTX_COMP_SIGNED_INT8, |
| VTX_COMP_SIGNED_INT16, |
| VTX_COMP_SIGNED_INT32, |
| |
| // Special types: only CONVERT_NONE is allowed. |
| VTX_COMP_FIXED, |
| VTX_COMP_HALF_FLOAT, |
| VTX_COMP_FLOAT, |
| |
| VTX_COMP_TYPE_LAST |
| }; |
| |
| enum VertexComponentConversion |
| { |
| VTX_COMP_CONVERT_NONE = 0, //!< No conversion: integer types, or floating-point values. |
| VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT, //!< Normalize integers to range [0,1] or [-1,1] depending on type. |
| VTX_COMP_CONVERT_CAST_TO_FLOAT, //!< Convert to floating-point directly. |
| |
| VTX_COMP_CONVERT_LAST |
| }; |
| |
| enum IndexType |
| { |
| INDEXTYPE_UINT8, |
| INDEXTYPE_UINT16, |
| INDEXTYPE_UINT32, |
| |
| INDEXTYPE_LAST |
| }; |
| |
| enum PrimitiveType |
| { |
| PRIMITIVETYPE_TRIANGLES = 0, |
| PRIMITIVETYPE_TRIANGLE_STRIP, |
| PRIMITIVETYPE_TRIANGLE_FAN, |
| |
| PRIMITIVETYPE_LINES, |
| PRIMITIVETYPE_LINE_STRIP, |
| PRIMITIVETYPE_LINE_LOOP, |
| |
| PRIMITIVETYPE_POINTS, |
| |
| PRIMITIVETYPE_PATCHES, |
| |
| PRIMITIVETYPE_LAST |
| }; |
| |
| struct BindingPoint |
| { |
| enum Type |
| { |
| TYPE_LOCATION = 0, //!< Binding by numeric location. |
| TYPE_NAME, //!< Binding by input name. |
| |
| TYPE_LAST |
| }; |
| |
| Type type; //!< Binding type (name or location). |
| std::string name; //!< Input name, or empty if is not binding by name. |
| int location; //!< Input location, or offset to named location if binding by name. |
| |
| BindingPoint (void) : type(TYPE_LAST), location (0) {} |
| explicit BindingPoint (int location_) : type(TYPE_LOCATION), location(location_) {} |
| explicit BindingPoint (const std::string& name_, int location_ = 0) : type(TYPE_NAME), name(name_), location(location_) {} |
| }; |
| |
| struct VertexArrayPointer |
| { |
| VertexComponentType componentType; //!< Component type. |
| VertexComponentConversion convert; //!< Component conversion type. |
| int numComponents; //!< Number of components per element. |
| int numElements; //!< Number of elements in total. |
| int stride; //!< Element stride. |
| |
| const void* data; //!< Data pointer. |
| |
| VertexArrayPointer (VertexComponentType componentType_, VertexComponentConversion convert_, int numComponents_, int numElements_, int stride_, const void* data_) |
| : componentType (componentType_) |
| , convert (convert_) |
| , numComponents (numComponents_) |
| , numElements (numElements_) |
| , stride (stride_) |
| , data (data_) |
| { |
| } |
| |
| VertexArrayPointer (void) |
| : componentType (VTX_COMP_TYPE_LAST) |
| , convert (VTX_COMP_CONVERT_LAST) |
| , numComponents (0) |
| , numElements (0) |
| , stride (0) |
| , data (0) |
| { |
| } |
| } DE_WARN_UNUSED_TYPE; |
| |
| struct VertexArrayBinding |
| { |
| BindingPoint binding; |
| VertexArrayPointer pointer; |
| |
| VertexArrayBinding (const BindingPoint& binding_, const VertexArrayPointer& pointer_) |
| : binding (binding_) |
| , pointer (pointer_) |
| { |
| } |
| |
| VertexArrayBinding (void) |
| { |
| } |
| } DE_WARN_UNUSED_TYPE; |
| |
| struct PrimitiveList |
| { |
| PrimitiveType type; //!< Primitive type. |
| int numElements; //!< Number of elements to be drawn. |
| IndexType indexType; //!< Index type or INDEXTYPE_LAST if not used |
| const void* indices; //!< Index list or DE_NULL if not used. |
| |
| PrimitiveList (PrimitiveType type_, int numElements_) |
| : type (type_) |
| , numElements (numElements_) |
| , indexType (INDEXTYPE_LAST) |
| , indices (0) |
| { |
| } |
| |
| PrimitiveList (PrimitiveType type_, int numElements_, IndexType indexType_, const void* indices_) |
| : type (type_) |
| , numElements (numElements_) |
| , indexType (indexType_) |
| , indices (indices_) |
| { |
| } |
| |
| PrimitiveList (void) |
| : type (PRIMITIVETYPE_LAST) |
| , numElements (0) |
| , indexType (INDEXTYPE_LAST) |
| , indices (0) |
| { |
| } |
| } DE_WARN_UNUSED_TYPE; |
| |
| class DrawUtilCallback |
| { |
| public: |
| virtual void beforeDrawCall (void) { } |
| virtual void afterDrawCall (void) { } |
| }; |
| |
| void draw (const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL); |
| |
| void drawFromUserPointers (const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL); |
| void drawFromBuffers (const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL); |
| void drawFromVAOBuffers (const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL); |
| |
| // Shorthands for PrimitiveList |
| namespace pr |
| { |
| |
| #define DECLARE_PR_CTOR(NAME, TYPE) \ |
| inline PrimitiveList NAME (int numElements) \ |
| { \ |
| return PrimitiveList(TYPE, numElements); \ |
| } \ |
| inline PrimitiveList NAME (int numElements, const deUint8* indices) \ |
| { \ |
| return PrimitiveList(TYPE, numElements, INDEXTYPE_UINT8, indices); \ |
| } \ |
| inline PrimitiveList NAME (int numElements, const deUint16* indices) \ |
| { \ |
| return PrimitiveList(TYPE, numElements, INDEXTYPE_UINT16, indices); \ |
| } \ |
| inline PrimitiveList NAME (int numElements, const deUint32* indices) \ |
| { \ |
| return PrimitiveList(TYPE, numElements, INDEXTYPE_UINT32, indices); \ |
| } \ |
| struct DeclarePRCtor##NAME##Unused_s { int unused; } |
| |
| DECLARE_PR_CTOR(Triangles, PRIMITIVETYPE_TRIANGLES); |
| DECLARE_PR_CTOR(TriangleStrip, PRIMITIVETYPE_TRIANGLE_STRIP); |
| DECLARE_PR_CTOR(TriangleFan, PRIMITIVETYPE_TRIANGLE_FAN); |
| |
| DECLARE_PR_CTOR(Lines, PRIMITIVETYPE_LINES); |
| DECLARE_PR_CTOR(LineStrip, PRIMITIVETYPE_LINE_STRIP); |
| DECLARE_PR_CTOR(LineLineLoop, PRIMITIVETYPE_LINE_LOOP); |
| |
| DECLARE_PR_CTOR(Points, PRIMITIVETYPE_POINTS); |
| |
| DECLARE_PR_CTOR(Patches, PRIMITIVETYPE_PATCHES); |
| |
| } // pr |
| |
| // Shorthands for VertexArrayBinding |
| namespace va |
| { |
| |
| #define DECLARE_VA_CTOR(NAME, DATATYPE, TYPE, CONVERT) \ |
| inline VertexArrayBinding NAME (const std::string& name, int offset, int numComponents, int numElements, int stride, const DATATYPE* data) \ |
| { \ |
| return VertexArrayBinding(BindingPoint(name, offset), VertexArrayPointer(TYPE, CONVERT, numComponents, numElements, stride, data)); \ |
| } \ |
| inline VertexArrayBinding NAME (const std::string& name, int numComponents, int numElements, int stride, const DATATYPE* data) \ |
| { \ |
| return NAME(name, 0, numComponents, numElements, stride, data); \ |
| } \ |
| inline VertexArrayBinding NAME (int location, int numComponents, int numElements, int stride, const DATATYPE* data) \ |
| { \ |
| return VertexArrayBinding(BindingPoint(location), VertexArrayPointer(TYPE, CONVERT, numComponents, numElements, stride, data)); \ |
| } \ |
| struct DeclareVACtor##NAME##Unused_s { int unused; } |
| |
| // Integer types |
| DECLARE_VA_CTOR(Uint8, deUint8, VTX_COMP_UNSIGNED_INT8, VTX_COMP_CONVERT_NONE); |
| DECLARE_VA_CTOR(Uint16, deUint16, VTX_COMP_UNSIGNED_INT16, VTX_COMP_CONVERT_NONE); |
| DECLARE_VA_CTOR(Uint32, deUint32, VTX_COMP_UNSIGNED_INT32, VTX_COMP_CONVERT_NONE); |
| DECLARE_VA_CTOR(Int8, deInt8, VTX_COMP_SIGNED_INT8, VTX_COMP_CONVERT_NONE); |
| DECLARE_VA_CTOR(Int16, deInt16, VTX_COMP_SIGNED_INT16, VTX_COMP_CONVERT_NONE); |
| DECLARE_VA_CTOR(Int32, deInt32, VTX_COMP_SIGNED_INT32, VTX_COMP_CONVERT_NONE); |
| |
| // Normalized integers. |
| DECLARE_VA_CTOR(Unorm8, deUint8, VTX_COMP_UNSIGNED_INT8, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); |
| DECLARE_VA_CTOR(Unorm16, deUint16, VTX_COMP_UNSIGNED_INT16, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); |
| DECLARE_VA_CTOR(Unorm32, deUint32, VTX_COMP_UNSIGNED_INT32, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); |
| DECLARE_VA_CTOR(Snorm8, deInt8, VTX_COMP_SIGNED_INT8, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); |
| DECLARE_VA_CTOR(Snorm16, deInt16, VTX_COMP_SIGNED_INT16, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); |
| DECLARE_VA_CTOR(Snorm32, deInt32, VTX_COMP_SIGNED_INT32, VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT); |
| |
| // Integers converted to float. |
| DECLARE_VA_CTOR(Uint8Float, deUint8, VTX_COMP_UNSIGNED_INT8, VTX_COMP_CONVERT_CAST_TO_FLOAT); |
| DECLARE_VA_CTOR(Uint16Float, deUint16, VTX_COMP_UNSIGNED_INT16, VTX_COMP_CONVERT_CAST_TO_FLOAT); |
| DECLARE_VA_CTOR(Uint32Float, deUint32, VTX_COMP_UNSIGNED_INT32, VTX_COMP_CONVERT_CAST_TO_FLOAT); |
| DECLARE_VA_CTOR(Int8Float, deInt8, VTX_COMP_SIGNED_INT8, VTX_COMP_CONVERT_CAST_TO_FLOAT); |
| DECLARE_VA_CTOR(Int16Float, deInt16, VTX_COMP_SIGNED_INT16, VTX_COMP_CONVERT_CAST_TO_FLOAT); |
| DECLARE_VA_CTOR(Int32Float, deInt32, VTX_COMP_SIGNED_INT32, VTX_COMP_CONVERT_CAST_TO_FLOAT); |
| |
| // Special types. |
| DECLARE_VA_CTOR(Fixed, void, VTX_COMP_FIXED, VTX_COMP_CONVERT_NONE); |
| DECLARE_VA_CTOR(Half, void, VTX_COMP_HALF_FLOAT, VTX_COMP_CONVERT_NONE); |
| DECLARE_VA_CTOR(Float, float, VTX_COMP_FLOAT, VTX_COMP_CONVERT_NONE); |
| |
| #undef DECLARE_VA_CTOR |
| |
| } // va |
| |
| } // glu |
| |
| #endif // _GLUDRAWUTIL_HPP |