You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
6.4 KiB
181 lines
6.4 KiB
#ifndef _RRVERTEXATTRIB_HPP
|
|
#define _RRVERTEXATTRIB_HPP
|
|
/*-------------------------------------------------------------------------
|
|
* drawElements Quality Program Reference Renderer
|
|
* -----------------------------------------------
|
|
*
|
|
* 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 Vertex attribute fetch.
|
|
*//*--------------------------------------------------------------------*/
|
|
|
|
#include "rrDefs.hpp"
|
|
#include "rrGenericVector.hpp"
|
|
#include "tcuVector.hpp"
|
|
|
|
namespace rr
|
|
{
|
|
|
|
enum VertexAttribType
|
|
{
|
|
// Can only be read as floats
|
|
VERTEXATTRIBTYPE_FLOAT = 0,
|
|
VERTEXATTRIBTYPE_HALF,
|
|
VERTEXATTRIBTYPE_FIXED,
|
|
VERTEXATTRIBTYPE_DOUBLE,
|
|
|
|
// Can only be read as floats, will be normalized
|
|
VERTEXATTRIBTYPE_NONPURE_UNORM8,
|
|
VERTEXATTRIBTYPE_NONPURE_UNORM16,
|
|
VERTEXATTRIBTYPE_NONPURE_UNORM32,
|
|
VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV, //!< Packed format, only size = 4 is allowed
|
|
|
|
// Clamped formats, GLES3-style conversion: max{c / (2^(b-1) - 1), -1 }
|
|
VERTEXATTRIBTYPE_NONPURE_SNORM8_CLAMP,
|
|
VERTEXATTRIBTYPE_NONPURE_SNORM16_CLAMP,
|
|
VERTEXATTRIBTYPE_NONPURE_SNORM32_CLAMP,
|
|
VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP, //!< Packed format, only size = 4 is allowed
|
|
|
|
// Scaled formats, GLES2-style conversion: (2c + 1) / (2^b - 1)
|
|
VERTEXATTRIBTYPE_NONPURE_SNORM8_SCALE,
|
|
VERTEXATTRIBTYPE_NONPURE_SNORM16_SCALE,
|
|
VERTEXATTRIBTYPE_NONPURE_SNORM32_SCALE,
|
|
VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE, //!< Packed format, only size = 4 is allowed
|
|
|
|
// can only be read as float, will not be normalized
|
|
VERTEXATTRIBTYPE_NONPURE_UINT8,
|
|
VERTEXATTRIBTYPE_NONPURE_UINT16,
|
|
VERTEXATTRIBTYPE_NONPURE_UINT32,
|
|
|
|
VERTEXATTRIBTYPE_NONPURE_INT8,
|
|
VERTEXATTRIBTYPE_NONPURE_INT16,
|
|
VERTEXATTRIBTYPE_NONPURE_INT32,
|
|
|
|
VERTEXATTRIBTYPE_NONPURE_UINT_2_10_10_10_REV, //!< Packed format, only size = 4 is allowed
|
|
VERTEXATTRIBTYPE_NONPURE_INT_2_10_10_10_REV, //!< Packed format, only size = 4 is allowed
|
|
|
|
// can only be read as integers
|
|
VERTEXATTRIBTYPE_PURE_UINT8,
|
|
VERTEXATTRIBTYPE_PURE_UINT16,
|
|
VERTEXATTRIBTYPE_PURE_UINT32,
|
|
|
|
VERTEXATTRIBTYPE_PURE_INT8,
|
|
VERTEXATTRIBTYPE_PURE_INT16,
|
|
VERTEXATTRIBTYPE_PURE_INT32,
|
|
|
|
// reordered formats of GL_ARB_vertex_array_bgra
|
|
VERTEXATTRIBTYPE_NONPURE_UNORM8_BGRA,
|
|
VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV_BGRA,
|
|
VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA,
|
|
VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA,
|
|
|
|
// can be read as anything
|
|
VERTEXATTRIBTYPE_DONT_CARE, //!< Do not enforce type checking when reading GENERIC attribute. Used for current client side attributes.
|
|
|
|
VERTEXATTRIBTYPE_LAST
|
|
};
|
|
|
|
/*--------------------------------------------------------------------*//*!
|
|
* \brief Vertex attribute slot
|
|
*
|
|
* Vertex attribute type specifies component type for attribute and it
|
|
* includes signed & normalized bits as well.
|
|
*
|
|
* Attribute size specifies how many components there are per vertex.
|
|
* If size is 0, no components are fetched, ie. vertex attribute slot
|
|
* is disabled.
|
|
*
|
|
* Divisor specifies the rate at which vertex attribute advances. If it is
|
|
* zero, attribute is advanced per vertex. If divisor is non-zero, attribute
|
|
* advances once per instanceDivisor instances.
|
|
*
|
|
* Pointer is used if not null, otherwise generic attribute is used instead
|
|
* and in such case only DONT_CARE is valid attribute type.
|
|
*//*--------------------------------------------------------------------*/
|
|
struct VertexAttrib
|
|
{
|
|
VertexAttribType type; //!< Attribute component type.
|
|
int size; //!< Number of components, valid range is [0,4].
|
|
int stride; //!< Number of bytes two consecutive elements differ by. Zero works as in GL. Valid range is [0, inf).
|
|
int instanceDivisor; //!< Vertex attribute divisor.
|
|
const void* pointer; //!< Data pointer.
|
|
GenericVec4 generic; //!< Generic attribute, used if pointer is null.
|
|
|
|
VertexAttrib (void)
|
|
: type (VERTEXATTRIBTYPE_FLOAT)
|
|
, size (0)
|
|
, stride (0)
|
|
, instanceDivisor (0)
|
|
, pointer (DE_NULL)
|
|
{
|
|
}
|
|
|
|
VertexAttrib (VertexAttribType type_, int size_, int stride_, int instanceDivisor_, const void* pointer_)
|
|
: type (type_)
|
|
, size (size_)
|
|
, stride (stride_)
|
|
, instanceDivisor (instanceDivisor_)
|
|
, pointer (pointer_)
|
|
{
|
|
}
|
|
|
|
template<typename ScalarType>
|
|
explicit VertexAttrib (const tcu::Vector<ScalarType, 4>& generic_)
|
|
: type (VERTEXATTRIBTYPE_DONT_CARE)
|
|
, size (0)
|
|
, stride (0)
|
|
, instanceDivisor (0)
|
|
, pointer (DE_NULL)
|
|
, generic (generic_)
|
|
{
|
|
}
|
|
} DE_WARN_UNUSED_TYPE;
|
|
|
|
bool isValidVertexAttrib (const VertexAttrib& vertexAttrib);
|
|
// \todo [2013-04-01 pyry] Queries: isReadFloatValid(), isReadIntValid() ...
|
|
|
|
void readVertexAttrib (tcu::Vec4& dst, const VertexAttrib& vertexAttrib, const int instanceNdx, const int vertexNdx, const int baseInstanceNdx = 0);
|
|
void readVertexAttrib (tcu::IVec4& dst, const VertexAttrib& vertexAttrib, const int instanceNdx, const int vertexNdx, const int baseInstanceNdx = 0);
|
|
void readVertexAttrib (tcu::UVec4& dst, const VertexAttrib& vertexAttrib, const int instanceNdx, const int vertexNdx, const int baseInstanceNdx = 0);
|
|
|
|
// Helpers that return by value (trivial for compiler to optimize).
|
|
|
|
inline tcu::Vec4 readVertexAttribFloat (const VertexAttrib& vertexAttrib, const int instanceNdx, const int vertexNdx, const int baseInstanceNdx = 0)
|
|
{
|
|
tcu::Vec4 v;
|
|
readVertexAttrib(v, vertexAttrib, instanceNdx, vertexNdx, baseInstanceNdx);
|
|
return v;
|
|
}
|
|
|
|
inline tcu::IVec4 readVertexAttribInt (const VertexAttrib& vertexAttrib, const int instanceNdx, const int vertexNdx, const int baseInstanceNdx = 0)
|
|
{
|
|
tcu::IVec4 v;
|
|
readVertexAttrib(v, vertexAttrib, instanceNdx, vertexNdx, baseInstanceNdx);
|
|
return v;
|
|
}
|
|
|
|
inline tcu::UVec4 readVertexAttribUint (const VertexAttrib& vertexAttrib, const int instanceNdx, const int vertexNdx, const int baseInstanceNdx = 0)
|
|
{
|
|
tcu::UVec4 v;
|
|
readVertexAttrib(v, vertexAttrib, instanceNdx, vertexNdx, baseInstanceNdx);
|
|
return v;
|
|
}
|
|
|
|
} // rr
|
|
|
|
#endif // _RRVERTEXATTRIB_HPP
|