Home | History | Annotate | Download | only in referencerenderer
      1 #ifndef _RRGENERICVECTOR_HPP
      2 #define _RRGENERICVECTOR_HPP
      3 /*-------------------------------------------------------------------------
      4  * drawElements Quality Program Reference Renderer
      5  * -----------------------------------------------
      6  *
      7  * Copyright 2014 The Android Open Source Project
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  *//*!
     22  * \file
     23  * \brief Generic vetor
     24  *//*--------------------------------------------------------------------*/
     25 
     26 #include "rrDefs.hpp"
     27 #include "tcuVector.hpp"
     28 
     29 namespace rr
     30 {
     31 
     32 enum GenericVecType
     33 {
     34 	GENERICVECTYPE_FLOAT = 0,
     35 	GENERICVECTYPE_UINT32,
     36 	GENERICVECTYPE_INT32,
     37 
     38 	GENERICVECTYPE_LAST
     39 };
     40 
     41 /*--------------------------------------------------------------------*//*!
     42  * \brief Generic vertex attrib
     43  *
     44  * Generic vertex attributes hold 4 32-bit scalar values that can be accessed
     45  * as floating-point or integer values.
     46  *
     47  * Aliasing rules must be adhered when accessing data (ie. writing as float
     48  * and reading as int has undefined result).
     49  *//*--------------------------------------------------------------------*/
     50 class GenericVec4
     51 {
     52 private:
     53 	union
     54 	{
     55 		deUint32 uData[4];
     56 		deInt32  iData[4];
     57 		float    fData[4];
     58 	} v;
     59 
     60 public:
     61 	inline GenericVec4 (void)
     62 	{
     63 		v.iData[0] = 0;
     64 		v.iData[1] = 0;
     65 		v.iData[2] = 0;
     66 		v.iData[3] = 0;
     67 	}
     68 
     69 	template<typename ScalarType>
     70 	explicit GenericVec4 (const tcu::Vector<ScalarType, 4>& value)
     71 	{
     72 		*this = value;
     73 	}
     74 
     75 	GenericVec4& operator= (const GenericVec4& value)
     76 	{
     77 		v.iData[0] = value.v.iData[0];
     78 		v.iData[1] = value.v.iData[1];
     79 		v.iData[2] = value.v.iData[2];
     80 		v.iData[3] = value.v.iData[3];
     81 		return *this;
     82 	}
     83 
     84 	template<typename ScalarType>
     85 	GenericVec4& operator= (const tcu::Vector<ScalarType, 4>& value)
     86 	{
     87 		getAccess<ScalarType>()[0] = value[0];
     88 		getAccess<ScalarType>()[1] = value[1];
     89 		getAccess<ScalarType>()[2] = value[2];
     90 		getAccess<ScalarType>()[3] = value[3];
     91 		return *this;
     92 	}
     93 
     94 	template<typename ScalarType>
     95 	inline tcu::Vector<ScalarType, 4> get (void) const
     96 	{
     97 		return tcu::Vector<ScalarType, 4>(
     98 			getAccess<ScalarType>()[0],
     99 			getAccess<ScalarType>()[1],
    100 			getAccess<ScalarType>()[2],
    101 			getAccess<ScalarType>()[3]);
    102 	}
    103 
    104 	template<typename ScalarType>
    105 	inline ScalarType* getAccess ();
    106 
    107 	template<typename ScalarType>
    108 	inline const ScalarType* getAccess () const;
    109 } DE_WARN_UNUSED_TYPE;
    110 
    111 template<>
    112 inline float* GenericVec4::getAccess<float> ()
    113 {
    114 	return v.fData;
    115 }
    116 
    117 template<>
    118 inline const float* GenericVec4::getAccess<float> () const
    119 {
    120 	return v.fData;
    121 }
    122 
    123 template<>
    124 inline deUint32* GenericVec4::getAccess<deUint32> ()
    125 {
    126 	return v.uData;
    127 }
    128 
    129 template<>
    130 inline const deUint32* GenericVec4::getAccess<deUint32> () const
    131 {
    132 	return v.uData;
    133 }
    134 
    135 template<>
    136 inline deInt32* GenericVec4::getAccess<deInt32> ()
    137 {
    138 	return v.iData;
    139 }
    140 
    141 template<>
    142 inline const deInt32* GenericVec4::getAccess<deInt32> () const
    143 {
    144 	return v.iData;
    145 }
    146 
    147 } // rr
    148 
    149 #endif // _RRGENERICVECTOR_HPP