blob: 7108b7e2ca8d1d2f84c2ed6d2af8e1dff49e90df [file] [log] [blame]
#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