296 lines
10 KiB
C++
296 lines
10 KiB
C++
#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
|
|
{
|
|
BPTYPE_LOCATION = 0, //!< Binding by numeric location.
|
|
BPTYPE_NAME, //!< Binding by input name.
|
|
|
|
BPTYPE_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(BPTYPE_LAST), location (0) {}
|
|
explicit BindingPoint (int location_) : type(BPTYPE_LOCATION), location(location_) {}
|
|
explicit BindingPoint (const std::string& name_, int location_ = 0) : type(BPTYPE_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
|