#ifndef _RSGVARIABLETYPE_HPP
|
#define _RSGVARIABLETYPE_HPP
|
/*-------------------------------------------------------------------------
|
* drawElements Quality Program Random Shader Generator
|
* ----------------------------------------------------
|
*
|
* 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 Variable Type class.
|
*//*--------------------------------------------------------------------*/
|
|
#include "rsgDefs.hpp"
|
|
#include <vector>
|
#include <string>
|
|
namespace rsg
|
{
|
|
class TokenStream;
|
|
class VariableType
|
{
|
public:
|
enum Type
|
{
|
TYPE_VOID = 0,
|
TYPE_FLOAT,
|
TYPE_INT,
|
TYPE_BOOL,
|
TYPE_STRUCT,
|
TYPE_ARRAY,
|
TYPE_SAMPLER_2D,
|
TYPE_SAMPLER_CUBE,
|
|
TYPE_LAST
|
};
|
|
enum Precision
|
{
|
PRECISION_NONE = 0,
|
PRECISION_LOW,
|
PRECISION_MEDIUM,
|
PRECISION_HIGH,
|
|
PRECISION_LAST
|
};
|
|
class Member
|
{
|
public:
|
Member (void)
|
: m_type(DE_NULL)
|
, m_name()
|
{
|
}
|
|
Member (const VariableType& type, const char* name)
|
: m_type(new VariableType(type))
|
, m_name(name)
|
{
|
}
|
|
~Member (void)
|
{
|
delete m_type;
|
}
|
|
Member (const Member& other)
|
: m_type(DE_NULL)
|
, m_name(other.m_name)
|
{
|
if (other.m_type)
|
m_type = new VariableType(*other.m_type);
|
}
|
|
Member& operator= (const Member& other)
|
{
|
if (this == &other)
|
return *this;
|
|
delete m_type;
|
|
m_type = DE_NULL;
|
m_name = other.m_name;
|
|
if (other.m_type)
|
m_type = new VariableType(*other.m_type);
|
|
return *this;
|
}
|
|
bool operator!= (const Member& other) const
|
{
|
if (m_name != other.m_name)
|
return true;
|
if (!!m_type != !!other.m_type)
|
return true;
|
if (m_type && *m_type != *other.m_type)
|
return true;
|
return false;
|
}
|
|
bool operator== (const Member& other) const
|
{
|
return !(*this != other);
|
}
|
|
const VariableType& getType (void) const { return *m_type; }
|
const char* getName (void) const { return m_name.c_str(); }
|
|
private:
|
VariableType* m_type;
|
std::string m_name;
|
};
|
|
VariableType (void);
|
VariableType (Type baseType, int numElements = 0);
|
VariableType (Type baseType, const VariableType& elementType, int numElements);
|
VariableType (Type baseType, const char* typeName);
|
~VariableType (void);
|
|
Type getBaseType (void) const { return m_baseType; }
|
Precision getPrecision (void) const { return m_precision; }
|
const char* getTypeName (void) const { return m_typeName.c_str(); }
|
int getNumElements (void) const { return m_numElements; }
|
const VariableType& getElementType (void) const;
|
|
const std::vector<Member>& getMembers (void) const { return m_members; }
|
std::vector<Member>& getMembers (void) { return m_members; }
|
|
int getScalarSize (void) const;
|
int getElementScalarOffset (int elementNdx) const;
|
int getMemberScalarOffset (int memberNdx) const;
|
|
bool operator!= (const VariableType& other) const;
|
bool operator== (const VariableType& other) const;
|
|
VariableType& operator= (const VariableType& other);
|
VariableType (const VariableType& other);
|
|
void tokenizeShortType (TokenStream& str) const;
|
|
bool isStruct (void) const { return m_baseType == TYPE_STRUCT; }
|
bool isArray (void) const { return m_baseType == TYPE_ARRAY; }
|
bool isFloatOrVec (void) const { return m_baseType == TYPE_FLOAT; }
|
bool isIntOrVec (void) const { return m_baseType == TYPE_INT; }
|
bool isBoolOrVec (void) const { return m_baseType == TYPE_BOOL; }
|
bool isSampler (void) const { return m_baseType == TYPE_SAMPLER_2D || m_baseType == TYPE_SAMPLER_CUBE; }
|
bool isVoid (void) const { return m_baseType == TYPE_VOID; }
|
|
static const VariableType& getScalarType (Type baseType);
|
|
private:
|
Type m_baseType;
|
Precision m_precision;
|
std::string m_typeName;
|
int m_numElements;
|
VariableType* m_elementType;
|
std::vector<Member> m_members;
|
};
|
|
inline VariableType::VariableType (void)
|
: m_baseType (TYPE_VOID)
|
, m_precision (PRECISION_NONE)
|
, m_typeName ()
|
, m_numElements (0)
|
, m_elementType (DE_NULL)
|
{
|
}
|
|
inline VariableType::VariableType (Type baseType, int numElements)
|
: m_baseType (baseType)
|
, m_precision (PRECISION_NONE)
|
, m_typeName ()
|
, m_numElements (numElements)
|
, m_elementType (DE_NULL)
|
{
|
DE_ASSERT(baseType != TYPE_ARRAY && baseType != TYPE_STRUCT);
|
}
|
|
inline VariableType::VariableType (Type baseType, const VariableType& elementType, int numElements)
|
: m_baseType (baseType)
|
, m_precision (PRECISION_NONE)
|
, m_typeName ()
|
, m_numElements (numElements)
|
, m_elementType (new VariableType(elementType))
|
{
|
DE_ASSERT(baseType == TYPE_ARRAY);
|
}
|
|
inline VariableType::VariableType (Type baseType, const char* typeName)
|
: m_baseType (baseType)
|
, m_precision (PRECISION_NONE)
|
, m_typeName (typeName)
|
, m_numElements (0)
|
, m_elementType (DE_NULL)
|
{
|
DE_ASSERT(baseType == TYPE_STRUCT);
|
}
|
|
inline VariableType::~VariableType (void)
|
{
|
delete m_elementType;
|
}
|
|
} // rsg
|
|
#endif // _RSGVARIABLETYPE_HPP
|